最新雅克比迭代法……
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验课程名称:数值分析
}
结果:
流程图:
②Gauss-Seidel迭代法
#include
int main()
{
double x[3] = {0, 0, 0};
开始
阶数n,系数矩
阵,初始向量
for(i=0;i i=j Y N total += a[i][j] * x[j] e = e + ABS(x[j], 结束 double a[3][3] = {6,2,-1,1,4,-2,-3,1,4}; double y[3] = {-3,2,4}; double d[3][3],g[3]; int round = 5, i,j; for (i=0; i<3; ++i) { g[i] = y[i] / a[i][i]; for (j=0; j<3; ++j) { d[i][j] = i==j ? 0 : -a[i][j]/a[i][i]; } } while (round--) { for (i=0; i<3; ++i) { x[i] = g[i]; for (j=0; j<3; ++j) { x[i] += d[i][j] * x[j]; } printf("%lf", x[i]); } printf("\n"); } } 结果: 流程图: { a[i]=(float *)malloc(n*sizeof(float)); } return a; } float matrix_category(float* x,int n) { int i; float temp=0; for(i=0;i { temp=temp+fabs(x[i]); } return temp; } 结果: 流程图: return 0; } 结果: 流程图: ⑤欧拉显式方法 #include #include #include double f(double x,double y) { return x*pow(y,1.0/3); } int main() { int i; 开始 矩阵阶数系数矩阵 for(k=1;k<=i-1;k++) m=m+a[i][k]*a[k][j]; a[i][j]= a[i][j]-m; a[k][num+1]=(a[k][ num+1]-q)/a[k][k] 结束 double x,y,y0=1,dx=0.1; double xx[11]; double euler[11],euler_2[11]; double temp; double f(double x,double y); for (i=0;i<11;i++) xx[i]=i*dx; euler[0]=y0; for (i=1,x=0;i<11;i++,x+=dx) euler[i]=euler[i-1]+dx*f(x,euler[i-1]); euler_2[0]=y0; for (i=1,x=0;i<11;i++,x+=dx) { temp=euler_2[i-1]+dx*f(x,euler_2[i-1]); euler_2[i]=euler_2[i-1]+dx*(f(x,euler_2[i-1])+f(x+dx,temp))/2; } for (i=0,x=0;i<11;i++,x+=dx) printf("x=%lf\teluer=%lf\teuler_2=%lf\taccu=%lf\n",x,euler[i],euler_2[i],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 value[divide(%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=%f\n",i,xn1,i,yn1); xn=xn1; yn=yn1; }return(0); } 结果: 流程图: 二、实验结果及分析 雅克比迭代法的全部分量都是间接利用,由于新值比旧值好,Gauss-Seidel迭代法直接对算出的分量加以使用,这样使得迭代的收敛情况有所改善,而超松弛法是在Gauss-Seidel迭代法的基础上,应用加速收敛思想而构造的一种方法;欧拉公式和梯形公式在计算上有明显的区别, 欧拉公式的特点是可以有U N 直接计算U n+1 ,也就是显式的,而梯形公式右端也有U n+1 ,必须通过解 方程才能求得,这类是隐式的。从算法的角度看显式远比隐式方便,隐式通常用迭代法求解。 三、实验小节、建议及体会 任何一种方法都有它的优点和局限性,只有找到一种方法能够解决我们的问题,又尽量减少出错,减少计算量就是符合这个问题的好方法。 良好的编程习惯有助于检查错误,也可以增强程序的可阅读性。 信息技术在教学中的应用和反思 通过的近期信息技术提升培的学习,结合教学教学中相关信息