目标: 用牛顿下山法,求非线性方程x*x*x-x-1=0,的根。 要求: 输入,初值,误差限,最大迭代次数,最大下山次数; 输出,近似根以及下山因子; 时间: 3.39日晚 代码(C++实现): //牛顿下山法 //非线性方程求根 #include"iostream"#include"stdlib.h"#include"math.h"#include"conio.h"using namespace std; double function(double x){ return x*x*x-x-1; } double function_dao(double x){ return 3*x*x-1; }void error_output(int p){ switch(p) { case 1:cout<<"超出下山次数,请另选择初值!"<<endl; case 2:cout<<"超出迭代次数,失败!"; } } int main(){ double x,e,l=1,x1; int m,n,k=1,j; cout<<"请输入初值: "; cin>>x; cout<<"输入精度: "; cin>>e; cout<<"输入最大迭代次数 : "; cin>>m; cout<<"输入最大下山次数: "; cin>>n; loop: j=1; if(function(x)==0){ cout<<"该初值就是方程的根!"; cout<<endl; return 1; } x1=x-l*function(x)/function_dao(x); for(l=1,j=1;j<=n&&k==1;j++) { x1=x-l*function(x)/function_dao(x); if(fabs(function(x1))>fabs(function(x))){ l=l/2; cout<<"x0 "<<x<<" x1 "<<x1<<endl; } else break; } for(l=1,j=1;j<=n&&k!=1;j++) { x1=x-l*function(x)/function_dao(x); if(fabs(function(x1))>fabs(function(x))){ l=l/2; cout<<"x0 "<<x<<" x1 "<<x1<<endl; } else break; } if(j>n)error_output(1); if(fabs(x1-x)<e)cout<<"求得方程的根:"<<x1<<endl; else{ if(k==m)error_output(2); else { k=k+1; x=x1; goto loop; } } getch(); return 1; }以上程序在DEV C++中调试通过,由于时间仓触,未对程序进行优化。但算法核心无误,基本达到要求;

评论