实验四 线方程组的直接解法报告.docx
- 文档编号:24361463
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:15
- 大小:176.74KB
实验四 线方程组的直接解法报告.docx
《实验四 线方程组的直接解法报告.docx》由会员分享,可在线阅读,更多相关《实验四 线方程组的直接解法报告.docx(15页珍藏版)》请在冰豆网上搜索。
实验四线方程组的直接解法报告
实验四线方程组的直接解法
一、问题提出
给出下列几个不同类型的线性方程组,请用适当算法计算其解。
1、设线性方程组
2、设对称正定阵系数阵线方程组
3、三对角形线性方程组
二、要求
1、对上述三个方程组分别利用Gauss顺序消去法与Gauss列主元消去法;平方根法与改进平方根法;追赶法求解(选择其一);
2、应用结构程序设计编出通用程序;
3、比较计算结果,分析数值解误差的原因;
4、尽可能利用相应模块输出系数矩阵的三角分解式。
三、目的和意义
1、通过该课题的实验,体会模块化结构程序设计方法的优点;
2、运用所学的计算方法,解决各类线性方程组的直接算法;
3、提高分析和解决问题的能力,做到学以致用;
4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
四、实验学时:
2学时
五、实验步骤:
1.进入C或matlab开发环境;
2.根据实验内容和要求编写程序;
3.调试程序;
4.运行程序;
5.撰写报告,讨论分析实验结果.
解:
程序代码:
1.Gsuss列主元消去法
#include
#include
#include
usingnamespacestd;
intmain()
{
intn,i,j,k,m;
cout<<"输入维数:
";
cin>>n;
float**A=newdouble*[(n+1)];
for(i=1;i<=n;i++)
A[i]=newdouble[n+1];
float*b=newdouble[n+1];
float*x=newdouble[n+1];
floatl;
floattemp1,temp2,temp3;
cout<<"输入系数矩阵A[][]:
"< for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>A[i][j]; cout<<"输入向量b[]: "; for(i=1;i<=n;i++) cin>>b[i]; cout< for(k=1;k { temp1=abs(A[k][k]); m=k; for(i=k;i<=n;i++)//找最大值的列主元 { if(temp1 } if(temp1==0)cout<<"nouniquesolution! "< if(m! =k)//换行 { for(j=1;j<=n;j++) { temp2=A[k][j]; A[k][j]=A[m][j]; A[m][j]=temp2; } temp3=b[k]; b[k]=b[m]; b[m]=temp3; } for(i=k+1;i<=n;i++)//消元 { l=A[i][k]/A[k][k]; for(j=k+1;j<=n;j++) { A[i][j]=A[i][j]-l*A[k][j]; } b[i]=b[i]-l*b[k]; } } if(A[n][n]==0) { cout<<"nouniquesolution! "< } x[n]=b[n]/A[n][n];//回代求解 for(i=n-1;i>=1;i--) { floatsum=0; for(j=i+1;j<=10;j++) sum=sum+A[i][j]*x[j]; x[i]=(b[i]-sum)/A[i][i]; } cout<<"输出结果向量x[]: "< for(i=1;i<=10;i++)cout< system("pause"); return0; } 2.平方根法 #include #include #include usingnamespacestd; intmain() { intn,i,j,k,m; cout<<"输入维数: "; cin>>n; double**A=newdouble*[(n+1)]; for(i=1;i<=n;i++) A[i]=newdouble[n+1]; double*b=newdouble[n+1]; double*x=newdouble[n+1]; double*y=newdouble[n+1]; cout<<"输入系数对称正定矩阵A[][]: "< for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>A[i][j]; cout<<"输入向量b[]: "; for(i=1;i<=n;i++) cin>>b[i]; cout< for(k=1;k<=n;k++) { doublesum=0; for(m=1;m<=k-1;m++) { sum=sum+pow(A[k][m],2.0); } sum=A[k][k]-sum; A[k][k]=sqrt(sum); for(i=k+1;i<=n;i++) { doubletemp1=0; for(m=1;m<=k-1;m++) { temp1=temp1+A[i][m]*A[k][m]; } temp1=A[i][k]-temp1; A[i][k]=temp1/A[k][k]; } doubletemp2=0; for(m=1;m<=k-1;m++) { temp2=temp2+A[k][m]*y[m]; } y[k]=(b[k]-temp2)/A[k][k]; } x[8]=y[8]/A[8][8]; for(k=n-1;k>=1;k--) { doubletemp3=0; for(m=k+1;m<=n;m++) { temp3=temp3+A[m][k]*x[m]; } x[k]=(y[k]-temp3)/A[k][k]; } cout<<"输出结果向量x[]: "< for(i=1;i<=n;i++)cout< system("pause"); return0; } 3.追赶法 #include #include #include usingnamespacestd; intmain() { intn,i; cout<<"输入系数矩阵的维数: "; cin>>n; double*a=newdouble[n+1]; double*c=newdouble[n+1]; double*d=newdouble[n+1]; double*b=newdouble[n+1]; double*x=newdouble[n+1]; double*y=newdouble[n+1]; cout<<"输入系数矩阵A[]数据: "< for(i=1;i<=n;i++)cin>>a[i]; for(i=1;i<=n;i++)cin>>c[i]; for(i=1;i<=n;i++)cin>>d[i]; cout<<"输入b[]: "< for(i=1;i<=n;i++)cin>>b[i]; for(i=1;i<=n-1;i++) { c[i]=c[i]/a[i]; a[i+1]=a[i+1]-d[i+1]*c[i]; } cout<<"输出解向量a[]:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 线方程组的直接解法报告 实验 方程组 直接 解法 报告