数值分析上机试题作业Word格式.docx
《数值分析上机试题作业Word格式.docx》由会员分享,可在线阅读,更多相关《数值分析上机试题作业Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
1)n=10时迭代次数8
1)n=20时迭代次数9
2.计算X()结果10
1)n=10时X()计算结果10
2)n=20时X()计算结果11
3.对比分析12
4.程序清单:
12
三.实习总结16
实验课题
(一)用雅格比法与高斯-赛德尔迭代法解方程组
一、用雅格比法与高斯-赛德尔迭代法解下列方程组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。
1、计算结果
1)雅格比法计算结果:
当A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4]时:
(1)当b1=[-3,2,4]T时
结果为:
-0.7282
0.8076
0.2548
迭代次数:
9
(2)当b2=[100,-200,345]T时
结果为:
36.3619
-2.0737
114.0417
15
当A行分别为A1=[1,0,8,0.8],A2=[0.8,1,0.8],A3=[0.8,0.8,1]时
(1)当b1=[3,2,1]T时
经程序计算(变换N值),雅克比法发散!
(2)当b2=[5,0,-10]T时
经试算(变换N值),雅克比法发散!
(3)结果为:
经试算(变换N值),雅克比法发散!
2)高斯-赛德尔迭代法计算结果
-0.7254
0.8086
0.2538
6
(2)当b2=[100,-200,345]T时
结果为:
36.3637
-2.0751
114.0415
11
(1)当b1=[3,2,1]T时
5.7854
0.7704
-4.2446
17
(2)当b2=[5,0,-10]T时
32.6912
7.7129
-42.3233
23
(3)当b=[4,6]T时
经试算(变换N值),高斯法发散!
2、结果分析
通过对雅克比法和高斯法的上机编程实习,分析对比实验结果可得:
在方程组Ax=b中,右端项对迭代收敛是有影响的,即当b增大时,迭代次数增加,收敛速度降低。
并且通过对比可知,在相同条件下,高斯-赛德尔迭代法比雅克比迭代法收敛速度快;
方法的选择也很重要,比如第二问,用雅克比迭代法是发散的,而用高斯迭代法则是收敛的。
通过上机验证,我们也得出结论:
理论分析是正确的,即当迭代矩阵的谱半径小于1时,迭代法是收敛的,而当迭代矩阵谱半径大于1的时,迭代法都是发散的。
3、程序清单
利用Matlab编程实现程序清单如下所示:
1)雅格比法:
function[output_args]=Untitled1(input_args)
%UNTITLED1Summaryofthisfunctiongoeshere
%Detailedexplanationgoeshere
clear;
A=[13;
-71];
B=[4;
6];
Err_user=0.01;
N=500;
[m,n]=size(A);
X=zeros(n,1);
k=1;
whilek<
=N;
Xk=X;
fori=1:
n
forj=1:
ifi~=j
AX(j)=A(i,j)*Xk(j);
end
Sum_AX=sum(AX);
AX=0;
X(i)=(B(i)-Sum_AX)/A(i,i);
E=max(abs(Xk-X));
ifE<
Err_user
break;
k=k+1;
end
disp(X);
%显示迭代结果
disp(k);
%显示迭代次数
2)高斯-赛德尔迭代法:
functiongauss(A,B)
N=1000;
=N
AX(j)=A(i,j)*X(j);
Er=max(abs(Xk-X));
ifEr<
=Err_user
实验课题
(二)松弛因子对SOR法收敛速度的影响
二、编写一个用SOR法解方程组
得计算机程序,其中
分别对不同的阶数(例如
)取
,进行迭代,记录近似解
达到
时所用的迭代次数
,观察松弛因子对收敛速度的影响。
并上机验证取
或
时会有什么结果?
1、迭代次数计算结果
(1)当n=10时,w=1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9所求的迭代次数结果如下:
(2)当n=20时,求其迭代次数方法如上,在此不一一列举,只写出当w=1.1,1.3,1.5,1.7,1.9时的迭代次数,计算结果如下:
2、计算x()结果
(1)当n=10,由于松弛因子较多,在此取松弛因子分别为1.1、1.3、1.5、1.7、1.9的情况下迭代后的x()的值,所求的x()的结果分别如下所示:
w=1.1w=1.3w=1.5
w=1.7w=1.9
(2)当n=20,由于松弛因子较多,在此取松弛因子分别为1.1、1.3、1.5、1.7、1.9的情况下迭代后的x()的值,所求的x()的结果分别如下所示
3、对比分析
通过对松弛法的上机编程实习,分析对比实验结果可得:
当松弛因子w为0或2时,不进行迭代,迭代次数结果直接为0,松弛法迭代不收敛。
当0<
w<
2时,松弛法迭代收敛,且当矩阵阶数一定时,若0<
1,松弛因子越大,收敛越快,称为低松弛;
若1<
2;
松弛因子越小,收敛越快,称为超松弛;
同时,对于相同的松弛因子,阶数越大时,迭代次数越多。
当w<
0或w>
2时,程序计算结果返回迭代次数,求得的x()的值显示为非数字,表明当w<
2时,松弛法迭代是不收敛的。
4、程序清单
利用VisualBasic.NET编程实现程序清单如下所示:
PublicFunctionSOR(ByVala(,)AsDouble,ByValb()AsDouble,ByValx0()AsDouble,ByValnAsInteger,ByValwAsDouble)AsInteger
'
此为松弛法的函数,对于任何形式的系数矩阵a(n,n)以及常数项矩阵b(n),调用此函数可求得迭代次数
'
a()为系数矩阵,b()为常数项矩阵b,x0()为x()初值,n为矩阵阶数,w为松弛因子,返回值为满足条件时的迭代次数k
Dimi,jAsInteger
DimkAsInteger=0'
k为迭代次数
Dimx(n)AsDouble'
x()
DimXI(n)AsDouble
DimerrAsDouble'
||||行范数,相邻两次迭代结果对应分量差值的绝对值
DimeAsDouble=0.000001'
误差限
DimItem1(n),Item2(n),Item3(n),Item4(n)AsDouble'
分别为教案公式3-15中的四项
Fori=0Ton
x(i)=x0(i)'
x0()为给x()赋初始值
Next
k=1
Whilek<
=10000'
设置最大迭代次数
err=0
XI(i)=x(i)
Item1(i)=(1-w)*x(i)
Item2(i)=w*b(i)/a(i,i)
Forj=0Toi-1
Item3(i)+=w*a(i,j)*x(j)/a(i,i)
Forj=i+1Ton
Item4(i)+=w*a(i,j)*x(j)/a(i,i)
x(i)=Item1(i)+Item2(i)-Item3(i)-Item4(i)
Item1(i)=0:
Item2(i)=0
Item3(i)=0:
Item4(i)=0'
Item(i)清零
Iferr<
Abs(XI(i)-x(i))Then
err=Abs(XI(i)-x(i))'
相邻两次迭代结果对应分量差值的绝对值
EndIf
eThen
Returnk'
满足条件(误差限),返回k
Else
k+=1'
不满足条件,继续进行迭代
EndWhile
EndFunction
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
此为主程序,通过输入不同的n,w值,调用松弛法函数,求得迭代次数K
DimnAsInteger'
矩阵阶数
DimwAsDouble'
松弛因子
n=Val(TextBox1.Text)-1'
通过TextBox输入矩阵阶数
w=Val(TextBox2.Text)'
输入TextBox松弛因子
Dima(n,n)AsDouble'
系数矩阵
Dimb(n)AsDouble'
常数项矩阵
Dimx0(n)AsDouble'
矩阵x()的初始值
DimMAsInteger'
所求迭代次数
////给系数矩阵a(n,n)赋值
Fori=1Ton-1
a(0,0)=-4
a(0,1)=1
a(n,n)=-4
a(n,n-1)=1
a(i,i)=-4
a(i,i-1)=1
a(i,i+1)=1
////给常数矩阵b(n)赋值
b(0)=-3
b(n)=-3
b(i)=-2
////给矩阵x0(n)赋值为0
x0(i)=0
////前面完成对SOR函数中5个参数(a(),b(),x0(),n,w)进行赋值
M=SOR(a,b,x0,n,w)'
////////调用SOR函数,求迭代次数k
TextBox3.Text=CStr(M)'
在TextBox显示所求迭代次数k
Console.Read()'
在控制台上输入X()的结果
EndSub
三.实习总结:
1.本次上机实习让我从实践的角度更为深入地掌握了数值分析算法中的雅格比法、高斯—塞德尔迭代法以及解方程组中松弛因子对SOR法收敛速度的影响。
如果说老师上课是教给我们算法,那么这次上机实习则是将老师讲授的这些算法真正变成自己的东西。
在老师讲课的时候,我对于这些算法中涉及的迭代流程并没有一个连贯的理解,总觉得中间有些接不上,通过这次实习中一步步的编码实现,让我把中间断开的部分衔接上了,对这些算法的实现过程有了清晰的思路。
2.除了每题中的核心算法,这次实习还涉及到了数值分析中一些比较通用的算法,例如求迭代矩阵谱半径、高斯—塞德尔迭代法中的求逆阵等,编码实现这些算法不仅能够回顾数值分析中的一些基本内容,还能够通过与核心算法的结合达到知识融会贯通的效果。
3.本次上机实习中除了上述算法思路的掌握,还进一步学习了VisualBasic.Net、Matlab等开发语言,并涉及程序代码效率的部分,力求通过编写出正确又高效的算法。
通过此次实习,我对VisualBasic.NET语言进行了深入的学习,基本掌握了本门语言的编程方法,为以后的科学研究打下了坚实的基础。