《矩阵与数值分析》课程数值实验报告文档格式.docx

上传人:b****6 文档编号:20858273 上传时间:2023-01-26 格式:DOCX 页数:45 大小:100.62KB
下载 相关 举报
《矩阵与数值分析》课程数值实验报告文档格式.docx_第1页
第1页 / 共45页
《矩阵与数值分析》课程数值实验报告文档格式.docx_第2页
第2页 / 共45页
《矩阵与数值分析》课程数值实验报告文档格式.docx_第3页
第3页 / 共45页
《矩阵与数值分析》课程数值实验报告文档格式.docx_第4页
第4页 / 共45页
《矩阵与数值分析》课程数值实验报告文档格式.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

《矩阵与数值分析》课程数值实验报告文档格式.docx

《《矩阵与数值分析》课程数值实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《《矩阵与数值分析》课程数值实验报告文档格式.docx(45页珍藏版)》请在冰豆网上搜索。

《矩阵与数值分析》课程数值实验报告文档格式.docx

4.输出最后的求解结果。

1.3程序代码

本程序是用C++语言在MicrosoftvisualC++编译环境下编译和运行的。

由于代码太长,程序代码见附录1

1.4计算结果:

1)Gauss消去法求解结果:

1.当矩阵阶数n=10,即附录1程序代码中的N设为10时,运行程序得到如下结果:

消去之前的a和b:

6100000000|7

8610000000|15

0861000000|15

0086100000|15

0008610000|15

0000861000|15

0000086100|15

0000008610|15

0000000861|15

0000000086|14

请选择消元方法:

1↘(由键盘输入数字1,并回车)

第1次消元结果:

6100000000|7

04.666710000000|5.6667

……

第9次消元结果:

04.666710000000|5.6667

004.28571000000|5.2857

0004.1333100000|5.1333

00004.064510000|5.0645

000004.03171000|5.0317

0000004.0157100|5.0157

00000004.007810|5.0078

000000004.00391|5.0039

0000000004.002|4.002

求解结果:

X[10]={1111111111}

2.当矩阵阶数n=84,即程序代码中的N为84时,将附录1程序中N的值改为84,运行程序得到如下结果:

(由于此时矩阵太大,消元过程和1类似,所以省略写出。

X[84]={11111111111111111111111111111111110.99999810.9999921.000020.9999691.000060.9998781.000240.9995121.000980.9980471.003910.9921881.015620.9687521.06250.8750081.249980.5000311.99994-0.9998784.99976-6.9995116.999-30.99864.9961-126.992256.984-510.9691024.94-2046.874096.74-8190.4716383.9-32764.565531-131055262097-5241271.048e+006-2.09498e+0064.18586e+006-8.35533e+0061.66451e+007-3.30281e+0076.50077e+007-1.25821e+0082.34867e+008-4.02629e+0085.36838e+008}

2)Gauss列主元消去法求解结果:

消去之前的A和b:

2↘(由键盘输入数字2,并回车)

0-3.5-0.750000000|-4.25

8610000000|15

0861000000|15

0086100000|15

0008610000|15

0000861000|15

0000086100|15

0000008610|15

0000000861|15

0000000086|14

000000000-0.015617|-0.015617

求解结果:

X[84]={1111111111111111111111111111111111111111111111111111111111111111111111111111111110.99999910.999997}

1.5结果分析:

1.当n=10时,用Gauss消去法和Gauss列主元消去法得到的值解和精确解

全吻合,此时无论Gauss消法法还是列主元消去法求解,可以得到理想结果。

2.当n=84,即矩阵阶数过大时,可以看出此时用Gauss消元法得到的数值解结果与精确解结果

相去甚远,误差很大。

这就是因为当矩阵太大时,在消元过程中出现了小数做除数的情形,在计算过程中的舍入误差使解的面目全非了。

而用Gauss列主元消元法得到的数值解与精确解仍然可以很好的吻合,所以比较Gauss消去法与Gauss列主元消去法求解方程组可知,后者能有效避免消元过程中的小主元做除数,从而使求解精度更高。

