预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

数值分析实验五 班级:10信计二班学号:59姓名:王志桃分数: 一.实验名称 高斯-赛德尔迭代法解线性方程组 二.实验目的 学会利用高斯赛德尔方法解线性方程组 明白迭代法的原理 对于大型稀疏矩阵方程组适用于迭代法比较简单 三.实验内容 利用Gauss-Seidel迭代法求解下列方程组 ,其中取。 四、算法描述 由Jacobi迭代法中,每一次的迭代只用到前一次的迭代值,若每一次迭代充分利用当前最新的迭代值,即在计算第个分量时,用最新分量,代替旧分量,,就得到所谓解方程组的Gauss-Seidel迭代法。 其迭代格式为 (初始向量), 或者写为 五、编码 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #define MAX_n 100 #definePRECISION 0.0000001 #defineMAX_Number 1000 voidVectorInput(floatx[],intn)//输入初始向量 { inti; for(i=1;i<=n;++i) { printf("x[%d]=",i); scanf("%f",&x[i]); } } voidMatrixInput(floatA[][MAX_n],intm,intn)//输入增广矩阵 { inti,j; printf("\n===BegininputMatrixelements===\n"); for(i=1;i<=m;++i) { printf("Input_Line%d:",i); for(j=1;j<=n;++j) scanf("%f",&A[i][j]); } } voidVectorOutput(floatx[],intn)//输出向量 { inti; for(i=1;i<=n;++i) printf("\nx[%d]=%f",i,x[i]); } intIsSatisfyPricision(floatx1[],floatx2[],intn)//判断是否在规定精度内 { inti; for(i=1;i<=n;++i) if(fabs(x1[i]-x2[i])>PRECISION)return1; return0; } intJacobi_(floatA[][MAX_n],floatx[],intn)//具体计算 { floatx_former[MAX_n]; inti,j,k; printf("\nInputvectorx0:\n"); VectorInput(x,n); k=0; do{ for(i=1;i<=n;++i) { printf("\nx[%d]=%f",i,x[i]); x_former[i]=x[i]; } printf("\n"); for(i=1;i<=n;++i) { x[i]=A[i][n+1]; for(j=1;j<=n;++j) if(j!=i)x[i]-=A[i][j]*x[j]; if(fabs(A[i][i])>PRECISION) x[i]/=A[i][i]; else return1; } ++k; }while(IsSatisfyPricision(x,x_former,n)&&k<MAX_Number); if(k>=MAX_Number) return1; else { printf("\nG-S%dtimes!",k); return0; } } intmain()//主函数 { intn; floatA[MAX_n][MAX_n],x[MAX_n]; printf("\nInputn="); scanf("%d",&n); if(n>=MAX_n-1) { printf("\n\007nmust<%d!",MAX_n); exit(0); } MatrixInput(A,n,n+1); if(Jacobi_(A,x,n)) printf("\nG-SFailed!"); else { printf("\nOutputSolution:"); VectorOutput(x,n); } printf("\n\n\007Pressanykeytoquit!\n"); getch(); } 通过实验使我更加熟练的掌握和使用高斯赛贝尔迭代法来解线性方程组,而且这个方法可以用来解大型的稀疏矩阵,是的解线性方程组更加的便捷。但是,这个实验很繁琐,必须