西南交通大学数值分析上机实习Word文件下载.docx
《西南交通大学数值分析上机实习Word文件下载.docx》由会员分享,可在线阅读,更多相关《西南交通大学数值分析上机实习Word文件下载.docx(13页珍藏版)》请在冰点文库上搜索。
(2)求sinx=0的根。
初值x0分别取1,1.4,1.6,1.8,3进行计算。
分析其中遇到的现象与问题。
1.1计算结果
(1)方程可变形为x+
注:
x0为初始值,x为收敛解,N为迭代次数
牛顿法
x0
0.1
1
1.5
2
4
x
0.510973
N
5
6
40
牛顿—Steffensen加速法
无收敛解
3
8
(2)
1.4
1.6
1.8
3.14159
31.4159
6.28319
7
-3.14159
25.1327
1.2结果分析
从结果对比我们可发现牛顿—Steffensen加速法比牛顿法要收敛的快,牛顿法对于初值的选取特别重要,比如第
(1)问中的初值为4的情况,迭代次数算了40次,远大于其余初值的情况;
在第
(2)问中的初值为1.6的情况,收敛解得31.4159,分析其原因应该是
,x0=1.6
;
在牛顿—Steffensen加速法第
(1)问中x=1.5、第二问x=0和3的情况,无收敛解。
第二章Jacobi和Causs-Seidel迭代法比较
用雅格比法与高斯-赛德尔迭代法解下列方程组Ax=b,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。
(1)A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4];
b1=[-3,2,4]T,b2=[100,-200,345]T,
(2)A行分别为A1=[1,0,8,0.8],A2=[0.8,1,0.8],A3=[0.8,0.8,1];
b1=[3,2,1]T,b2=[5,0,-10]T,
(3)A行分别为A1=[1,3],A2=[-7,1];
b=[4,6]T,
2.1计算结果
(1)x0=[0,0,0]T为初始值,N为迭代次数,0.00001为误差精度,X为收敛解
Jacobi迭代
Causs-Seidel迭代
Ax=b1
X
[-0.727271,0.808083,0.252524]
[-0.727275,0.808082,0.252523]
20
12
Ax=b2
[36.3636,-2.0707,114.04]
[36.3636,-2.07071,114.04]
26
17
(2)
[5.76922,0.76922,-4.23075]
37
[36.6923,7.69229,-42.3077]
44
(3)
Ax=b
2.2结果分析
(1)第一小题的雅可比迭代矩阵为
0-0.33330.1667
-0.250000.5000
0.7500-0.25000
其特征值分别为-0.5427,0.2713+0.3708i,0.2713-0.3708i,经计算谱半径为
小于1,故方程组雅可比迭代收敛。
而高斯-赛德尔迭代矩阵为
00.08330.4583
0-0.27080.0104
其特征值为0,0.0469+0.3504i,0.0469-0.3504i经计算谱半径为
0.3535小于1,故原方程组高斯-赛德尔迭代矩阵收敛。
第二小题的雅可比迭代矩阵为
0-0.8000-0.8000
-0.80000-0.8000
-0.8000-0.80000
征值分别为-1.6,0.8,0.8,经计算谱半径为
1.6大于1,故方程组雅可比迭代发散。
00.6400-0.1600
00.12800.7680
其特征值为0,0.7040+0.1280i,0.704280i经计算谱半径为
0.7155小于1,故原方程组高斯-赛德尔迭代矩阵收敛。
第三小题的雅可比迭代矩阵为
0-3
70
其特征值分别为4.5826i,-4.5826i,谱半径为
4.5826大于1,故方程组雅可比迭代发散。
0-3
0-21
其特征值为0,-21,谱半径为
21大于1,故原方程组高斯-赛德尔迭代矩阵发散。
(2)从2.1中的结果列表中可以看到,Causs-Seidel迭代法比Jacobi迭代法收敛速度要快,并且方程组右端项对迭代收敛是无影响的。
第三章观察Runge-Kutta4阶算法稳定区间的作用
用Runge-Kutta4阶算法对初值问题y/=-20*y,y(0)=1按不同步长求解,用于观察稳定区间的作用,推荐两种步长h=0.1,0.2。
此方程的精确解为:
3.1计算结果
=1.0
h=0.1
h=0.2
1.69351
3125
1.6933
3.2结果分析
h=0.2时,
h=-4,而Runge-Kutta4阶算法的绝对稳定区间是[-2.78,0],故h=0.2时计算不稳定;
而h=0.1时,
h=-2,在绝对稳定区间内,计算稳定,结果可靠。
总结
通过这次上机练习,让我对数值分析所介绍的迭代求解方法及其理论有了更深层次的理解,了解了各种方法之间的优缺点,并且认识到了自己在以前的学习中所存在的问题,及时的修补了自己知识上的漏洞。
同时也提高了我在编写程序上的熟练程度,所以,我认为这次上机实习是非常有收获的,给予我学习数值分析的帮助也是非常大的。
附录
1.1第
(1)问牛顿法
#include<
iostream>
cmath>
usingnamespacestd;
intmain()
{
doublex,x0;
inti=0;
cout<
<
"
请输入初值:
;
cin>
>
x0;
do
{
x=x0;
x0=x0-(x0+sin(x0)-1)/(1+cos(x0));
i++;
}while(fabs(x-x0)>
=0.000001);
x="
x0<
endl;
N="
i<
return0;
}
1.2第
(1)问牛顿—Steffensen加速法
doublex,x0,x1,x2;
x1=x0-(sin(x0)+x0-1)/(cos(x0)+1);
x2=x1-(sin(x1)+x1-1)/(cos(x1)+1);
x0=x0-(x1-x0)*(x1-x0)/(x2-2*x1+x0);
1.3第
(2)问牛顿法
x0=x0-sin(x0)/cos(x0);
1.4第
(2)问牛顿—Steffensen加速法
x1=x0-sin(x0)/cos(x0);
x2=x1-sin(x1)/cos(x1);
2.1雅格比法
doublea[10][10],b[10],sum=0.0,x[10],y[10],c,s=0.0;
inti,k=0,n,j;
请输入维数:
n;
请输入数组A:
for(i=0;
i++)
for(j=0;
j<
j++)
cin>
a[i][j];
请输入数组B:
cin>
b[i];
请输入初始X:
x[i];
{for(i=0;
{for(j=0;
i;
sum=sum+a[i][j]*x[j];
for(j=i+1;
y[i]=(b[i]-sum)/a[i][i];
sum=0;
}
c=0;
if(c<
fabs(x[i]-y[i]))
c=fabs(x[i]-y[i]);
if(c>
0.00001)
c=0;
elses=1;
x[i]=y[i];
k++;
}while(s!
=1);
cout<
解为:
x[i]<
k<
2.2高斯-赛德尔迭代法
doublea[10][10],b[10],sum=0.0,x[10],y[10],c,s=0.0,z[10];
{for(i=1;
z[i]=x[i];
for(i=0;
x[i]=y[i];
fabs(z[i]-y[i]))
c=fabs(z[i]-y[i]);
z[i]=y[i];
doublex,y0=1,k1,k2,k3,k4,y,h,y1;
inti;
请输入x值:
x;
请输入步长:
h;
y1=exp((-20)*x);
(x/h);
y=y0;
k1=h*(-1)*20*y;
k2=h*(-1)*20*(y+k1/2);
k3=h*(-1)*20*(y+k2/2);
k4=h*(-1)*20*(y+k3);
y0=y0+(k1+2*k2+2*k3+k4)/6;
}
y="
y0<
y(x)="
y1<
误差="
fabs(y0-y1)<