高斯列主元消元法解线性方程组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高斯列主元消元法解线性方程组
一、题目:用Gauss 列主元消去法解线性方程组Ax b =,其中,
A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭ 0.230 -52.322 54.000 240.236 29.304 -117.818b ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭
T X=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)
二、原理及步骤分析
设
n
n ij R a A ⨯∈=][)1(,n
n R
b b b b ∈=],,,[)1()2(2)1(1 。若约化主元素
),,2,1(0)(n k a k kk =≠,则通过高斯消元法将方程b AX =约化为三角形方程组求解。 如果在消元过程中发现某个约化主元0)
(=k kk a , 则第K 次消元就无法进行。此外,即
使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。
为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。相应过程为:
(1)选主元:在子块的第一列中选择一个元)
(k k i k a 使)
(max k ik n
i k k
k i a a k ≤≤=
并将第k 行元与第k i 行元互换。 (2)消元计算:对k=1,2,……n-1依次计算
()()()⎪⎪
⎪⎩
⎪⎪⎪⎨⎧++=-=++=-=++==++n k k i b m b b n k k j i a m a a n k k i a a m k k ik k i k i k kj
ik k ij k ij k kk
k ik
k ik ,,2,1,,2,1,,,2,1)
()()1()
()()1()()
()( (3)回代求解
⎪⎪⎪⎩
⎪⎪⎪⎨⎧⎪⎪⎭⎫ ⎝⎛-==∑+=)
(1)
()()()
(i ii n i j j i ij i i
i n nn
n n
n a x a b x a b x
()1,,2,1 --=n n i
三. 流程图
四、源程序
高斯列主元消元法程序
#include<>
#include<>
#define N 6
main()
{
float A[N][N+1]={{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,}}, total,x[6];
int i,j,k,m,n;
printf("方程的增广矩阵:\n");
for(i=0;i { for(j=0;j printf(" % ",A[i][j]); printf("\n"); } for(j=0;j { k=j; /*最大行号赋给k*/ for(i=j+1;i { if(fabs(A[i][j])>fabs(A[k][j])) k=i; } if(k==j) for(i=j+1;i for(m=j+1;m { A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j]; } else { for(n=0;n { A[N][n]=A[k][n]; /*换行 */ A[k][n]=A[j][n]; A[j][n]=A[N][n]; } for(i=j+1;i for(m=j+1;m { A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j]; } } } printf("消元後的结果:\n"); for(i=0;i { for(j=0;j printf(" % ",A[i][j]); printf("\n"); } x[N-1]=A[N-1][N]/A[N-1][N-1]; for(i=N-2;i>=0;i--) { total=A[i][N]; for(j=N-1;j>i;j--) total=total-x[j]*A[i][j]; x[i]=total/A[i][i]; } printf("方程的解:\n"); for(i=0;i printf("x1=%f\n",x[i]); } 五、结果显示