雅克比迭代法…….doc_第1页
雅克比迭代法…….doc_第2页
雅克比迭代法…….doc_第3页
雅克比迭代法…….doc_第4页
雅克比迭代法…….doc_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验课程名称:数值分析实验项目名称运用插值法实验成绩实验者江骏专业班级软件0803组别同组者实验日期年 月 日第一部分:实验分析与设计一、实验内容描述研究用Jacobi迭代法与Gauss-Seidel迭代法解下列方程组Ax=b的收敛性,通过上机计算,验证分析是否正确,并观察右端项对迭代收敛是否有影响,比较两法的收敛速度松弛因子对超松弛因子迭代法收敛速度的影响,要求对不同的阶数进行迭代观察欧拉显式方法的收敛性观察欧拉隐式方法的收敛性写出实验报告二、实验基本原理与设计Jacobi迭代法:nj=1aijxj=bi(i=1,2,n)Gauss-Seidel迭代法:xi(K+1)=bi-i-1j=1aijxj(k+1)-nj=i+1aijxj(k)/aij超松弛因子迭代法:Dx(k+1)=Dx(k)+Ex(k+1)+Fx(k)+b-Dx(k)X(k+1)=x(k)+D-1R三角分解法:利用三角矩阵将方程组化解为两个方程组,从而简化运算。欧拉显式方法:在任意节点tn+1=t0+(n+1)h处,u(tn+1)的近似值由Euler公式给出:un+1=un+hf(tn,un)欧拉隐式方法:改进的Euler公式n+1=yn+hf(xn,yn)yn+1=yn+f(xn,yn)+f(xn+1,n+1)三、主要仪器设备及耗材WindowsXp VC+6.0第二部分:实验调试与结果分析一、调试过程Jacobi迭代法#include #define N 10float ABS(float,float);intmain (void) int i, j, n; float aNN, bN; float xN, yN; float e,total; printf (Please input the dimension:); scanf (%d, &n); printf (Please input the Coefficient Matrix: ); for (i = 0; i n; i+) for (j = 0; j n; j+) scanf (%f, &aij); printf (Please input the Vector: ); for (i = 0; i n; i+) scanf (%f, &bi); printf (Please input the initial vector: ); for (i = 0; i n; i+) scanf (%f, &xi); do for (i = 0; i n; i+) total = 0.0f; for (j = 0; j n; j+) if (i != j) total += aij * xj; yi = (bi - total) / aii; e=0.0f; for (j = 0; j n; j+) e = e + ABS(xj, yj); printf(%fn,e); for (i = 0; i 0.0001); for (i = 0; i n; i+) printf (x%d=%ft, i, xi); printf (n); return 0;float ABS(float x,float y) int total; if(xy) total=y-x; else total=x-y; return total; 结果 : 流程图: 开始阶数n,系数矩阵,初始向量for(i=0;in;i+)i=jYNtotal += aij * xje = e + ABS(xj, yj结束 Gauss-Seidel迭代法#includeint main() double x3 = 0, 0, 0; double a33 = 6,2,-1,1,4,-2,-3,1,4; double y3 = -3,2,4; double d33,g3; int round = 5, i,j; for (i=0; i3; +i) gi = yi / aii; for (j=0; j3; +j) dij = i=j ? 0 : -aij/aii; while (round-) for (i=0; i3; +i) xi = gi; for (j=0; j3; +j) xi += dij * xj; printf(%lf, xi); printf(n); 结果:流程图:开始系数矩阵增广阵for (i=0; i3; +i)dij = i=j ? 0 : -aij/aiifor (j=0; j3; +j)xi += dij * xj结束超松弛因子迭代法#include #include using namespace std; float *one_array_malloc(int n); float *two_array_malloc(int m,int n); float matrix_category(float* x,int n); int main() const int MAX=100; int n,i,j,k; float* a; float* x_0; float* x_k; float precision; float w; coutprecision; coutendln; a=two_array_malloc(n,n+1); coutendl输入增广矩阵的各值:n; for(i=0;in;i+) for(j=0;jaij; x_0=one_array_malloc(n); coutendl输入初始向量:n; for(i=0;ix_0i; x_k=one_array_malloc(n); cout输入松弛因子w (1ww; float temp; for(k=0;kMAX;k+) for(i=0;in;i+) temp=0; for(j=0;ji;j+) temp=temp+aij*x_kj; x_ki=ain-temp; temp=0; for(j=i+1;jn;j+) temp=temp+aij*x_0j; x_ki=(x_ki-temp)/aii; x_ki=(1-w)*x_0i+w*x_ki; for(i=0;in;i+) x_0i=x_ki-x_0i; if(matrix_category(x_0,n)precision) break; else for(i=0;in;i+) x_0i=x_ki; if(MAX=k) cout迭代不收敛n; cout迭代次数为:kendl; cout解向量为:n; for(i=0;in;i+) coutxi: x_kiendl; return 0; float *one_array_malloc(int n) float *a; a=(float *)malloc(sizeof(float)*n); return a; float *two_array_malloc(int m,int n) float *a; int i; a=(float *)malloc(m*sizeof(float *); for (i=0;im;i+) ai=(float *)malloc(n*sizeof(float); return a; float matrix_category(float* x,int n) int i; float temp=0; for(i=0;in;i+) temp=temp+fabs(xi); return temp;结果:流程图:开始系数矩阵阶,精度,增广阵,初始向量,松弛因子for(k=0;kMAX;k+)matrix_category(x_0,n)precisionYNfor(i=0;in;i+) x_0i=x_ki; a=(float *)malloc(sizeof(float)*n结束三角分解法#includeusing namespace std;int main()const int N=100; static double aNN,bN;int i,j,k,num,p;double m,t,q; coutnum; /输入 aij,bi coutnow input the matrix aij,i,j=1.num :endl; for(i=1;i=num;i+) for(j=1;j=num;j+) coutaijaij; coutnow input the matrix bi,i=1.num :endl; for(i=1;i=num;i+) coutbibi; t=0;for(i=1;i=num;i+) m=0; for(j=i;j=num+1;j+) for(k=1;k=i-1;k+) m=m+aik*akj; aij= aij-m; for(j=i+1;j=num;j+) for(k=1;k=1;k-) for(j=k+1;j=num;j+) q=q+akj*ajnum+1; aknum+1=(aknum+1-q)/akk; cout方程组的解为:; for(i=1;i=num;i+) coutxi=ainum+1endl; return 0;结果:流程图:开始矩阵阶数系数矩阵for(k=1;k=i-1;k+) m=m+aik*akj; aij= aij-m;aknum+1=(aknum+1-q)/akk结束欧拉显式方法#include #include #include double f(double x,double y) return x*pow(y,1.0/3); int main() int i; double x,y,y0=1,dx=0.1; double xx11; double euler11,euler_211; double temp; double f(double x,double y); for (i=0;i11;i+) xxi=i*dx; euler0=y0; for (i=1,x=0;i11;i+,x+=dx) euleri=euleri-1+dx*f(x,euleri-1); euler_20=y0; for (i=1,x=0;i11;i+,x+=dx) temp=euler_2i-1+dx*f(x,euler_2i-1); euler_2i=euler_2i-1+dx*(f(x,euler_2i-1)+f(x+dx,temp)/2; for (i=0,x=0;i11;i+,x+=dx) printf(x=%lfteluer=%lfteuler_2=%lftaccu=%lfn,x,euleri,euler_2i,pow(1+x*x,1.0/3); getch(); 结果:流程图:欧拉隐式方法#include#include#define f(x,y)(x+y)int main()int m;int i;double a,b,y0;double xn,yn,xn1,yn1,yn1b;double h;printf(nInput the begin and end of x:);scanf(%lf%lf,&a,&b);printf(Input the y value at %f:,a);scanf(%lf,&y0);printf(Input m valuedivide(%f,%f):,a,b);scanf(%d,&m);if(m=0)printf(Please input a number larger than 1.n);return(1);h=(b-a)/m;xn=a;yn=y0;for(i=1;i=m;i+)xn1=xn+h;yn1b=yn+h*f(xn,yn);yn1=yn+h/2*(f(xn,yn)+f(xn1,yn1b);printf(x%d=%f,y%d=%fn,i,xn1,i,yn1);xn=xn1;yn=yn1;return(0);结果:流程图:二、实验结果及分析雅克比迭代法的全部分量都是间接利用,由于新值比旧值好,Gauss-Seidel迭代法直接对算出的分量加以使用,这样使得迭代的收

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论