数值分析列主元高斯消去顺序高斯平方根法追赶法DOCWord格式.docx
《数值分析列主元高斯消去顺序高斯平方根法追赶法DOCWord格式.docx》由会员分享,可在线阅读,更多相关《数值分析列主元高斯消去顺序高斯平方根法追赶法DOCWord格式.docx(12页珍藏版)》请在冰点文库上搜索。
{8,6,-5,-3,6,5,0,1,0,0},
{4,2,-2,-1,3,2,-1,0,3,1},
{0,-2,1,5,-1,3,-1,1,9,4},
{-4,2,6,-1,6,7,-3,3,2,3},
{8,6,-8,5,7,17,2,6,-3,5},
{0,2,-1,3,-4,2,5,3,0,1},
{16,10,-11,-9,17,34,2,-1,2,2},
{4,6,2,-7,13,9,2,0,12,4},
{0,0,-1,8,-3,-24,-8,6,3,-1}
};
floatb[10]={5,12,3,2,3,46,13,38,19,-21};
floatx[10]={0};
floatAik,S,temp;
inti,j,k;
intsize=10;
for(k=0;
k<
size-1;
k++)
{
if(!
A[k][k])
return-1;
for(i=k+1;
i<
size;
i++)
Aik=A[i][k]/A[k][k];
for(j=k;
j<
j++)
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
printf("
A[]\n"
);
for(i=0;
for(j=0;
%f"
A[i][j]);
\n"
b[]\n"
b[i]);
\n\n"
x[size-1]=b[size-1]/A[size-1][size-1];
for(k=size-2;
k>
=0;
k--)
S=b[k];
for(j=k+1;
S=S-A[k][j]*x[j];
x[k]=S/A[k][k];
x[]=\n"
x[i]);
return0;
}
②列主元消去法
floatmax;
intcol;
max=fabs(A[k][k]);
col=k;
for(i=k;
if(max<
fabs(A[i][k]))
max=fabs(A[i][k]);
col=i;
temp=A[col][j];
A[col][j]=A[k][j];
A[k][j]=temp;
temp=b[col];
b[col]=b[k];
b[k]=temp;
(2)对称正定线性方程组
平方根法:
#include<
#definen8
floatA[8][8]=
{4,2,-4,0,2,4,0,0},
{2,2,-1,-2,1,3,2,0},
{-4,-1,14,1,-8,-3,5,6},
{0,-2,1,6,-1,-4,-3,3},
{2,1,-8,-1,22,4,-10,-3},
{4,3,-3,-4,4,11,1,-4},
{0,2,5,-3,-10,1,14,2},
{0,0,6,3,-3,-4,2,19}
floatg[8][8]={0};
floatb[8]={0,-6,6,23,11,-22,-15,45};
floatx[8]={0};
floaty[8]={0};
intk,m,i,sq;
n;
floatp=0,q=0,s=0;
for(m=0;
m<
=k-1;
m++)
p=p+A[k][m]*A[k][m];
g[k][k]=sqrt(A[k][k]-p);
A[k][k]=g[k][k];
q=0;
q=q+A[i][m]*A[k][m];
g[i][k]=(A[i][k]-q)/A[k][k];
A[i][k]=g[i][k];
s=0;
s=s+A[k][m]*y[m];
y[k]=(b[k]-s)/A[k][k];
x[n-1]=y[n-1]/A[n-1][n-1];
for(k=n-2;
floatsum=0;
for(m=k+1;
sum=sum+A[m][k]*x[m];
x[k]=(y[k]-sum)/A[k][k];
for(sq=0;
sq<
sq++)
x[sq]);
(3)三对角线性方程组
追赶法
#definen10
floata[10]={4,4,4,4,4,4,4,4,4,4};
floatc[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
floatd[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
floatb[10]={7,5,-13,2,6,-12,14,-4,5,-5};
floatx[10]={0};
floaty[10]={0};
floatarf[10]={0};
floatbt[9]={0};
arf[0]=a[0];
inti;
i<
n-1;
i++)
bt[i]=c[i]/arf[i];
arf[i+1]=a[i+1]-d[i+1]*bt[i];
//printf("
%f%f\n"
bt[i],arf[i+1]);
y[0]=b[0]/arf[0];
%f\n"
y[0]);
for(i=1;
y[i]=(b[i]-d[i]*y[i-1])/arf[i];
y[1]);
x[n-1]=y[n-1];
for(i=n-2;
i>
i--)
x[i]=y[i]-bt[i]*x[i+1];
%lf"
数值结果:
追赶法:
对实验计算结果的讨论和分析:
x1~x10的绝对误差:
0.000001,-0.000001,0.000001,0,0.000001,0,0.000002,0,0,0
x1~x10的相对误差:
0.000001,0.000001,-1,0,0.0000005,0,0.00000067,0,0,0
误差很小,基本可以忽略。
高斯消去法由消元和回代两个过程组成。
消元过程就是将原增广矩阵[A,b]中矩阵A的部分约化为上三角矩阵,然后就可以进行回代过程,从最后一个方程开始,依次求出xn,xn-1一直到x1.到这里,顺序高斯消去法完成。
经过计算,列主元高斯消去法的误差也很小,它是高斯消去法的改进,因为顺序消去法的主元素如果等于0,消元过程就无法进行,如果它很小,也会导致它做除数的误差会增加,导致精度下降,因此在消元过程中选择绝对值较大的元素作为主元素是必要的。
这就是列主元消去法。
误差为0,数值非常稳定。
平方根法适用于对称正定矩阵,将对称正定矩阵进行cholesky分解,A=GGT,原方程组等价于Gy=b.GTx=y.然后就能得到原方程组的解,计算量和存储量均减小了一般,这对于大矩阵来说是非常有利的。
追赶法误差也为0。
追赶法专门用来求解三对角方程组,当三对角矩阵A满足对角占优条件时,追赶法是数值稳定的。
追赶法具有计算程序简单,存贮少,计算量小的优点。