数值分析第四次实习报告.docx

上传人:b****5 文档编号:7194931 上传时间:2023-01-21 格式:DOCX 页数:20 大小:92.20KB
下载 相关 举报
数值分析第四次实习报告.docx_第1页
第1页 / 共20页
数值分析第四次实习报告.docx_第2页
第2页 / 共20页
数值分析第四次实习报告.docx_第3页
第3页 / 共20页
数值分析第四次实习报告.docx_第4页
第4页 / 共20页
数值分析第四次实习报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数值分析第四次实习报告.docx

《数值分析第四次实习报告.docx》由会员分享,可在线阅读,更多相关《数值分析第四次实习报告.docx(20页珍藏版)》请在冰豆网上搜索。

数值分析第四次实习报告.docx

数值分析第四次实习报告

 

学生学号

实验课成绩

 

武汉理工大学

学生实验报告书

 

实验课程名称:

数值分析(第四次实习)

开课名称:

计算机科学与技术学院

指导老师姓名:

熊盛武

学生姓名:

学生专业班级:

软件工程0803班

 

2009——2010学年第一学期

一、计算实习的内容:

实习1给定矩阵A与向量b

A=

b=

(1)求A的三角分解(不必输出);

(2)利用A的三角分解解下列方程组:

Ax=b

A2x=b

A3x=b

对第

题分析一下,如果先求M=A2,再解Mx=b,有何缺点?

实习2追赶法的优点

分别对n=5,100,300解下列方程组Ax=b

A=

b=

再用现有的三角分解法程序解此方程组,比较一下两者的效率,哪种方法机时少,可求解的矩阵阶数高?

实习3Jacobi迭代法与Gauss-Seidel迭代法的收敛性与收敛速度

研究用Jacobi迭代法与Gauss-Seide迭代法解下列方程组Ax=b的收敛性,通过上机计算,验证分析是否正确,并观察右端项对迭代收敛是否有影响,比较两法的收敛速度。

(1)A=

b1=

b2=

(2)A=

b1=

b2=

(3)A=

b=

实习4松弛因子对超松弛迭代法收敛速度的影响

编写一个超松弛迭代法解方程组Ax=b的计算机程序,其中

A=

b=

分别对不同的阶数(例如n=10,n=100)w=1.1,1.2,……,1.9进行迭代,记录近似解

时所用的迭代次数k,观察松弛因子对收敛速度的影响。

实习5用欧拉公式求解

二、计算实习:

(一)三角分解法程序源代码

#include

usingnamespacestd;

intmain()

