1、LU分解法解线性方程组一 实验目的1.熟练运用已学计算方法求解方程组2.加深对计算方法技巧,选择正确的计算方法来求解各种方程组3.培养使用电子计算机进行科学计算和解决问题的能力二实验环境 VC+6.0 语言:C+三实验内容 编写一个解线性方程组的算法。算法包括:1. 矩阵的输入输出2. 判断矩阵是否奇异3. 进行分解4. 输出、5. 回带解出y、x四实验原理 1.若一个线性方程组系数矩阵为阶方阵且各阶顺序主子式均不为零,则的分解存在且唯一。 2.在满足1的条件下可推导得出以下公式 (1): (2): 3.公式(1)用于求解矩阵、,公式(2)用于回带求解y、x。从公式中可以看出:对角线上元素为1
2、,第一行与第一行相同。4. 分解的具体过程和计算顺序如下:(1)第一步分解:(2)第二步分解: (3)第三步分解: (n).第n步分解: 依次计算: 五.实验流程图1.程序总的流程图2.考虑主要目的这里只给出分解的流程图:六VC+源程序 #includeusing namespace std;double Fun(int n1,double a11111); /声明求矩阵行列式的递归函数函数double Fun(int n1,double a11111) int i_1,j_1,c; /c为数组b的行 double b1111; /用于存放余子式 int p=0,q=0; int sum=0;
3、 if(n1=1) return a111; for(i_1=1;i_1=n1;i_1+) for(c=1;c=n1-1;c+) if(ci_1) p=0; else p=1; for(j_1=1;j_1=n1-1;j_1+) bcj_1=a1c+pj_1+1; if(i_1-1)%2=0) q=1; else q=(-1); sum=sum+a1i_11*q*Fun(n1-1,b); return sum;/主程序,用于矩阵输入输出,判断,分解,回带void main() int n,i,j,k; double temp=1.0; double a1111=0; double L1111=0
4、; doubleU1111=0; double b11=1; double x11=1; double m=0.0; double y11=1; double temp1=0.0; double temp2=0.0; /完成系数矩阵与右端项的输入与输出 cout!请输入待解方程组未知数的个数: n n; cout!请输入待解方程组的系数endl; for(i=1;i=n;i+) for(int j=1;jaij; cout!请输入待解方程组的系数矩阵如下:endl; for(i=1;i=n;i+) for(j=1;j=n;j+) coutaij ; coutendl; cout!请输入待解方程
5、组的右端项endl; /初始化LU for(int p=1;p=n;p+) Lpp=1; for(p=1;p=n;p+) U1p=a1p; coutendl; for(i=1;ibi;coutb=endl;for(i=1;i=n;i+)coutbiendl;for(i=2;i=n;i+)temp=Fun(i,a);if(temp=0) coutendlendl;coutendloutput:temp =tempendl;cout矩阵奇异;break;coutendl;/LU分解if(temp!=0) for(i=1;i=n;i+) for(j=1;j=i-1;j+) if(ajj=0) cou
6、t请重新输入系数矩阵与右端项:endl; else m=0.0; for(k=1;k=j-1;k+) m=m+Lik*Ukj; Lij=(aij-m)/Ujj; for(j=1;j=i;j+) m=0.0; for(k=1;k=j-1;k+) m=m+Ljk*Uki; Uji = aji - m; if(temp!=0)coutL=endl; for(i=1;i=n;i+) for(j=1;j=n;j+) coutLij ; coutendlendl; coutendlendlU=endl; for(i=1;i=n;i+) for(j=1;j=n;j+) coutUij ; coutendle
7、ndl; /回带求解y couty=endl;for(int s=1;s=n;s+) for(int t=1;t=s-1;t+) temp1=temp1+Lst*yt; ys=bs-temp1; cout ys endl; temp1=0.0; cout=1;s-) for(int t=s+1;t=n;t+) temp2=temp2+Ust*xt; xs=(ys-temp2)/Uss; temp2=0.0; coutx=endl; for(i=1;i=n;i+) cout xiendl;七程序执行结果1.系数矩阵主子式有为0时,随便输入一个矩阵结果如下:2. 系数矩阵各阶主子式不为0时,输入课本70页习题12所示矩阵系数与右端项,顺序执行程序,结果经matlab验证无误,结果如下:验证:七实验优缺点 此算法可以一定程度上判断是否可解并解出其解,但由于未添加主元选取的步骤,导致对于有的方程组会判断失误并认为方程无解。八参考文献1.张军等编著.数值计算 .清华大学出版社2008年7月第一版2.罗建军等编著.C+程序设计教程(第二版).高等教育出版社2007年8月第二版3.施吉林 刘淑珍 陈桂芝.计算机数值方法M.北京:高等教育出版社,1999