附录1:

#include<

iostream>

iomanip>

usingnamespacestd;

#defineN10//N表示矩阵大小

voidSet_value(doublea[][N],double*b);

voidGauss_Array(double(*a)[N],double*b,double*X);

//Gauss消元求解函数

voidSelect_main(doublea[][N],double*b,inti);

voidSelectmain_Array(double(*a)[N],double*b,double*X);

//Gauss列主元消去法

voiddisplay(doublea[][N],double*b);

//输出当前(A|b)的函数

intmain()

{

doubleA[N][N],b[N];

Set_value(A,b);

//初始化系数矩阵A和右端向量b

doubleX[N];

//向量X用于存求解结果

intchoice;

cout<

<

"

1.Gauss消元2.Gauss列主元消元"

endl;

cin>

>

choice;

switch(choice)

{

case1:

Gauss_Array(A,b,X);

break;

case2:

Selectmain_Array(A,b,X);

default:

cout<

输入有误!

;

exit(0);

}

X["

N<

]={"

for(inti=0;

i<

N;

i++)

cout<

X[i]<

"

}"

return0;

}

voidSet_value(doublea[][N],double*b)

{

for(intj=0;

j<

j++)

{

a[i][j]=0;

if(j==i-1)

a[i][j]=8;

if(j==i)

a[i][j]=6;

if(j==i+1)

a[i][j]=1;

}

b[i]=15;

if(i==0)

b[i]=7;

if(i==N-1)

b[i]=14;

display(a,b);

voidGauss_Array(double(*a)[N],double*b,double*X)

N-1;

for(intI=i+1;

I<

I++)//每次消元过程

{

if(a[i][i]==0)//如果对角线元素出现为0的情况,则矩阵奇异,退出程序

{

cout<

矩阵奇异!

exit(0);

}

doubleL=a[I][i]/a[i][i];

for(intj=i;

a[I][j]=a[I][j]-L*a[i][j];

b[I]=b[I]-L*b[i];

第"

i+1<

次消元结果:

display(a,b);

//输出每次消元的结果

for(intk=N-1;

k>

=0;

k--)//倒序求解方程

if(a[k][k]==0)//如果消元后对角线元素出现为0的情况,则矩阵奇异,退出程序

cout<

exit(0);

doublesum=0;

for(intm=N-1;

m>

k;

m--)

sum+=a[k][m]*X[m];

X[k]=(b[k]-sum)/a[k][k];

voidSelect_main(doublea[][N],double*b,intj)

intmaxi=j;

doublemax=a[j][j];

for(inti=j;

i++)//查找列主元

if(fabs(a[i][j])>

fabs(max))

max=a[i][j];

maxi=i;

if(maxi!

=j)//将列主元所在行放至列首

doubleTemp=b[j];

b[j]=b[maxi];

b[maxi]=Temp;

for(intm=j;

m<

m++)

doubletemp=a[j][m];

a[j][m]=a[maxi][m];

a[maxi][m]=temp;

voidSelectmain_Array(double(*a)[N],double*b,double*X)

Select_main(a,b,i);

exit(0);

次消元:

//输出每次消元结果

if(a[k][k]==0)//如果消元后对角线元素出现为0的情况,则矩阵奇异,退出程序

doublesum=0;

voiddisplay(double(*a)[N],double*b)//输出系数矩阵A和b

for(intj=0;

setw(6)<

setprecision(5)<

a[i][j]<

//控制输出的数据宽度和精度

|"

b[i]<

二、用Jacobi和Gauss-Seidel迭代法求解方程组

2.1.问题

(a)选取不同的初始向量

和不同的右端向量

,给定迭代误差要求,用Jacobi和Gauss-Seidel迭代法计算,观测得出的迭代向量序列是否收敛。

若收敛,记录迭代次数,分析计算结果并得出你的结论。

(b)选定初始向量

,如取

的主对角线元素成倍增长若干次,非主对角元素不变,每次用Jacobi法计算,要求迭代误差满足

,比较收敛速度,分析现象并得出你的结论。

2.2.算法描述

1)算法基本思路

1.Jacobi迭代法基本思路:

,设A=(aij)nxn是可逆矩阵,对其移移项和变形后可得如下迭代格式:

然后,取定一个初始向量如x(0)=(0,0,…,0)T,带入上式开始迭代,然后如果达到迭代精度则停止迭代,即得到方程的数值解。

2.Guass-Seidel迭代法基本思路:

Guass-Seidel迭代法是对Jacobi迭代法

(1)做出如下改进:

其余同Jacobi迭代法。

2)算法实现步骤:

1.用题目中已知的系数矩阵初始化矩阵A,并输入不同的右端向量b和不同的初始向量x(0);

2.选择迭代方式:

1.Jacobi迭代法2.Gauss—Seidel迭代法;

当选择1时,按照迭代格式

(1)开始迭代,并给定迭代误差,同时在每次迭代结束后输出此时的迭代结果,以便观测和检查;

当选择2时,按照迭代格式

(2)开始迭代,并给定迭代误差,同时在每次迭代结束后输出此时的迭代结果,以便观测和检查;

3.如果达到给定迭代误差则迭代停止,得到方程数值解,并输出。

2.3.程序代码

本程序是用C++语言在MicrosoftvisualC++编译环境下编译和运行的,由于代码太长,程序代码见附录2

2.4.计算结果

a)对问题a的求解结果如下:

1.当输入的右端向量b=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]T;

