当前位置:文档之家› 计算方法实验

计算方法实验

实验一:姓名:学号:班级:2013级计算机6班实验地点:第二机房实验时间:2015/3/171 实验目的和要求1. 二分法求方程的根2. 基本迭代法求方程的根3. 用埃特金求方程010423=-+x x 在1.5处的一个根,精度要求410-。

4. 牛顿下山法求方程的根求方程013=--x x 的根,初值取6.00=x ,精度满足510-。

5. 牛顿迭代法求解7,精度满足510-2 实验环境和工具机房VC63 实验结果3.1 算法流程图3.2 程序核心代码二分法代码#include<iostream.h>#include<math.h>void main(){double x,a=1.0,b=1.5;for(int i=1;i<10;i++){x=(a+b)/2;if((a*a*a-a-1)*(x*x*x-x-1)<0) b=x;elsea=x;if(b-a<0.01) break;cout<<x<<endl;}}直接迭代法#include<iostream.h>#include<math.h>void main(){double x0=0.5,x,e=2.718281;for(int i=1;i<20;i++){x=pow(e,-x0);if(x-x0<0.00001) break;cout<<x<<endl;x0=x;}}爱特金方程代码#include<iostream>#include<math.h>#include<iomanip>using namespace std;//////////double fun(double x);void AitkenIterative(double(*pf)(double x)); ////////////////////int main(){AitkenIterative(fun);return 0;}////////////////////double fun(double x){return 10/(x*x+4*x);}void AitkenIterative(double(*pf)(double x)){double x,x0;int maxflag,k=1;double err;double temp1,temp2;cout<<endl<<" 请输入最大迭代次数(推荐10000):maxflag=";cin>>maxflag;cout<<" 请输入精度要求:err=";cin>>err;cout<<" 请输入初始值:x0=";cin>>x;cout<<endl;do{x0=x;temp1=pf(x0);temp2=pf(temp1);x=temp2-(temp2-temp1)*(temp2-temp1)/(temp2-2*temp1+x0);cout<<" 第"<<k<<"步迭代的结果为:x("<<k<<")="<<x<<endl;++k;}while(fabs(x-x0)>err&&k<maxflag);if(k>=maxflag)cout<<" 迭代失败!此时k="<<k<<endl;else{cout<<" 迭代成功!迭代次数为:k="<<k-1<<endl;cout<<" 方程的近似根为:root="<<x<<endl;cout<<" 函数值近似为:"<<pf(x)-x<<endl;}}4牛顿下山法核心代码int main(){NewtonIterative(fun,dfun);return 0;}double fun(double x){return (x*x*x-x-1);}double dfun(double x){return (3*x*x-1);}void NewtonIterative(double(*pfun)(double x),double (*pdfun)(double x)){int maxn,maxflag,k,n;k=1;n=0;double x0,x,temp;double err;cout<<endl<<" 请输入最大迭代次数(推荐10000):maxflag=";cin>>maxflag;cout<<endl<<" 请输入下山因子最多挑选次数(推荐10):maxn=";cin>>maxn;cout<<" 请输入精度要求:err=";cin>>err;cout<<" 请输入初始值x0=";cin>>x;cout<<endl;do{x0=x;temp=x0-1./pow(2,n)*pfun(x0)/pdfun(x0);if(fabs(pfun(temp))>=fabs(pfun(x0))&&n<maxn){n=n+1;temp=x0-1./pow(2,n)*pfun(x0)/pdfun(x0);}else if(fabs(pfun(temp))>=fabs(pfun(x0))){cout<<" 牛顿下山法失败!"<<endl;exit(1);}x=temp;if(n==0)cout<<" 第"<<k<<"步迭代的结果为:x("<<k<<")="<<x<<endl; else{cout<<" 第"<<k<<"步迭代的结果为:x("<<k<<")="<<x;cout<<" 下山因子为:r=1/2^"<<n<<endl;}n=0;++k;}while(fabs(x-x0)>err&&k<maxflag);if(k>=maxflag)cout<<endl<<" 牛顿下山法失败!迭代次数为k="<<k<<endl; else{cout<<endl<<" 牛顿下山法成功!迭代次数为k="<<k-1<<endl; cout<<" 牛顿下山法结果:近似根为root="<<x<<endl;牛顿法求根号7的值代码如下#include<iostream>#include<math.h>using namespace std;double f(double x);double df(double x);void main(){int maxflag,k=1,n=0;double x0,x,r;cout<<"请输入最大迭代次数:maxflag=";cin>>maxflag;cout<<" 请输入精度要求:r=";cin>>r;cout<<" 请输入初始值x0=";cin>>x;cout<<endl;if(df(x)==0)cout<<"牛顿迭代法失败"<<endl;elsewhile(k<maxflag){x=x0-1.0*f(x0)/df(x0);if(x-x0<r) break;cout<<x<<endl;x0=x;k=k+1;}cout<<"函数值为:"<<x<<endl;}double f(double x){return (x*x-7);}double df(double x){return (2*x);}3.3运行结果二分法运行结果直接迭代法运行结果爱特金方程运行结果牛顿下山法运行结果3.4牛顿法求根号7运行结果3.5运行结果分析由迭代次数k=4可知牛顿下山法的收敛速度快。

相关主题