C语言课程设计5.docx
- 文档编号:27265317
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:28
- 大小:321.97KB
C语言课程设计5.docx
《C语言课程设计5.docx》由会员分享,可在线阅读,更多相关《C语言课程设计5.docx(28页珍藏版)》请在冰豆网上搜索。
C语言课程设计5
数值分析上机
实验报告
姓名
闫三木
学号
20093514
班级
软件工程0908
指导教师
邵新慧
实验名称
曲线拟合最小二乘法线性方程组迭代法
开设学期
2010–2011第二学期
评定成绩
评定人签字
评定日期
东北大学软件
2011年
课题三解线性方程组的迭代法
一.实验内容
1、设线性方程组
=
x
=(1,-1,0,1,2,0,3,1,-1,2)
2、设对称正定阵系数阵线方程组
=
x
=(1,-1,0,2,1,-1,0,2)
3、三对角形线性方程组
=
x
=(2,1,-3,0,1,-2,3,0,1,-1)
试分别选用Jacobi迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
二.实验要求
1、体会迭代法求解线性方程组,并能与消去法做以比较;
2、分别对不同精度要求,由迭代次数体会该迭代法的收敛快慢;
3、对方程组2,3使用SOR方法时,选取松弛因子
=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
三.目的和意义
1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;
2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;
3、体会上机计算时,终止步骤
<
或k>(予给的迭代次数),对迭代法敛散性的意义;
4、体会初始解x
,松弛因子的选取,对计算结果的影响。
四.流程图设计
1.主要部分流程
2.Jacobi算法流程
3.GS算法流程图
4.SOR算法流程
五.结构程序设计
#include
usingnamespacestd;
#defineN40
constintn=10;
intjacobi(float*p,floatb[],floatX[],floatx[],intn);
intGS(float*p,floatb[],floatX[],floatx[],intn);
intSOR(float*p,floatb[],floatX[],floatx[],intn);
voidprint(float*a,intr);
voidmain()
{
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,1,9,4,
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};
floata[10]={7,5,-13,2,6,-12,14,-4,5,-5};
floatX1[10]={0,0,0,0,0,0,0,0,0,0};
floatx1[10];
floatB[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};
floatb[8]={0,-6,6,23,11,-22,-15,45};
floatX2[8]={0,0,0,0,0,0,0,0};
floatx2[8];
floatC[10][10]={4,-1,0,0,0,0,0,0,0,0,
-1,4,-1,0,0,0,0,0,0,0,
0,-1,4,-1,0,0,0,0,0,0,
0,0,-1,4,-1,0,0,0,0,0,
0,0,0,-1,4,-1,0,0,0,0,
0,0,0,0,-1,4,-1,0,0,0,
0,0,0,0,0,-1,4,-1,0,0,
0,0,0,0,0,0,-1,4,-1,0,
0,0,0,0,0,0,0,-1,4,-1,
0,0,0,0,0,0,0,0,-1,4};
floatc[10]={7,5,-13,2,6,-12,14,-4,5,-5};
floatx3[10];
floatX3[10]={0,0,0,0,0,0,0,0,0,0};
float*p[3];
p[0]=&A[0][0];
p[1]=&B[0][0];
p[2]=&C[0][0];
cout<<"Jacobi迭代法解第1个方程:
"< jacobi(p[0],a,X1,x1,10); cout<<"Jacobi迭代法解第2个方程: "< jacobi(p[1],b,X2,x2,8); cout<<"Jacobi迭代法解第3个方程: "< jacobi(p[2],c,X3,x3,10); cout<<"Gauss-Seidel迭代法解第1个方程: "< GS(p[0],a,X1,x1,10); cout<<"Gauss-Seidel迭代法解第2个方程: "< GS(p[1],b,X2,x2,8); cout<<"Gauss-Seidel迭代法解第3个方程: "< GS(p[2],c,X3,x3,10); cout<<"SOR迭代法解第1个方程: "< SOR(p[0],a,X1,x1,10); cout<<"SOR迭代法解第2个方程: "< SOR(p[1],b,X2,x2,8); cout<<"SOR迭代法解第3个方程: "< SOR(p[2],c,X3,x3,10); } intjacobi(float*p,floatb[],floatX[],floatx[],intn) { intk,i,j; floatm,R,r,e; cout<<"请输入精度e: "; cin>>e; for(k=0;k { R=0; for(i=0;i { m=0; for(j=0;j { m=m+(*(p+i*n+j))*X[j]; } x[i]=X[i]+(b[i]-m)/(*(p+i*n+i)); r=x[i]-X[i]; if(r<0) r=X[i]-x[i]; if(r>R) R=r; } if(R<=e&&R>0) { print(x,n); cout<<"迭代次数为: "< returnk; } for(j=0;j<10;j++) X[j]=x[j]; } print(x,n); cout<<"迭代次数为: "< cout<<"方程解发散,无法用Jacobi方法解此方程! "< return0; } intGS(float*p,floatb[],floatX[],floatx[],intn) { inti,j,k; floatt,R,r,e; cout<<"请输入精度e: "; cin>>e; for(k=0;k { for(i=0;i { t=0; for(j=0;j { if(j t+=(*(p+i*n+j))*x[j]; if(j>i) t+=(*(p+i*n+j))*X[j]; } x[i]=(b[i]-t)/(*(p+i*n+i)); } for(i=0;i<10;i++) { r=x[i]-X[i]; if(r<0) r=X[i]-x[i]; if(r>R) R=r; } if(R<=e&&R>0) { print(x,n); cout<<"迭代次数为: "< returnk; } for(j=0;j<8;j++) X[j]=x[j]; } print(x,n); cout<<"迭代次数为: "< cout<<"方程解发散,无法用Gauss-Seidel方法解此方程! "< return0; } intSOR(float*p,floatb[],floatX[],floatx[],intn) { inti,j,k; floatt,R,r,e,w; cout<<"请输入松弛因子w(0 "; cin>>w; cout<<"请输入精度e: "; cin>>e; for(i=0;i x[i]=X[i]; for(k=0;k { R=0; for(i=0;i { t=0; for(j=0;j t+=(*(p+i*n+j))*x[j]; r=w*(b[i]-t)/(*(p+i*n+i)); x[i]+=r; if(r<0) r=-r; if(r>R) R=r; } if(R<=e&&R>0) { print(x,n); cout<<"迭代次数: "< returnk; } } print(x,n); cout<<"迭代次数: "< cout<<"方程解发散,无法使用SOR方法解此方程! ! ! ! "< return0; } voidprint(float*a,intn) { intj; float*t=a; cout<<"x=("; for(j=0;j cout<<*(t+j)<<","; cout<<*(t+j)<<")"< } 六.结果讨论和分析 程序运行截图: 七.小结和体会 通过这次实验,我对线性方程组的迭代算法有了更深的理解。 迭代算法给计算机解决问题提供了有效的途径。 使得一些人为难以计算出来的复杂线性方程组通过迭代算法交由计算机来进行计算。 同时我也发现了,J,GS和SOR迭代方法各自的特点,对课堂学习的知识有了更好的理解和认识。 课题八曲线拟合的最小二乘法 一.实验内容 利用数据拟合的最小二乘法从一组数据中找出其规律性,并给出其数学模型的近似表达式。 问题提出: 在某冶炼过程中,通过实验检测得到含碳量与时间关系的数据如下,求含碳量y与时间t内关系的拟合曲线。 t 0 5 10 15 20 25 30 35 40 45 50 y 0 1.27 2.16 2.86 3.44 3.87 4.15 4.37 4.51 4.58 4.02 用最小二乘法进行三次多项式的曲线拟合,并计算均方误差 二.实验要求 1.用最小二乘法进行三次多项式的曲线拟合; 2.计算yj与y(tj)的误差;j=1,2,3…. 3.另外选取一个拟合函数,进行拟合效果的比较; 4.绘制出曲线拟合的图形。 三.目的和意义 1.掌握最小二乘法应用方法 2.理解最小二乘法进行曲线拟合的意义 四.结构程序设计 #include #include #include usingnamespacestd; #definedeviation0.0000000001 #defineN20 classfit { protected: intm,n; double*a,*x,*y; doubledt; public: //构造函数 fit(intm,intn) { this->m=m; this->n=n; dt=0; x=newdouble[m];//一共有m个数据点,数据点的x值 y=newdouble[m]; a=newdouble[n+1]; } voidinput(); //进行最小二乘曲线拟合 voidfitting(); doublevalue(double,int); double*equation(double**,double*); voiddeviat(); voidoutput(); }; //从文件读入数据 voidfit: : input() { inti; charfileName[20];//保存文件名 //提示用户输入用户名n cout<<"*********请输入数据文件名称: *********\n"; cin>>fileName; //从文件读取数据点 ifstreamfin(fileName); if(! fin) { cout<<"不能正常打开文件"< exit (1); } for(i=0;i { fin>>x[i]; fin>>y[i]; } fin.close();//关闭文件流 } //进行最小二乘曲线拟合 voidfit: : fitting() { double*vy=newdouble[m+1]; double*f=newdouble[n+1]; inti,j,k; double**vx=newdouble*[n+1]; double**coe=newdouble*[n+1]; for(i=0;i<=n;i++) { vx[i]=newdouble[m+1]; coe[i]=newdouble[n+1]; } for(i=0;i<=n;i++) { for(j=0;j { vx[i][j]=value(x[j],i); } } for(j=0;j { vy[j]=y[j]; } //计算方程组的系数矩阵 for(i=0;i<=n;i++) { for(j=0;j<=n;j++) { coe[i][j]=0; for(k=0;k { coe[i][j]+=vx[i][k]*vx[j][k]; } } } for(i=0;i<=n;i++) { f[i]=0; for(j=0;j { f[i]+=vx[i][j]*vy[j]; } } //解正则方程组,并将结果存储到数组a中 a=equation(coe,f); //计算均方误差,并将结果存储到统计变量dt中 deviat(); } //计算基函数的函数值 doublefit: : value(doublex,intm) { doubleresult=1; for(inti=0;i { result*=x; } returnresult; } double*fit: : equation(double**coe,double*b) { double*tx=newdouble[n+1]; longdoubler,r1; intw=1.5; inti,j,k; //初始化初始解 for(i=0;i<=n;i++) { tx[i]=0; } for(k=0;k { r=0; for(i=0;i<=n;i++) { //计算误差 r1=b[i]; for(j=0;j<=n;j++) { r1-=coe[i][j]*tx[j]; } r1/=coe[i][i]; r1*=w; //取最大误差 if(fabs(r1)>fabs(r)) { r=r1; } tx[i]+=r1; } //如果达到精度要求,则结束迭代 if(fabs(r)<=deviation) { break; } } //返回计算结果 returntx; } //计算误差 voidfit: : deviat() { double*funcValue=newdouble[m]; doublesum=0; inti,j; for(j=0;j { funcValue[j]=0; for(i=0;i<=n;i++) { funcValue[j]+=a[i]*value(x[j],i); } sum+=(y[j]-funcValue[j])*(y[j]-funcValue[j]); } this->dt=sqrt(sum); } //输出最终拟合结果,并保存到指定文件 voidfit: : output() { inti; //输出各项系数 cout<<"*********拟合函数的各项系数为(按各项次数从小到大排列):
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计