高等教育东北大学数值分析实验报告Word文档下载推荐.docx
- 文档编号:22380049
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:49
- 大小:535.45KB
高等教育东北大学数值分析实验报告Word文档下载推荐.docx
《高等教育东北大学数值分析实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《高等教育东北大学数值分析实验报告Word文档下载推荐.docx(49页珍藏版)》请在冰豆网上搜索。
main()
floatx,x0;
printf("
输入x0="
);
scanf("
%f"
&
x);
x0=x;
x1=one(x0);
第一个公式迭代结果:
\n"
while(fabs(x0-x1)>
1e-5)
x1=%6.5f\n"
x1);
x0=x1;
x1=one(x0);
k1++;
x1=%6.5f\n"
k1=%i\n"
k1);
x0=x;
x2=two(x0);
printf("
第二个公式迭代结果:
while(fabs(x0-x2)>
x2=%6.5f\n"
x2);
x0=x2;
k2++;
k2=%i\n"
k2);
x3=three(x0);
第三个公式迭代结果:
while(fabs(x0-x3)>
x3=%6.5f\n"
x3);
x0=x3;
k3++;
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、设对称正定阵系数阵线方程组
=
=(1,-1,0,2,1,-1,0,2)
3、三对角形线性方程组
=
=(2,1,-3,0,1,-2,3,0,1,-1)
二、要求
1、对上述三个方程组分别利用Gauss顺序消去法与Gauss列主元消去法;
平方根法与改进平方根法;
追赶法求解(选择其一);
2、应用结构程序设计编出通用程序;
3、比较计算结果,分析数值解误差的原因;
4、尽可能利用相应模块输出系数矩阵的三角分解式。
1、通过该课题的实验,体会模块化结构程序设计方法的优点;
2、运用所学的计算方法,解决各类线性方程组的直接算法;
3、提高分析和解决问题的能力,做到学以致用;
4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
1.Gsuss列主元消去法
cmath>
cstdlib>
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;
输入系数矩阵A[][]:
endl;
for(j=1;
j<
j++)
cin>
A[i][j];
输入向量b[]:
cin>
b[i];
for(k=1;
k<
k++)
{
temp1=abs(A[k][k]);
m=k;
for(i=k;
i++)//找最大值的列主元
if(temp1<
abs(A[i][k])){temp1=abs(A[i][k]);
m=i;
}//m是确定的最列主元的行标
}
if(temp1==0)cout<
nouniquesolution!
exit(0);
if(m!
=k)//换行
{
for(j=1;
{
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++)//消元
l=A[i][k]/A[k][k];
for(j=k+1;
A[i][j]=A[i][j]-l*A[k][j];
b[i]=b[i]-l*b[k];
}
if(A[n][n]==0)
cout<
x[n]=b[n]/A[n][n];
//回代求解
for(i=n-1;
i>
=1;
i--)
floatsum=0;
for(j=i+1;
=10;
sum=sum+A[i][j]*x[j];
x[i]=(b[i]-sum)/A[i][i];
输出结果向量x[]:
i++)cout<
x[i]<
system("
pause"
return0;
2.平方根法
intmain()
intn,i,j,k,m;
double**A=newdouble*[(n+1)];
double*b=newdouble[n+1];
double*x=newdouble[n+1];
double*y=newdouble[n+1];
输入系数对称正定矩阵A[][]:
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);
doubletemp1=0;
for(m=1;
temp1=temp1+A[i][m]*A[k][m];
temp1=A[i][k]-temp1;
A[i][k]=temp1/A[k][k];
doubletemp2=0;
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>
k--)
doubletemp3=0;
for(m=k+1;
temp3=temp3+A[m][k]*x[m];
x[k]=(y[k]-temp3)/A[k][k];
3.追赶法
intn,i;
输入系数矩阵的维数:
double*a=newdouble[n+1];
double*c=newdouble[n+1];
double*d=newdouble[n+1];
输入系数矩阵A[]数据:
i++)cin>
a[i];
c[i];
d[i];
输入b[]:
=n-1;
c[i]=c[i]/a[i];
a[i+1]=a[i+1]-d[i+1]*c[i];
输出解向量a[]:
i++)cout<
a[i]<
输出解向量c[]:
c[i]<
y[1]=b[1]/a[1];
for(i=2;
y[i]=(b[i]-d[i]*y[i-1])/a[i];
输出解向量y[]:
y[i]<
x[n]=y[n];
x[i]=y[i]-c[i]*x[i+1];
输出解向量x[]:
四、程序运行结果分析
在方法的选择上存在一定的误差,可以选一些更准确的方法求解;
程序中对变量的类型设定,若设成double型,结果可以更精确;
计算机在做运算时,会根据需要对中间结果进行舍入,这也会对最终结果有影响;
课题三线性方程组的迭代法
1、设线性方程组
J迭代算法:
程序设计流程图:
源程序代码:
stdlib.h>
stdio.h>
voidmain()
floata[50][51],x1[50],x2[50],temp=0,fnum=0;
inti,j,m,n,e,bk=0;
使用Jacobi迭代法求解方程组:
\n"
输入方程组的元:
\nn="
%d"
n);
n+1;
x1[i]=0;
输入方程组的系数矩阵:
j=1;
while(j<
n+1)
a[i][j]);
j++;
输入方程组的常数项:
a[i][n+1]);
请输入迭代次数:
m);
请输入迭代精度:
e);
while(m!
=0)
for(j=1;
if(j!
=i)
temp=a[i][j]*x1[j]+temp;
x2[i]=(a[i][n+1]-temp)/a[i][i];
temp=0;
fnum=float(fabs(x1[i]-x2[i]));
if(fnum>
temp)temp=fnum;
if(temp<
=pow(10,-4))bk=1;
x1[i]=x2[i];
m--;
原方程组的解为:
if((x1[i]-x2[i])<
=e||(x2[i]-x1[i])<
=e)
printf("
x%d=%7.4f"
i,x1[i]);
运行结果:
2、设对称正定阵系数阵线方程组
GS迭代算法:
iostream.h>
constintm=11;
intchoice=1;
while(choice==1)
doublea[m][m],b[m],e,x[m],y[m],w,se,max;
intn,i,j,N,k;
Gauss-Seidol迭代法"
请输入方程的个数:
请输入第"
个方程的各项系数:
a[i][j];
请输入各个方程等号右边的常数项:
请输入最大迭代次数:
N;
请输入最大偏差:
e;
x[i]=0;
y[i]=x[i];
k=0;
while(k!
=N)
k++;
w=0;
if(j!
w=w+a[i][j]*y[j];
y[i]=(b[i]-w)/double(a[i][i]);
max=fabs(x[1]-y[1]);
se=fabs(x[i]-y[i]);
if(se>
max)
max=se;
if(max<
e)
{
x"
="
break;
x[i]=y[i];
if(k==N)
迭代失败!
!
choice=0;
3、三对角形线性方程组
SOR方法:
#include<
/**********定义全局变量**********/
float**a;
/*存放A矩阵*/
float*b;
/*存放b矩阵*/
float*x;
/*存放x矩阵*/
floatp;
/*精确度*/
floatw;
/*松弛因子*/
intn;
/*未知数个数*/
intc;
/*最大迭代次数*/
intk=1;
/*实际迭代次数*/
/**********SOR迭代法**********/
voidSOR(floatxk[])
inti,j;
floatt=0.0;
floattt=0.0;
float*xl;
xl=(float*)malloc(sizeof(float)*(n+1));
t=0.0;
tt=0.0;
i;
t=t+a[i][j]*xl[j];
for(j=i;
tt=tt+a[i][j]*xk[j];
xl[i]=xk[i]+w*(b[i]-t-tt)/a[i][i];
tt=fabs(xl[i]-xk[i]);
tt=tt*tt;
t+=tt;
t=sqrt(t);
xk[i]=xl[i];
if(k+1>
c)
if(t<
=p)
\nReachthegivenprecision!
else
\noverthemaximalcount!
\nCountnumberis%d\n"
k);
else
if(t>
p)
SOR(xk);
/**********程序*****开始**********/
SOR方法\n"
请输入方程个数:
a=(float**)malloc(sizeof(float)*(n+1));
for(i=0;
i++)
a[i]=(float*)malloc(sizeof(float)*(n+1));
请输入三对角矩阵:
for(i=1;
b=(float*)malloc(sizeof(float)*(n+1));
请输入等号右边的值:
b[i]);
x=(float*)malloc(sizeof(float)*(n+1));
请输入初始的x:
x[i]);
请输入精确度:
p);
sca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高等教育 东北大学 数值 分析 实验 报告