初始向量x(0)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]T时,用Jacobi迭代法求解,得到如下结果:

请选择迭代方式:

1.Jacobi迭代法2.Gauss—Seidel迭代法

第1次迭代结果:

X[1]={0.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.3333330.333333}

第15次迭代结果:

X[15]={0.4816320.5734090.6327920.652090.6609320.6642940.6657020.666260.6664830.666560.666560.6664830.666260.6657020.6642940.6609320.652090.6327920.5734090.481632}

第16次迭代结果:

X[16]={0.4816340.5734120.6327970.6520960.6609390.6643020.665710.6662690.6664920.6665690.6665690.6664920.6662690.665710.6643020.6609390.6520960.6327970.5734120.481634}

迭代精度达到要求,迭代停止!

迭代结果为X[16]

2.同样输入右端向量b=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]T;

初始向量x(0)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]T时,用G-S迭代法求解,得到如下结果:

X[1]={0.3333330.3888890.4259260.4367280.4416150.443330.4440230.4442810.4443820.444420.4444350.4444410.4444430.4444440.4444440.4444440.4444440.4444440.4444440.444444}

第10次迭代结果:

X[10]={0.4816290.5734060.6327910.6520910.6609340.6642980.6657080.6662680.6664920.6665710.6665730.6664970.6662740.6657160.6643080.6609440.6521010.6328010.5734150.481636}

第11次迭代结果:

X[11]={0.4816340.5734120.6327980.6520980.6609410.6643050.6657150.6662740.6664980.6665760.6665760.6664990.6662760.6657180.6643080.6609450.6521010.6328010.5734150.481636}

迭代结果为X[11]

b)对问题b)的求解结果如下:

选取初始向量和右端向量分别为

,将

的主对角线元素成倍增长若干次,非主对角元素不变,每次选用Jacobi迭代法计算,要求迭代误差满足,

将程序中表示倍数的M取1时,迭代次数为23次,能达到迭代误差精度要求;

当M取2时,迭代次数为13次,能达到迭代误差精度要求;

当M取3时,迭代次数为10次,能达到迭代误差精度要求;

当M取4时,迭代次数为9次,能达到迭代误差精度要求;

当M取5时,迭代次数为8次,能达到迭代误差精度要求;

当M取7时,迭代次数为8次,能达到迭代误差精度要求;

当M取8时,迭代次数为7次,能达到

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

当前位置:首页 > 求职职场 > 社交礼仪

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

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