{

constintMAX_N=20;

staticdoublea[MAX_N][MAX_N],b[MAX_N],x[MAX_N],y[MAX_N];

staticdoubleu[MAX_N][MAX_N],l[MAX_N][MAX_N];

inti,j,k,n,r;

cout<<"请输入矩阵阶数:

";

cin>>n;

if(n>MAX_N)

{

cout<<"TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N"<

return1;

}

if(n<=0)

{

cout<<"pleaseinputnbetween1and"<

return1;

}

//输入a[i][j],b[i]

cout<<"nowinputthematrixa[i][j],i,j=0..."<

";

for(i=0;i

{

for(j=0;j

cin>>a[i][j];

}

cout<<"nowinputthematrixb[i],i=0..."<

";

for(i=0;i

cin>>b[i];

//分解过程

for(i=0;i

l[i][i]=1;//l矩阵对角元素为1

for(k=0;k

{

for(j=0;j

{

u[k][j]=a[k][j];

for(r=0;r<=k-1;r++)

u[k][j]-=l[k][r]*u[r][j];

}

for(i=k+1;k

{l[i][k]=a[i][k];

for(r=0;r<=k-1;r++)

l[i][k]-=l[i][r]*u[r][k];

l[i][k]/=u[k][k];

}

}

//ly=b

for(i=0;i

{

y[i]=b[i];

for(j=0;j<=i-1;j++)

y[i]-=l[i][r]*y[j];

}

//ux=y

for(i=n-1;i>=0;i--)

{

x[i]=y[i];

for(j=i+1;j

x[i]-=u[i][j]*x[j];

x[i]/=u[i][i];

}

cout<<"方程组的解为:

";//输出x

for(i=0;i

cout<

return0;

}

(二)追赶法程序源代码

#include

usingnamespacestd;

intmain()

{

constintMAX_N=300;

inta[MAX_N],b[MAX_N],c[MAX_N],d[MAX_N];

floatl[MAX_N],r[MAX_N],y[MAX_N],x[MAX_N];

inti,n;

cout<<"请输入矩阵阶数:

";

cin>>n;

if(n>MAX_N)

{

cout<<"TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N"<

return1;

}

if(n<=0)

{

cout<<"pleaseinputnbetween1and"<

return1;

}

//输入a[n],b[n],c[n],d[n]

cout<<"nowinputthematrixa[n],n=2..."<

";

for(i=2;i<=n;i++)

cin>>a[i];

cout<<"nowinputthematrixb[n],n=1..."<

";

for(i=1;i<=n;i++)

cin>>b[i];

cout<<"nowinputthematrixc[n],n=1..."<

";

for(i=1;i

cin>>c[i];

cout<<"nowinputthematrixd[n],n=1..."<

";

for(i=1;i<=n;i++)

cin>>d[i];

//追的过程

r[0]=0;

y[0]=0;

a[1]=0;

c[n]=0;

for(i=1;i<=n;i++)

{

l[i]=b[i]-a[i]*r[i-1];

r[i]=c[i]/l[i];

y[i]=(d[i]-a[i]*y[i-1])/l[i];

}

//赶的过程

cout<

x[n]=y[n];

for(i=n-1;i>=1;i--)

{

x[i]=y[i]-r[i]*x[i+1];\

}

cout<<"方程组的解为:

";

for(i=1;i<=n;i++)

{

cout<

}

cout<

return0;

}

计算得解为:

-2-3-3-3-2

(三)雅可比迭代法和高斯赛德尔迭代法程序源代码

#include

#include

usingnamespacestd;

inta,b,m;

double*x0;

voidJacobi(double**c,double*d,intn,doubleeps);

voidGauss(double**c,double*d,intn,doubleeps);

voidmain()

{

intn;

double**A,*B;

doublee;

cout<<"请选择求方程组的迭代方法!

雅可比选0,高斯-赛德尔选1!

"<

cin>>n;

cout<<"输入方程组的变量的个数以及方程的个数!

"<

cin>>a>>b;

A=newdouble*[b];

for(inti=0;i

{

A[i]=newdouble[a];

}

B=newdouble[b];

x0=newdouble[a];

cout<<"输入每个方程组的变量的系数以及方程右端的值!

"<

for(intk=0;k

{

for(intj=0;j

{

cin>>A[k][j];

}

cin>>B[k];

}

cout<<"输入方程组迭代的次数及所要求的精度!

"<

cin>>m>>e;

cout<<"输入方程组迭代的初值!

"<

for(intj=0;j

{

cin>>x0[j];

}

switch(n)

{

case0:

Jacobi(A,B,m,e);

break;

case1:

Gauss(A,B,m,e);

break;

default:

cout<<"你没有选择求解方程组的一种方法!

!

"<

break;

}

}

voidJacobi(double**c,double*d,intn,doubleeps)

{

intk,i;

double*y=newdouble[a],*x=newdouble[a],s,temp=0.0;

k=1;

while

(1)

{

temp=0.0;

for(i=0;i

{

s=0.0;

for(intj=0;j

{

if(j!

=i)

{

s+=c[i][j]*x0[j];

}

}

s=(d[i]-s)/c[i][i];

y[i]=s;

if(fabs(x0[i]-s)>temp)

{

temp=fabs(x0[i]-s);

}

}

if(temp

{

cout<<"迭代成功!

迭代结果为:

"<

for(i=0;i

{

cout<<"y["<

}

break;

}

if(k==m)

{

cout<<"迭代失败!

!

"<

break;

}

k+=1;

for(i=0;i

{

x0[i]=y[i];

}

}

}

voidGauss(double**c,double*d,intn,doubleeps)

{

intk,i;

double*y=newdouble[a],*x=newdouble[a],s,temp=0.0;

for(i=0;i

{

x[i]=x0[i];

y[i]=x[i];

}

k=1;

while

(1)

{

temp=0.0;

for(i=0;i

{

s=0.0;

for(intj=0;j

{

if(j!

=i)

{

s+=c[i][j]*y[j];

}

}

s=(d[i]-s)/c[i][i];

y[i]=s;

if(fabs(x[i]-s)>temp)

{

temp=fabs(x[i]-s);

}

}

if(temp

{

cout<<"迭代成功!

迭代结果为:

"<

for(i=0;i

{

cout<<"y["<

}

break;

}

if(k==m)

{

cout<<"迭代失败!

!

"<

break;

}

k+=1;

for(i=0;i

{

x[i]=y[i];

}

}

}

 

用雅可比迭代法,程序运行结果如下:

用高斯赛德尔迭代法程序运行结果如下:

通过运行结果可以看出高斯赛德尔迭代法比雅可比迭代法所求结果精度高,收敛性好。

(四)超松弛迭代法程序源代码

#include

usingnamespacestd;

#include

#defineMAX_N20

#defineMAXREPT100

#defineepsilon0.00001

intmain()

{intn;

inti,j,k;

doubleerr,w;

staticdoublea[MAX_N][MAX_N],b[MAX_N][MAX_N],c[MAX_N],g[MAX_N];

staticdoublex[MAX_N],nx[MAX_N];

cout<<"inputnvalue(dimofAx=c):

";//输入方程的维数

cin>>n;

if(n>MAX_N)

{

cout<<"TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N"<

return1;

}

if(n<=0)

{

cout<<"pleaseinputnbetween1and"<

return1;

}

//输入a[i][j],c[i]

cout<<"nowinputthematrixa[i][j],i,j=0..."<

";

for(i=0;i

{

for(j=0;j

cin>>a[i][j];

}

cout<<"nowinputthematrixc[i],i=0..."<

";

for(i=0;i

cin>>c[i];

cout<<"nowinputthewvalue:

");

cin>>w;

if(w<=1||w>=2)

{

cout<<"wmustbetween1and2."<

return1;

}

for(i=0;i

for(j=0;j

{

b[i][j]=-a[i][j]/a[i][i];

g[i]=c[i]/a[i][i];//为了简化程序,假设a[i][i]!

=0

//否则要附加对a[i][i]的处理

}

for(i=0;j

{

for(j=0;j

nx[j]=g[j];

for(j=0;j

{

for(k=0;k

{

if(j==k)continue;

nx[j]+=b[j][k]*nx[k];//迭代

for(k=j+1;k

nx[j]+=b[j][k]*x[k];

nx[j]=(1-w)*x[j]+w*nx[j];

}

}

err=0;

for(j=0;j

if(err

for(j=0;j

x[j]=nx[j];

if(err

{

cout<<"thesolveare:

";

for(i=0;i

cout<

cout<

return0;

}

}

cout<<"after"<

return1;

}

=1.2时解为:

02321790.06620660.494194

=1.4时解为:

0232180.06620660.494194

=1.6时解为:

0232180.06620740.494193

由以上3组结果可知,

越小,精度越大

(五)欧拉公式程序源代码

#include

#include

#definef(x,y)(x+y)

intmain()

{

intm;

inti;

doublea,b,y0;

doublexn,yn,xn1,yn1,yn1b;

doubleh;

cout<<"inpiutthebeginandendofx:

";

cin>>a;

cin>>b;

cout<<"inputtheyvalue:

";

cin>>y0;

cout<<"inputmvalue:

";

cin>>m;

if(m<=0)

{

cout<<"pleaseinputanumberlagerthan1.";

return1;

}

h=(b-a)/m;

xn=a;yn=y0;

for(i=1;i<=m;i++)

{

xn1=xn+h;

yn1b=yn+h*f(xn,yn);

yn1=yn+h/2*(f(xn,yn)+f(xn1,yn1b));

cout<<"x"<

xn=xn1;yn=yn1;

}

return0;

}

调试结果:

x1=0.2y1=1.24

x2=0.4y2=1.5768

x3=0.6y3=2.031

x4=0.8y4=2.63067

x5=1y5=3.40542

第四次实验小结及体会

1、任何非奇异矩阵都可分解为三角形式。

2、如果需要重复地求解系数矩阵相同,而右端常数项不同的线性方程组时,三角分解法是很有效的

3、当系数矩阵是对角占优矩阵时,用追赶法求线性代数方程组是非常简单的。

4、高斯迭代法公式比较复杂,但在一般情况下比雅可比迭代法收敛快。

5、高斯迭代法是异步迭代法每次迭代时都会用到刚才已经迭代出来的数值,因此迭代对收敛情况有所改善。

6、迭代法是否收敛,与迭代矩阵密切相关,在用迭代法进行迭代计算时应先判断系数矩阵的谱半径的绝对值与1的大小关系,从而可以决定迭代法的收敛性。

7、超松弛迭代法的迭代矩阵与松弛因子w有关。

8、欧拉公式精度低但其数值解法给我们很好的启示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1