数值分析列主元高斯消去顺序高斯平方根法追赶法DOC.docx
- 文档编号:3865183
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:12
- 大小:43.78KB
数值分析列主元高斯消去顺序高斯平方根法追赶法DOC.docx
《数值分析列主元高斯消去顺序高斯平方根法追赶法DOC.docx》由会员分享,可在线阅读,更多相关《数值分析列主元高斯消去顺序高斯平方根法追赶法DOC.docx(12页珍藏版)》请在冰点文库上搜索。
数值分析列主元高斯消去顺序高斯平方根法追赶法DOC
课题名称:
课题一解线性方程组的直接方法
解决的问题:
给定三个不同类型的线性方程组,用适当的直接法求解。
采用的数值方法:
对第一个普通的线性方程组,采用了高斯顺序消去法和高斯列主元消去法。
对第二个正定线性方程组,采用了平方根法。
对第三个三对角线性方程组,采用了追赶法。
算法程序:
(1)普通的线性方程组
①顺序消去法
#include
#include
intmain(void)
{
floatA[10][10]={{4,2,-3,-1,2,1,0,0,0,0},
{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 { if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\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;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } printf("x[]=\n"); for(i=0;i printf("%f",x[i]); return0; } ②列主元消去法 #include #include intmain(void) { floatA[10][10]={{4,2,-3,-1,2,1,0,0,0,0}, {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; floatmax; intcol; intsize=10; for(k=0;k { max=fabs(A[k][k]); col=k; for(i=k;i { if(max { max=fabs(A[i][k]); col=i; } } for(j=k;j { temp=A[col][j]; A[col][j]=A[k][j]; A[k][j]=temp; } temp=b[col]; b[col]=b[k]; b[k]=temp; if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\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;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } printf("x[]=\n"); for(i=0;i printf("%f",x[i]); return0; } (2)对称正定线性方程组 平方根法: #include #include #definen8 intmain(void) { 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; for(k=0;k { 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]; for(i=k+1;i { q=0; for(m=0;m<=k-1;m++) { 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; for(m=0;m<=k-1;m++) { 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;k>=0;k--) { floatsum=0; for(m=k+1;m { sum=sum+A[m][k]*x[m]; } x[k]=(y[k]-sum)/A[k][k]; } for(sq=0;sq { printf("%f",x[sq]); } return0; } (3)三对角线性方程组 追赶法 #include #include #definen10 intmain(void) { 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; for(i=0;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]; //printf("%f\n",y[0]); for(i=1;i { y[i]=(b[i]-d[i]*y[i-1])/arf[i]; } //printf("%f\n",y[1]); x[n-1]=y[n-1]; for(i=n-2;i>=0;i--) { x[i]=y[i]-bt[i]*x[i+1]; } for(i=0;i printf("%lf",x[i]); return0; } 数值结果: (1)普通的线性方程组 ①顺序消去法 ②列主元消去法 (2)对称正定线性方程组 平方根法: (3)三对角线性方程组 追赶法: 对实验计算结果的讨论和分析: (1)普通的线性方程组 ①顺序消去法 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,消元过程就无法进行,如果它很小,也会导致它做除数的误差会增加,导致精度下降,因此在消元过程中选择绝对值较大的元素作为主元素是必要的。 这就是列主元消去法。 (2)对称正定线性方程组 平方根法: 误差为0,数值非常稳定。 平方根法适用于对称正定矩阵,将对称正定矩阵进行cholesky分解,A=GGT,原方程组等价于Gy=b.GTx=y.然后就能得到原方程组的解,计算量和存储量均减小了一般,这对于大矩阵来说是非常有利的。 (3)三对角线性方程组 追赶法: 追赶法误差也为0。 追赶法专门用来求解三对角方程组,当三对角矩阵A满足对角占优条件时,追赶法是数值稳定的。 追赶法具有计算程序简单,存贮少,计算量小的优点。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 列主元高斯 消去 顺序 平方根 追赶 DOC