高等教育东北大学数值分析实验报告.docx
- 文档编号:9243963
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:49
- 大小:535.45KB
高等教育东北大学数值分析实验报告.docx
《高等教育东北大学数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《高等教育东北大学数值分析实验报告.docx(49页珍藏版)》请在冰豆网上搜索。
高等教育东北大学数值分析实验报告
数值分析实验报告
课题一迭代格式的比较
一、问题提出
设方程
f(x)=x
-3x–1=0有三个实根x
=1.8793,x
=-0.34727,x
=-1.53209现采用下面三种不同计算格式,求f(x)=0的根x
或x
1、x=
2、x=
3、x=
二、要求
1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;
2、用事后误差估计
来控制迭代次数,并且打印出迭代的次数;
3、初始值的选取对迭代收敛有何影响;
4、分析迭代收敛和发散的原因。
三、目的和意义
1、通过实验进一步了解方程求根的算法;
2、认识选择计算格式的重要性;
3、掌握迭代算法和精度控制;
4、明确迭代收敛性与初值选取的关系。
程序代码:
#include
#include
intk=1,k1=1,k2=1,k3=1;
floatx1,x2,x3;
floatone(floatx0)
{
x1=(3*x0+1)/(x0*x0);
return(x1);
}
floattwo(floatx0)
{
x2=(pow(x0,3)-1)/3;
return(x2);
}
floatthree(floatx0)
{
x3=pow(3*x0+1,0.33333);
return(x3);
}
main()
{
floatx,x0;
printf("输入x0=");
scanf("%f",&x);
x0=x;
x1=one(x0);
printf("第一个公式迭代结果:
\n");
while(fabs(x0-x1)>1e-5)
{
printf("x1=%6.5f\n",x1);
x0=x1;
x1=one(x0);
k1++;
}
printf("x1=%6.5f\n",x1);
printf("k1=%i\n",k1);
x0=x;
x2=two(x0);
printf("第二个公式迭代结果:
\n");
while(fabs(x0-x2)>1e-5)
{
printf("x2=%6.5f\n",x2);
x0=x2;
x2=two(x0);
k2++;
}
printf("k2=%i\n",k2);
x0=x;
x3=three(x0);
printf("第三个公式迭代结果:
\n");
while(fabs(x0-x3)>1e-5)
{
printf("x3=%6.5f\n",x3);
x0=x3;
x3=three(x0);
k3++;
}
printf("x3=%6.5f\n",x3);
printf("k3=%i\n",k3);
scanf("%");
}
实验结果:
四、程序运行结果讨论和分析:
对于第一种迭代格式,收敛区间[-8.2-0.4],在该收敛区间内迭代收敛于-1.53209,只能求得方程的一个根;
对于第二种迭代格式,收敛区间[-1.51.8],在该收敛区间内迭代收敛于-0.34730,同样只能求得方程的一个根;
对于第三种迭代格式,收敛区间[-0.3+∞),在该收敛区间内迭代收敛于1.87937,只能求得方程的一个根;
由以上结果很容易发现,初值的选取对迭代敛散性有很大影响。
以第一种迭代格式为例,当初值大于等于-0.3时,迭代格式发散;当初值小于等于-8.3时,迭代格式也发散;只有初值在-0.3和-8.3之间时,迭代格式才收敛于—1.53209。
其他迭代格式也有这样的性质,即收敛于某个数值区间,超出这个区间迭代格式就是发散的,这就是所谓迭代格式的收敛性。
对于不同迭代格式在不同区间具有不同的敛散性的原因,我认为可以从一下两方面理解:
1、迭代法是一种逐次逼近法,其基本思想是将隐式方程归结为一组显式的计算公式,就是说,迭代过程实质上是个逐步显式化的过程。
2、我们可以用几何图像来更好地理解迭代过程。
由图可知,在某些区间选取的初始值随着迭代次数的增加会越来越逼近精确值,即收敛于精确值,而在另外一些区间选取的初始值随着迭代次数的增加却离精确值越来越远,即不会收敛于一个确定值。
课题二线性方程组的直接算法
一、问题提出
给出下列几个不同类型的线性方程组,请用适当算法计算其解。
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)
二、要求
1、对上述三个方程组分别利用Gauss顺序消去法与Gauss列主元消去法;平方根法与改进平方根法;追赶法求解(选择其一);
2、应用结构程序设计编出通用程序;
3、比较计算结果,分析数值解误差的原因;
4、尽可能利用相应模块输出系数矩阵的三角分解式。
三、目的和意义
1、通过该课题的实验,体会模块化结构程序设计方法的优点;
2、运用所学的计算方法,解决各类线性方程组的直接算法;
3、提高分析和解决问题的能力,做到学以致用;
4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
程序代码:
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[]数据:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高等教育 东北大学 数值 分析 实验 报告