当前位置:文档之家› 实验五解线性方程组的迭代法报告

实验五解线性方程组的迭代法报告

实验五解线性方程组的迭代法报告
实验五解线性方程组的迭代法报告

实验五 解线性方程组的迭代法

一、问题提出

对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。

二、要求

1、体会迭代法求解线性方程组,并能与消去法做以比较;

2、分别对不同精度要求,如345

10,10,10ε---=由迭代次数体会该迭代法的收敛快慢;

3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;

4、给出各种算法的设计程序和计算结果。

三、目的和意义

1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;

2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;

3、体会上机计算时,终止步骤(1)k k x

x ε+∞-<或k >(给予的迭代次数)

,对迭代法敛散性的意义;

4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。

四、实验学时:2学时

五、实验步骤:

1.进入C 或matlab 开发环境;

2.根据实验容和要求编写程序;

3.调试程序;

4.运行程序;

5.撰写报告,讨论分析实验结果.

解:

J迭代算法:

程序设计流程图:

源程序代码:

#include

#include

#include

void main()

{

float a[50][51],x1[50],x2[50],temp=0,fnum=0;

int i,j,m,n,e,bk=0;

printf("使用Jacobi迭代法求解方程组:\n");

printf("输入方程组的元:\nn=");

scanf("%d",&n);

for(i=1;i

x1[i]=0;

printf("输入方程组的系数矩阵:\n");

for(i=1;i

{

j=1;

while(j

{

scanf("%f",&a[i][j]);

j++;

}

}

printf("输入方程组的常数项:\n");

for(i=1;i

{

scanf("%f",&a[i][n+1]);

}

printf("\n");

printf("请输入迭代次数:\n");

scanf("%d",&m);

printf("请输入迭代精度:\n");

scanf("%d",&e);

while(m!=0)

{

for(i=1;i

{

for(j=1;j

{

if (j!=i)

temp=a[i][j]*x1[j]+temp;

}

x2[i]=(a[i][n+1]-temp)/a[i][i];

temp=0;

}

for(i=1;i

{

fnum=float(fabs(x1[i]-x2[i]));

if(fnum>temp) temp=fnum;

}

if(temp<=pow(10,-4)) bk=1;

for(i=1;i

x1[i]=x2[i];

m--;

}

printf("原方程组的解为:\n");

for(i=1;i

{

if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e)

{

printf("x%d=%7.4f ",i,x1[i]);

}

}

}

运行结果:

GS迭代算法:

#include

#include

#include

const int m=11;

void main()

{

int choice=1;

while(choice==1)

{

double a[m][m],b[m],e,x[m],y[m],w,se,max;

int n,i,j,N,k;

cout<<"Gauss-Seidol迭代法"<

cout<<"请输入方程的个数:";

cin>>n;

for(i=1;i<=n;i++)

{

cout<<"请输入第"<

for(j=1;j<=n;j++)

cin>>a[i][j];

}

cout<<"请输入各个方程等号右边的常数项:\n"; for(i=1;i<=n;i++)

{

cin>>b[i];

}

cout<<"请输入最大迭代次数:";

cin>>N;

cout<<"请输入最大偏差:";

cin>>e;

for(i=1;i<=n;i++)

{

x[i]=0;

y[i]=x[i];

}

k=0;

while(k!=N)

{

k++;

for(i=1;i<=n;i++)

{

w=0;

for(j=1;j<=n;j++)

{

if(j!=i)

w=w+a[i][j]*y[j];

}

y[i]=(b[i]-w)/double(a[i][i]);

}

max=fabs(x[1]-y[1]);

for(i=1;i<=n;i++)

{

se=fabs(x[i]-y[i]);

if(se>max)

max=se;

}

if(max

{

cout<

for(i=1;i<=n;i++)

cout<<"x"<

break;

}

for(i=1;i<=n;i++)

{

x[i]=y[i];

}

}

if(k==N)

cout<<"迭代失败!!"<

choice=0;

}

}

SOR方法:

# include

# include

#include

/**********定义全局变量**********/ float **a; /*存放A矩阵*/

float *b; /*存放b矩阵*/

float *x; /*存放x矩阵*/

float p; /*精确度*/

float w; /*松弛因子*/

int n; /*未知数个数*/

int c; /*最大迭代次数*/

int k=1; /*实际迭代次数*/

/**********SOR迭代法**********/

void SOR(float xk[])

{

int i,j;

float t=0.0;

float tt=0.0;

float *xl;

xl=(float *)malloc(sizeof(float)*(n+1));

for(i=1;i

{

t=0.0;

tt=0.0;

for(j=1;j

t=t+a[i][j]*xl[j];

for(j=i;j

tt=tt+a[i][j]*xk[j];

xl[i]=xk[i]+w*(b[i]-t-tt)/a[i][i];

}

t=0.0;

for(i=1;i

{

tt=fabs(xl[i]-xk[i]);

tt=tt*tt;

t+=tt;

}

t=sqrt(t);

for(i=1;i

xk[i]=xl[i];

if(k+1>c)

{

if(t<=p)

printf("\nReach the given precision!\n"); else

printf("\nover the maximal count!\n"); printf("\nCount number is %d\n",k);

}

else

if(t>p)

{

k++;

SOR(xk);

}

else

{

printf("\nReach the given precision!\n");

printf("\nCount number is %d\n",k);

}

}

/**********程序*****开始**********/

void main()

{

int i,j;

printf("SOR方法\n");

printf("请输入方程个数:\n");

scanf("%d",&n);

a=(float **)malloc(sizeof(float)*(n+1)); for(i=0;i

a[i]=(float*)malloc(sizeof(float)*(n+1)); printf("请输入三对角矩阵:\n");

for(i=1;i

for(j=1;j

scanf("%f",&a[i][j]);

for(i=1;i

for(j=1;j

b=(float *)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值:\n");

for(i=1;i

scanf("%f",&b[i]);

x=(float *)malloc(sizeof(float)*(n+1)); printf("请输入初始的x:");

for(i=1;i

scanf("%f",&x[i]);

printf("请输入精确度:");

scanf("%f",&p);

printf("请输入迭代次数:");

scanf("%d",&c);

printf("请输入w(0

scanf("%f",&w);

SOR(x);

printf("方程的结果为:\n");

for(i=1;i

printf("x[%d]=%f\n",i,x[i]);

}

相关主题
文本预览
相关文档 最新文档