180 likes | 270 Views
计算方法第三次作业 第三次线性方程组迭代法上机实验. 土木 0702 袁俊峰 U200715262 贾 浩 U200715365 何 俊 U200715256 赵仕栋 U200715300 郭 铖 U200715237 李玉宏 U200715311. 上机题目 : 设有方程组:. 考察用雅可比( jacobi )法,高斯 — 赛德尔法,超松弛,松弛法解此方程组。. 雅可比迭代法:. 雅克比迭代法的思想是将方程组的求解问题,转化为重复计算一组彼此独立的线性表达式 其迭代公式为 :.
E N D
计算方法第三次作业第三次线性方程组迭代法上机实验计算方法第三次作业第三次线性方程组迭代法上机实验 土木0702 袁俊峰U200715262 贾 浩U200715365 何 俊U200715256 赵仕栋U200715300 郭 铖U200715237 李玉宏U200715311
上机题目: 设有方程组: 考察用雅可比(jacobi)法,高斯—赛德尔法,超松弛,松弛法解此方程组。
雅可比迭代法: • 雅克比迭代法的思想是将方程组的求解问题,转化为重复计算一组彼此独立的线性表达式 • 其迭代公式为:
首先分离出变量x1,x2,x3,将方程改为如下等价的便于迭代的格式:首先分离出变量x1,x2,x3,将方程改为如下等价的便于迭代的格式:
然后取迭代初值 • 再按照前面的迭代公式一步一步的迭代,由于此题目的系数矩阵是对角占优阵,因此结果收敛,最后将得到准确值
雅克比源代码: #include<stdio.h> #include<math.h> #define N 50 void main() { double x1[N],x2[N],x3[N]; int k; x1[0]=0; x2[0]=0; x3[0]=0; printf("第0次迭代:"); printf("x1=%f x2=%f x3=%f\n",x1[0],x2[0],x3[0]); for(k=0;k<N;k++) { x1[k+1]=-0.4*x2[k]-0.2*x3[k]-2.4;
x2[k+1]=0.25*x1[k]-0.5*x3[k]+5; x3[k+1]=-0.2*x1[k]+0.3*x2[k]+0.3; printf("第%d次迭代:",k+1); printf("x1=%f x2=%f x3=%f\n",x1[k+1],x2[k+1],x3[k+1]); if(fabs(x1[k+1]-x1[k])<0.000001 && fabs(x2[k+1]-x2[k])<0.000001 && fabs(x3[k+1]-x3[k])<0.000001) break; } printf(" 方程组的解为: X=(%f, %f, %f)T\n",x1[k+1],x2[k+1],x3[k+1]); }
高斯-塞德尔迭代法: • 此方法是在雅克比迭代法的基础上,将雅克比迭代中 之前已经求出的i-1个新值带入公式求解,新值将比老的值更准确些,其迭代公式如下:
高斯-塞德尔迭代 源代码: #include<stdio.h> #include<math.h> #define N 50 void main() { double x1[N],x2[N],x3[N]; int k; x1[0]=0; x2[0]=0; x3[0]=0; printf("第0次迭代:"); printf("x1=%f x2=%f x3=%f\n",x1[0],x2[0],x3[0]); for(k=0;k<N;k++) { x1[k+1]=-0.4*x2[k]-0.2*x3[k]-2.4;
x2[k+1]=0.25*x1[k+1]-0.5*x3[k]+5; x3[k+1]=-0.2*x1[k+1]+0.3*x2[k+1]+0.3; printf("第%d次迭代:",k+1); printf("x1=%f x2=%f x3=%f\n",x1[k+1],x2[k+1],x3[k+1]); if(fabs(x1[k+1]-x1[k])<0.000001 && fabs(x2[k+1]-x2[k])<0.000001 && fabs(x3[k+1]-x3[k])<0.000001) break; } printf(" 方程组的解为: X=(%f, %f, %f)T\n",x1[k+1],x2[k+1],x3[k+1]); }
松弛迭代法 • 这是迭代方法中的一种加速方法,其计算公式简单,但需要选择合适的松弛因子,以保证迭代过程有较快的收敛速度。 • 其迭代公式如下: • W为松弛因子,当0<w<2时,才能保证迭代的收敛,当w<1时为低松弛法,当w>1时为超松弛法
松弛法源代码: #include<stdio.h> #include<math.h> #define N 50 void main() { double x1[N],x2[N],x3[N]; int k; double w=1.06; x1[0]=0; x2[0]=0; x3[0]=0; printf("第0次迭代:"); printf("x1=%f x2=%f x3=%f\n",x1[0],x2[0],x3[0]); for(k=0;k<N;k++)
{ x1[k+1]=x1[k]+(w/5)*(-12-5*x1[k]-2*x2[k]-x3[k]); x2[k+1]=x2[k]+(w/4)*(20+x1[k+1]-4*x2[k]-2*x3[k]); x3[k+1]=x3[k]+(w/10)*(3-2*x1[k+1]+3*x2[k+1]-10*x3[k]); printf("第%d次迭代:",k+1); printf("x1=%f x2=%f x3=%f\n",x1[k+1],x2[k+1],x3[k+1]); if(fabs(x1[k+1]-x1[k])<0.000001 && fabs(x2[k+1]-x2[k])<0.000001 && fabs(x3[k+1]-x3[k])<0.000001) break; } }
实验感言: • 对于这几种方法各有优劣之处,雅克比方法简单但运算次数多,松弛法速度快但难处在于怎样找到一个合适的松弛因子