数值分析课程设计 雅克比迭代高斯赛德尔迭代超松弛迭代.docx
《数值分析课程设计 雅克比迭代高斯赛德尔迭代超松弛迭代.docx》由会员分享,可在线阅读,更多相关《数值分析课程设计 雅克比迭代高斯赛德尔迭代超松弛迭代.docx(10页珍藏版)》请在冰点文库上搜索。
数值分析课程设计雅克比迭代高斯赛德尔迭代超松弛迭代
数值分析课程设计雅克比迭代、高斯赛德尔迭代、超松弛迭代
求解线性方程组的雅克比迭代法、高斯-赛德尔迭代法和超松
弛迭代法的算法实现
学院:
数学科学学院
学号:
11111111111
姓名:
hhhhhhhhhh
班级:
计算0901
实验报告
一实验目的与要求(实验题目)
1(分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组
5,2,1,,12xxx,123,,1x,4x,2x,20,123,2x,3x,10x,3123,
4使得误差不超过10
2.用超松弛迭代法求解方程方程组:
(=1.1),
4x,x,1,12,,x,4x,x,4,123
,x,4x,,323,,65,10使得误差不超过
二计算公式
1.雅可比迭代法
n1,1(k)(k)x,b,ax,,,iiijj,,1jaii,ji,
i,1,2,...n,k,0,1,2,...,T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.
2.高斯-塞德尔迭代法
i,1n1(k,1)(k,1)(k),,x,b,ax,ax,,,iiijjijjj,,11j,iaii,
i,1,2,?
n,k,0,1,2,...,
T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.
3.超松弛迭代法
in,1,kkkk(,1)()(,1)()xx(baxax)/a,,,,,,,,,iiiijjijjii,jj,,11,i1,2,n,k0,1,,?
?
T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.
三、实验过程(算法程序)
1.雅可比迭代法
#include"stdio.h"
#include"math.h"
#include"string.h"
voidmain()
{
inti,j,k;
floatm1=0.0,m2=0.0;
floata[3][4]={5,2,1,-12,-1,4,2,20,2,-3,10,3};
floatx[3]={0.0,0.0,0.0};for(k=1;k<=10;)
{for(i=0;i<=2;i++)
{
for(j=0;j
m1=m1+a[i][j]*x[j];
for(j=i+1;j<=2;j++)
m2=m2+a[i][j]*x[j];
x[i]=(a[i][3]-m1-m2)/a[i][i];
m1=0,m2=0;
}
k++;
}
printf("雅可比迭代法计算结果为:
\n");
for(i=0;i<=2;i++)
printf("x[%2d]=%8.9f\n",i+1,x[i]);}
程序二:
#include"stdio.h"
#include"math.h"
#include"string.h"
#definen3
voidmain()
{
inti,j,k;
floatm1=0.0,m2=0.0;
floata[n][n+1];
printf("请输入方程组的增广矩阵:
");
for(i=0;ifor(j=0;jscanf("%f",&a[i][j]);floatx[n]={0.0,0.0,0.0};for(k=1;k<=10;)
{for(i=0;i<=n-1;i++)
{
for(j=0;j
m1=m1+a[i][j]*x[j];
for(j=i+1;j<=n-1;j++)
m2=m2+a[i][j]*x[j];
x[i]=(a[i][n]-m1-m2)/a[i][i];
m1=0,m2=0;
}
k++;
}
printf("雅可比迭代法计算结果为:
\n");
for(i=0;i<=n-1;i++)
printf("x[%2d]=%8.9f\n",i+1,x[i]);
}
2高斯-塞德尔迭代法
#include
#include
#definen3
voidmain()
{
inti,j,k=1;
floatx[n]={0,0,0},m[n]={0,0,0},s=1;
floata[n][n]={5,2,1,-1,4,2,2,-3,10},d[n]={-12,20,3};/*floata[n][n],d[n];
printf("请输入方程组系数矩阵");
for(i=0;ifor(j=0;jscanf("%f",&a[i][j]);
printf("请输入方程组右端向量");
for(i=0;iscanf("%f",&d[i]);*/
printf("高斯-塞德尔迭代法运算结果为:
\n");
for(k=0;fabs(s-x[0])>1e-6;k++)
{
s=x[0];
for(i=0;i{m[i]=0;
for(j=0;jm[i]=m[i]+d[i]+a[i][i]*x[i];
x[i]=m[i]/a[i][i];}
printf("Y1=%fY2=%fY3=%f\n",x[0],x[1],x[2]);
}
getchar();
}
3超松弛迭代法
#include
#include
usingnamespacestd;
float*one_array_malloc(intn);//一维数组分配
float**two_array_malloc(intm,intn);//二维数组分配
floatmatrix_category(float*x,intn);intmain()
{
constintMAX=100;//最大迭代次数
intn,i,j,k;
float**a;
float*x_0;//初始向量
float*x_k;//迭代向量
floatprecision;//精度
floatw;//松弛因子
cout<<"输入精度e:
";
cin>>precision;
cout<";
cin>>n;
a=two_array_malloc(n,n+1);
cout<\n";
for(i=0;i{
for(j=0;j{
cin>>a[i][j];
}
}
x_0=one_array_malloc(n);
cout<\n";
for(i=0;i{
cin>>x_0[i];
}
x_k=one_array_malloc(n);
cout<<"输入松弛因子w(1\n";
cin>>w;
floattemp;//迭代过程
for(k=0;k{
for(i=0;i{
temp=0;
for(j=0;j
{
temp=temp+a[i][j]*x_k[j];
}
x_k[i]=a[i][n]-temp;
temp=0;
for(j=i+1;j{
temp=temp+a[i][j]*x_0[j];
}
x_k[i]=(x_k[i]-temp)/a[i][i];
x_k[i]=(1-w)*x_0[i]+w*x_k[i];
}//求两解向量的差的范数
for(i=0;i{
x_0[i]=x_k[i]-x_0[i];
}
if(matrix_category(x_0,n){
break;
}
else
{
for(i=0;i{
x_0[i]=x_k[i];
}
}
}//输出过程
if(MAX==k)
{
cout<<"迭代不收敛\n";
}
cout<<"迭代次数为:
"<cout<<"解向量为:
\n";
for(i=0;i{
cout<<"x"<
"<}
return0;}
float*one_array_malloc(intn)//一维数组分配{
float*a;
a=(float*)malloc(sizeof(float)*n);
returna;
}
float**two_array_malloc(intm,intn)//二维数组分配{
float**a;
inti;
a=(float**)malloc(m*sizeof(float*));
for(i=0;i{
a[i]=(float*)malloc(n*sizeof(float));
}
returna;}
floatmatrix_category(float*x,intn){
inti;
floattemp=0;
for(i=0;i{
temp=temp+fabs(x[i]);
}
returntemp;
}
四(实验结果:
1.雅可比迭代法:
2.高斯-塞德尔迭代法:
.
3.超松弛迭代法:
五(实验小结
通过这次上机,我学会了用J迭代法,G-S迭代法和SOR迭代法求解线性方程组,巩固了C语言程序设计算法编写,对这几种迭代方法有了更好的理解,并能通过编程和调试实现算法,完成了实验内容,收获颇丰。