牛顿下山法C++实现

来源:互联网 发布:淘宝去年的消费记录 编辑:程序博客网 时间:2024/04/30 23:25

目标:

      用牛顿下山法,求非线性方程x*x*x-x-1=0,的根。

 

要求:

       输入,初值,误差限,最大迭代次数,最大下山次数;

       输出,近似根以及下山因子;

 

 

代码(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++中调试通过,由于时间仓触,未对程序进行优化。但算法核心无误,基本达到要求;

原创粉丝点击