计算物理第一次作业_第1页
计算物理第一次作业_第2页
计算物理第一次作业_第3页
计算物理第一次作业_第4页
计算物理第一次作业_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

计算物理第一次作业——用迭代法求取方程的根问题描述:我们利用迭代法求解一个方程的根。在使用迭代法时,首先要给一个初值,再利用迭代公式不断地迭代,当到一定的步数的时候,后一项减去前一项的差值(即误差)小于一定的精度值,迭代停止,并去后一项的值作为方程的根。主要算法与公式:1.Jacobi迭代法迭代公式:将方程化为等效形式,则在此处,既有2.牛顿下山法迭代公式:迭代函数,则在此处,3.加速迭代法迭代公式:,其中的与前面意义相同,其中,即初值求导。4.Aitken迭代法流程图:相关说明:以上,我们采用了四种不同的迭代法求方程的根,四种算法的主要过程是相似的,主要区别是不同算法的迭代公式不同,所以可以采用统一的流程图来描述程序运行的过程。其中,迭代公式在不同的算法中具体形式不同,前面已做说明,不再赘述。开始开始结束是是否否j=0b=A[j]a=bb=输出b,b-a|b-a|>=10^-7?j<=3?j=j+1结束是是否否j=0b=A[j]a=bb=输出b,b-a|b-a|>=10^-7?j<=3?j=j+1源代码:(四种算法合并写在一起)#include<iostream>#include<iomanip>#include<stdlib.h>#include<math.h>usingnamespacestd;voidmain(){ intj; doubleA[4]={0.1,0.2,0.9,9.0}; cout<<"***************Jacobiiteration***************"<<endl; for(j=0;j<=3;j++) { inti=0; doubleb,a; cout<<endl; cout<<"Initialvalue"<<""<<A[j]<<endl; b=A[j]; cout<<"i="<<setw(4)<<setiosflags(ios::left)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<"0"; do { a=b; b=pow(3*a,(double)1/3); i=i+1; if(i%2==0) cout<<endl; cout<<"i="<<setw(4)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<b-a; }while(abs(b-a)>=0.000001); cout<<endl; cout<<"Thefinalrootis"<<""<<b<<""<<"witherror"<<b-a<<endl; } cout<<endl; cout<<endl; cout<<"**********NewtonDownhillIteration**********"<<endl; for(j=0;j<=3;j++) { inti=0; doubleb,a; cout<<endl; cout<<"Initialvalue"<<""<<A[j]<<endl; b=A[j]; cout<<"i="<<setw(4)<<setiosflags(ios::left)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<"0"; do { a=b; b=(double)2/3*pow(a,3)/(a*a-1); i=i+1; if(i%2==0) cout<<endl; cout<<"i="<<setw(4)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<b-a; }while(abs(b-a)>=0.000001); cout<<endl; cout<<"Thefinalrootis"<<""<<b<<""<<"witherror"<<b-a<<endl; } cout<<endl; cout<<endl; cout<<"*********PostAccelerationiteration*********"<<endl; for(j=0;j<=3;j++) { inti=0; doubleb,a,L=pow(3*A[j],(double)-2/3)/3; cout<<endl; cout<<"Initialvalue"<<""<<A[j]<<endl; b=A[j]; cout<<"i="<<setw(4)<<setiosflags(ios::left)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<"0"; do { a=b; b=(pow(3*a,(double)1/3)-L*a)/(1-L); i=i+1; if(i%2==0) cout<<endl; cout<<"i="<<setw(4)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<b-a; }while(abs(b-a)>=0.000001); cout<<endl; cout<<"Thefinalrootis"<<""<<b<<""<<"witherror"<<b-a<<endl; } cout<<endl; cout<<endl; cout<<"**************Aitkeniteration**************"<<endl; for(j=0;j<=3;j++) { inti=0; doubleb,a,b1,b2; cout<<endl; cout<<"Initialvalue"<<""<<A[j]<<endl; b=A[j]; cout<<"i="<<setw(4)<<setiosflags(ios::left)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<"0"; do { a=b; b1=pow(3*a,(double)1/3); b2=pow(3*b1,(double)1/3); b=b2-pow(b2-b1,2)/(b2-2*b1+a); i=i+1; if(i%2==0) cout<<endl; cout<<"i="<<setw(4)<<i; cout<<setprecision(7)<<setw(15)<<b<<setw(15)<<b-a; }while(abs(b-a)>=0.000001); cout<<endl; cout<<"Thefinalrootis"<<""<<b<<""<<"witherror"<<b-a<<endl; }}运行的结果:1.Jacobi迭代法的运行结果:(均不发散)2.牛顿下山法(均不发散,)3.加速迭代法(初值为0.1,结果发散,其余初值结果均不发散)4.Aitken迭代法(初值为0.1,结果发散,其余初值结果均不发散)误差分析与绘图:1.Jacobi迭代法:利用Jacobi迭代法的误差随着迭代步数的增加,误差逐渐趋于零,最终都达到了设定的精度范围,所有的结果都不发散,四个初值都在14到15步迭代后达到得到方程的根。均为x=1.73205的根。2.牛顿下山法:利用牛顿下山法迭代时,误差随着步数变化如上图,初值0.1,0.2在三步迭代后得到结果均为x=0,初值0.9和9.0分别进过7步和9步得到结果,分别为x=-1.73205和x=1.73205。在,四个初值结果均不发散。3.加速迭代法:在使用加速迭代法时,误差变化如上图所示,初值0.1最终发散,其余的初值进过迭代都得到结果。初值0.2迭代步数12,结果x=1.732

温馨提示

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

评论

0/150

提交评论