1、数值计算方法实验二本科实验报告 课程名称: 计算机数值方法B 实验项目: 线性方程组的直接解法 实验地点: 北区逸夫楼 302 专业班级: 学号: 学生姓名: 指导教师: 2013年 4 月 11日一、实验目的和要求 (1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。 (2)加深对线性方程组求解方法的认识,掌握算法。 (3)会进行误差分析,并能对不同方法进行比较。二、实验内容和原理合理利用Gauss消元法、LU分解法或追赶法求解下列方程组: (n=5,10,100,)三、主要仪器设备编译环境:C-Free 5.0 硬件基础:HP 6460b四、操作方法与实验步骤 高斯
2、分解法: 将原方程组化为三角形方阵的方程组: lik=aik/akk aij= aij- lik* akj k=1,2,n-1 i=k+1,k+2, ,n j=k+1,k+2, ,n+1 由回代过程求得原方程组的解: xn= ann+1/ ann xk=( akn+1-akj xj)/ akk (k=n-1,n-2, ,2,1) LU分解法: 将系数矩阵A转化为A=L*U, L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x. 追赶法: 用来求对角方程组;将系数矩阵A转化为A=L*U, L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l
3、*y=b,u*x=y,来求解x.五、实验数据记录和处理Gauss消元法:#include stdio.hdouble a1515,a01515;double b15,b015,l15;int n;void displayA() int i,j; printf(n); for( j=1;j=n;j+) for( i=1;i=n;i+) printf(a%d%d=%f ,j,i,aji); printf(b%d=%fn,j,bj); for(j=1;j=n;j+) printf(l%d=%f ,j,lj); printf(n);void main() FILE *f; int i,j,k; f=f
4、open(Gaussdata.txt,r); fscanf(f,%d,&n); for(i=1;i=n;i+) for(j=1;j=n;j+) fscanf(f,%lf,&aij); a0ij=aij; fscanf(f,%lf,&bi); b0i=bi; displayA();k=1; do for(i=1;i=n;i+) if(i=k) continue; li=a0ik/a0kk; for (j=k+1;j=n;j+) akj=a0kj/a0kk; bk=b0k/a0kk; for(i=1;i=n;i+) if(i=k) continue; for(j=k+1;j=n;j+) aij=a
5、0ij-li*a0kj; bi=b0i-li*b0k; displayA(); for(i=1;i=n;i+) for(j=k+1;j=n;j+) a0ij=aij; b0i=bi; if(k=n) break; k+; while(0); for(i=1;i=n;i+) printf(b%2d=%lfn,i,bi);LU分解法:#include #include #include #define N 4int main() float ANN,UNN,LNN,XN,YN,BN; float s=0; int i,j,k; printf(你好!欢迎你使用本系统!); printf(nn请输入将
6、要分解的矩阵:); for(i=0;iN;i+) /输入待分解的矩阵 for(j=0;jN;j+) scanf(%f,&Aij); printf(n以下输出待分解的矩阵,请确认无误。); for(i=0;iN;i+) /输出带分解矩阵 for(j=0;jN;j+) printf(%ft,Aij); putchar(n); for(i=0;iN;i+) /初始化 for(j=0;jN;j+) Lij=0; Uij=0; if(i=j) Lij=1; for(j=0;jN;j+) /求U矩阵第一行 U0j=A0j; for(i=1;iN;i+) Li0=Ai0/U00; /求L矩阵的第一列 for
7、(k=1;kN;k+) /用k记录化解的行列数,在行和列分解都完成时再进行下一行列的分解 for(j=k;jN;j+) /本循环将完成行分解的工作 for(int u=0;u=k-1;u+) s=s+Lku*Uuj; Ukj=Akj-s; s=0; /每行的和不一致,一行使用完后要置0 for(i=k+1;iN;i+) /在行分解完成后进行列分解 for(int l=0;l=k-1;l+) s=s+Lil*Ulk; Lik=(Aik-s)/Ukk; s=0; /每列的和不一致,一行使用完后要置0 printf(nLn); for(i=0;iN;i+) /输出L U for(j=0;jN;j+)
8、 printf(%ft,Lij); putchar(n); printf(nUn); for(i=0;iN;i+) for(j=0;jN;j+) printf(%ft,Uij); putchar(n); for(i=0;iN;i+) scanf(%f,&Bi); Y0=B0; /求Y for(k=1;kN;k+) for(j=0;jk;j+) s=s+Lkj*Yj; Yk=Bk-s; s=0; printf(nY:n); /输出Y for(i=0;i=0;k-) for(j=k+1;jN;j+) s=s+Ukj*Xj; Xk=(Yk-s)/Ukk; s=0; printf(nX:n); /输出
9、X for(i=0;iN;i+) printf(%ft,Xi); putchar(n); system(pause); return 0;追赶法: #include #include #include int main(void) float a15,b15,c15,d15; float t; int i,n; system(cls); printf(数值计算方法:追赶法求解方程组); printf(nn-WELCOME-); printf(n); printf(请输入 n= ); scanf(%d,&n); printf(n=n); printf(请输入 b1,c1,d1:n); scanf
10、(%f%f%f,&b1,&c1,&d1); printf(n=n); printf(从输入 从 2 到 n-1 :n); for(i=2;i=n-1;i+) scanf(%f%f%f%f,&ai,&bi,&ci,&di); printf(n=n); printf(请输入 an,bn,dn:n); scanf(%f%f%f,&an,&bn,&dn); c1=c1/b1; d1=d1/b1; for(i=2;i=1;i-) di=di-ci*di+1; printf(n=n); for(i=1;i=n;i+) putchar(n); printf(%f,di); system(pause); return 0; 六、实验结果与分析 Gauss消元法:LU分解法:追赶法:七、讨论、心得 (1)Gauss消元法的程序在编译过程中忽略了while(1)的错误,导致在运行的过程中出现了死循环,以后要注意。 程序运行时出现无内容情况: 是编译器问题,此程序无错误。 (2)LU分解法在编译成功后运行时弹出对话框无法关闭。 (3)不同的方法在求解方程组时时间有较大的差异,应结合具体问题选择不同的方法。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1