还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数值分析上机实践报告班级计算机1002姓名陈斯琪学号20102686课题三A.实验题目线性方程组的迭代法B.实验要求
(1)应用迭代法求解线性方程组,并与直接法作比较;
(2)分别对不同精度要求,如,利用所需迭代次数体会该迭代法的收敛快慢;
(3)对方程组
(2),
(3)使用SOR方法时,选取松弛因子=
0.
80.
911.
11.2等,试观察对算法收敛性的影响,并找出你所选用松弛因子的最佳值;
(4)编制出各种迭代法的程序并给出计算结果C.目的和意义
(1)通过上机了解迭代法求解线性方程组的特点;掌握求解线性方程组的各类迭代法;
(2)体会上机计算时,终止准则‖X^k+1-X^k‖∞ε,对控制迭代精度的有效性;
(3)体会初始值和松弛因子的选择,对迭代收敛速度的影响D.实验方程组
(1)线性方程组=精确解.2对称正定线性方程组精确解.
(3)三对角线性方程组精确解.E.实验程序代码及截图
(1)应用Jacobi迭代法求解方程组代码如下#includeiostream.h#include__th.h#defineN10//十阶矩阵staticdoubleA[N][N]={42-3-121000086-5-365010042-2-132-10310-215-13-1194-426-167-332386-8571726-3502-13-4253011610-11-917342-122462-71392012400-18-3-24-863-1};//方程组左侧系数矩阵staticdoubleB[N]={51232346133819-21};//右侧值staticdoubleY[N];//输出比较项staticdoubleY[N];staticdoubleX[N];//输出项staticdoubleG[N];//X=BX+G的G矩阵intijk;//计数器doubleeps;intM=100;booldistan__{//求两输出项的差的范数是否满足精度要求doubletemp=0;fori=0;iN;i++{temp=temp+fabsX[i]-Y[i];}iftempepsreturnfalse;elsereturntrue;//满足精度要求则结束程序}void__in{cout最大迭代次数为100次endl;cout你希望的精度是多少?endl;couteps=;cineps;//形成迭代矩阵B,存放到A中fori=0;iN;i++{iffabsA[i][i]eps{cout打印失败endl;return;}doubleT=A[i][i];forj=0;jN;j++{A[i][j]=-A[i][j]/T;}A[i][i]=0;G[i]=B[i]/T;}intcounter=0;whilecounterM{//迭代fori=0;iN;i++{doubletemp=0;forj=0;jN;j++{temp=temp+A[i][j]*Y[j];}X[i]=G[i]+temp;}ifdistan__==truebreak;else{//交换X,Y向量;fori=0;iN;i++{Y[i]=X[i];}}counter++;}//打印Xcout迭代次数为counter次该线性方程组的解(X1,X2,X
3......X10)为endl;coutX1=X
[1]endl;coutX2=X
[2]endl;coutX3=X
[3]endl;coutX4=X
[4]endl;coutX5=X
[5]endl;coutX6=X
[6]endl;coutX7=X
[7]endl;coutX8=X
[8]endl;coutX9=X
[9]endl;coutX10=X
[10]endl;}截图如下
①eps=
0.001
②eps=
0.0001
③eps=
0.00001
(2)应用Gauss-Seidel求解线性方程组代码如下#includeiostream.h#include__th.h#defineN10//矩阵的维数,可按需更改staticdoubleA
[10]
[10]={42-3-121000086-5-365010042-2-132-10310-215-13-1194-426-167-332386-8571726-3502-13-4253011610-11-917342-122462-71392012400-18-3-24-863-1};staticdoubleB
[10]={51232346133819-21};//右侧值staticdoubleY[N];//输出比较项staticdoubleX[N];//输出项staticdoubleG[N];//X=BX+G的G矩阵intijk;//计数器doubleeps;intM=100;booldistan__{//求两输出项的差的范数是否满足精度要求doubletemp=0;fori=0;iN;i++{temp=temp+fabsX[i]-Y[i];}iftempepsreturnfalse;elsereturntrue;//满足精度要求则结束程序}void__in{cout最大迭代次数为100次endl;cout你希望精度是多少?endl;couteps=;cineps;//形成迭代矩阵B,存放到A中fori=0;iN;i++{iffabsA[i][i]eps{cout打印失败endl;return;}doubleT=A[i][i];forj=0;jN;j++{A[i][j]=-A[i][j]/T;}A[i][i]=0;G[i]=B[i]/T;}intcounter=0;whilecounterM{//迭代fori=0;iN;i++{doubletemp=0;forj=0;jN;j++{temp=temp+A[i][j]*X[j];}X[i]=G[i]+temp;}ifdistan__==truebreak;else{//交换X,Y向量;fori=0;iN;i++{Y[i]=X[i];}}counter++;}//打印Xcout迭代次数为counter次该线性方程组的解(X1,X2,X
3......X10)为endl;coutX1=X
[1]endl;coutX2=X
[2]endl;coutX3=X
[3]endl;coutX4=X
[4]endl;coutX5=X
[5]endl;coutX6=X
[6]endl;coutX7=X
[7]endl;coutX8=X
[8]endl;coutX9=X
[9]endl;coutX10=X
[10]endl;}截图如下
①eps=
0.001
②eps=
0.0001
③eps=
0.00001
(3)对方程组
(2)使用SOR方法,选取不同松弛因子代码如下#includeiostream.h#include__th.h#defineN8//矩阵的维数,可按需更改staticdoubleA[N][N]={42-40240022-1-21320-4-1141-8-3560-216-1-4-3321-8-1224-10-343-3-44111-4025-3-1011420063-3-4219};//方程组左侧系数矩阵staticdoubleB[N]={0-662311-22-1545};//右侧值staticdoubleY[N];//输出比较项staticdoubleX[N];//输出项staticdoubleG[N];//X=BX+G的G矩阵intijk;//计数器doubleeps;intM=100;doublew;booldistan__{//求两输出项的差的范数是否满足精度要求doubletemp=0;fori=0;iN;i++{temp=temp+fabsX[i]-Y[i];}iftempepsreturnfalse;elsereturntrue;//满足精度要求则结束程序}void__in{cout最大迭代次数为100次endl;cout你希望的精度是多少?endl;couteps=;cineps;cout请选取松弛因子endl;coutw=;cinw;//形成迭代矩阵B,存放到A中fori=0;iN;i++{iffabsA[i][i]eps{cout打印失败endl;return;}doubleT=A[i][i];forj=0;jN;j++{A[i][j]=-w*A[i][j]/T;}A[i][i]=1-w;G[i]=w*B[i]/T;}intcounter=0;whilecounterM{//迭代fori=0;iN;i++{doubletemp=0;forj=0;jN;j++{temp=temp+A[i][j]*X[j];}X[i]=G[i]+temp;}ifdistan__==truebreak;else{//交换X,Y向量;fori=0;iN;i++{Y[i]=X[i];}}counter++;}//打印Xcout迭代次数为counter次该线性方程组的解(X1,X2,X
3......X8)为endl;coutX1=X
[1]endl;coutX2=X
[2]endl;coutX3=X
[3]endl;coutX4=X
[4]endl;coutX5=X
[5]endl;coutX6=X
[6]endl;coutX7=X
[7]endl;coutX8=X
[8]endl;}截图如下eps=
0.001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2eps=
0.0001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2eps=
0.00001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2
(4)对方程组
(3)使用SOR方法,选取不同松弛因子代码如下#includeiostream.h#include__th.h#defineN10//矩阵的维数,可按需更改staticdoubleA[N][N]={4-100000000-14-100000000-14-100000000-14-100000000-14-100000000-14-100000000-14-100000000-14-100000000-14-100000000-14};//方程组左侧系数矩阵staticdoubleB[N]={75-1326-1214-45-5};//右侧值staticdoubleY[N];//输出比较项staticdoubleX[N];//输出项staticdoubleG[N];//X=BX+G的G矩阵intijk;//计数器doubleeps;intM=100;doublew;booldistan__{//求两输出项的差的范数是否满足精度要求doubletemp=0;fori=0;iN;i++{temp=temp+fabsX[i]-Y[i];}iftempepsreturnfalse;elsereturntrue;//满足精度要求则结束程序}void__in{cout最大迭代次数为100次endl;cout你希望的精度是多少?endl;couteps=;cineps;cout请选取松弛因子endl;coutw=;cinw;//形成迭代矩阵B,存放到A中fori=0;iN;i++{iffabsA[i][i]eps{cout打印失败endl;return;}doubleT=A[i][i];forj=0;jN;j++{A[i][j]=-w*A[i][j]/T;}A[i][i]=1-w;G[i]=w*B[i]/T;}intcounter=0;whilecounterM{//迭代fori=0;iN;i++{doubletemp=0;forj=0;jN;j++{temp=temp+A[i][j]*X[j];}X[i]=G[i]+temp;}ifdistan__==truebreak;else{//交换X,Y向量;fori=0;iN;i++{Y[i]=X[i];}}counter++;}//打印Xcout迭代次数为counter次该线性方程组的解(X1,X2,X
3......X10)为endl;coutX1=X
[1]endl;coutX2=X
[2]endl;coutX3=X
[3]endl;coutX4=X
[4]endl;coutX5=X
[5]endl;coutX6=X
[6]endl;coutX7=X
[7]endl;coutX8=X
[8]endl;coutX9=X
[9]endl;coutX10=X
[10]endl;}截图如下eps=
0.001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2eps=
0.0001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2eps=
0.00001
①w=
0.8
②w=
0.9
③w=1
④w=
1.1
⑤w=
1.2F.实验结果分析对于第一个实验,由于系数矩阵的谱半径大于1,所以当迭代进行到最大迭代次数100次时仍然不能得到与精确解近似的解,所以实验结果与精确解出入十分大对于第二个实验,由于所用系数矩阵和第一个实验的系数矩阵是相同的,所以它的谱半径也是大于1的,所以当迭代进行到最大迭代次数100次时仍然不能得到与精确解近似的解,所以实验结果与精确解出入十分大对于第三个实验,当解第二个方程组的时候,当选取精度为
0.001,松弛因子为
0.8时迭代65步可以得出解但是仍与精确解有较大的差异其余精度和松弛因子选取的时候都需要迭代到最大的步数才能得到解对于第三个实验,当解第三个方程组的时候,当eps=
0.001时,w=1或者w=
1.1都可以只需七步迭代出结果,当eps=
0.0001时,w=1或者w=
1.1都可以只需九步迭代出结果,当eps=
0.00001时,只有迭代到最大步数100时才能得到解。