二分法 简单迭代法 Newton法 弦截法 求解非线性方程的根

 

二分法 简单迭代法  Newton法  弦截法 求解非线性方程的根

测试函数  为 f(x)=   sin(x); 

Code:
  1. #include    
  2. #include    
  3. #include    
  4.   
  5. using namespace std;   
  6. double foofun(double x)//定义所要求解的函数表达式;   
  7. {   
  8.     double y;   
  9.     y=sin(x);//实例 用的函数 为 sin(x); 用户可改为 其他的函数   
  10.     return y;   
  11. }   
  12. double getCrossPoint(double x1,double x2)//定义求解弦与x轴的交点   
  13. {   
  14.     double y;   
  15.     y=(x1*foofun(x2)-x2*foofun(x1))/float((foofun(x2)-foofun(x2)));   
  16.     return y;   
  17. }   
  18.   
  19. /************二分法定义************************/  
  20.  #define e 0.0005   
  21.  double dichotomy(double x1,double x2)   
  22.  {   
  23.      double x3;   
  24.      while (foofun(x1)*foofun(x2)<0)   
  25.      {   
  26.              /* if the x2 and x1 distance is less than e ,  
  27.               * then x1 or x2 can be recognise as a root of the equivalent  
  28.              */  
  29.          while(fabs(x2-x1)
  30.          {   
  31.              /* Of course the average of x1 and x2 is also can be  
  32.               * regard as a root of the equivalent  
  33.              */  
  34.              cout<<"x1:"<
  35.   
  36.              cout<<"f(x1)= "<
  37.   
  38.              cout<<"x2:"<
  39.              cout<<"f(x2)= "<
  40.              cout<<"(x1+x2)/2:"<<(x1+x2)/2<
  41.              cout<<"f((x1+x2)/2)= "<//then display the x1 ,x2 ,(x1+x2)/2   
  42.              return (x1+x2)/2;   
  43.          }   
  44.          x3 = (x1+x2)/2;   
  45.          if(0 == foofun(x3))   
  46.          {   
  47.              cout<<"一个根为:x0: "<
  48.              cout<<"且f(x0) = 0"<
  49.              return x3;   
  50.          }   
  51.          if(foofun(x1)*foofun(x3)>0)   
  52.          {   
  53.              x1=x3;   
  54.          }   
  55.          else  
  56.          {   
  57.              x2 = x3;   
  58.          }   
  59.      }   
  60.      cout<<"f(a) * f(b) >0";   
  61.  }   
  62. /*二分法定义**/  
  63.   
  64. /************简单迭代法************************/  
  65. // code :start here   
  66. float iter_foofun(float x)   
  67. {   
  68.    float x1,x2;   
  69.    x1 = x;   
  70.    x2 = foofun(x1);   
  71.    while(abs(x1-x2)>=e)   
  72.    {   
  73.        x1 = x2;   
  74.        x2 = foofun(x1);   
  75.    }   
  76.    return x2;   
  77.   
  78. }   
  79. /*简单迭代法**/  
  80. /***********Newton法解方程*********************/  
  81. double Dif_foofun(double x0)   
  82. {   
  83.     float y;   
  84.     y = cos(x0);   
  85.     return y;   
  86. }   
  87.   
  88. double Newton_foo(double x0)   
  89. {   
  90.     double x, xx,f,f_dif;   
  91.     x = x0;   
  92.     f =foofun(x);   
  93.     f_dif=Dif_foofun(x);   
  94.     xx = x-f/f_dif;   
  95.     while((fabs(x-xx))>(1*10e-6))   
  96.     {   
  97.         x = xx;   
  98.         f = foofun(x);   
  99.         f_dif = Dif_foofun(x);   
  100.         xx = x -f/f_dif;   
  101.     }   
  102.     cout<<"方程的一个根的解为:"<
  103.     cout<
  104.   
  105. }   
  106. /***********Newton法解方程end******************/  
  107.   
  108. /************弦截法定义(begin************************/  
  109. double calEquationRoot(double x1,double x2)   
  110. {   
  111.     double x,y,y1;   
  112.     y1=foofun(x1);   
  113.     do  
  114.     {   
  115.         x=getCrossPoint(x1,x2);//调用求交点函数 x坐标   
  116.         y=foofun(x);//求y坐标   
  117.         if(y*y1 > 0)   
  118.         {   
  119.             y1 = y;   
  120.             x1 = x;   
  121.         }   
  122.         else  
  123.         {   
  124.             x2=x;   
  125.         }   
  126.   
  127.     }while (fabs(y)>=0.00001);//fabs 求浮点数的 绝对值   
  128.     return x;   
  129. }   
  130. /************弦截法定义end************************/  
  131.   
  132.   
  133.   
  134.   
  135. void help()   
  136. {   
  137.     //cout<<" Define what you want do!/n";   
  138.     cout<<"*****Created by hsw******/n";   
  139.     cout<<"-------------------------/n";   
  140.     cout<<"  *1.二分法             **/n";   
  141.     cout<<"  *2.简单迭代法         **/n";   
  142.     cout<<"  *3.Newton法           **/n";   
  143.     cout<<"  *4.弦截法             **/n";   
  144.     cout<<"  *0.退出               **/n";   
  145.     cout<<"-------------------------/n";   
  146. }   
  147. void seek()   
  148. {   
  149.   int flag;   
  150.   cout<<"请选择你要进行的操作:";   
  151.   cin>>flag;   
  152.   while(0!=flag)   
  153.   {   
  154.       switch(flag)   
  155.       {   
  156.           case  1:   //二分法"   
  157.           {   
  158.               cout<<"你选择的是:二分法"<
  159.                cin.get();   
  160.                double a,b,f;   
  161.                cout<<"请输入区间的上界a:"<
  162.                cin>>a;   
  163.                cout<<"请输入区间的下界b:"<
  164.                cin>>b;   
  165.                f=dichotomy(a,b);   
  166.                cout<<"二分法求解方程的解为:x = "<
  167.           }   
  168.           flag = 0;   
  169.           seek();   
  170.           break;   
  171.   
  172.           case  2:   //简单迭代法   
  173.           {   
  174.                float x0;   
  175.                cout<<"你选择的是:简单迭代法"<
  176.                cout<<"请输入你所要选取初始值x0:/n"<
  177.                cin >> x0;   
  178.                cout<
  179.           }   
  180.           flag = 0;   
  181.           seek();   
  182.           break;   
  183.   
  184.           case  3:    //Newton法   
  185.           {   
  186.               float x0;   
  187.               cout<<"你选择的是:Newton法"<
  188.               cout<<"请输入你所要的选取的初始值x0:/n"<
  189.               cin>>x0;   
  190.               Newton_foo(x0);   
  191.   
  192.   
  193.           }   
  194.           flag =0;   
  195.           seek();   
  196.           break;   
  197.   
  198.           case  4:   //弦截法   
  199.           {   
  200.               cout<<"你选择的是:弦截法"<
  201.               double x1,x2,f1,f2,x;   
  202.   
  203.               do //判断输入的弦x1,x2初值是否函数值相异   
  204.               {   
  205.                   cout<<"请输入 x1,x2:";//如果同号 (根不在x1,x2 之间)   
  206.                   cin>>x1>>x2;        //则提示 再次输入x1,x2;   
  207.                   f1 = foofun(x1);   
  208.                   f2 = foofun(x2);   
  209.               }while (f1*f2 >= 0);   
  210.   
  211.               x=calEquationRoot(x1,x2);//这就话怎没执行?怎没改?   
  212.                                         //solution:显示结果就可以了吗,呵呵   
  213.               cout<
  214.               cout<<" One of the  Equation Root is: "<< x <
  215.           }   
  216.           flag = 0;   
  217.           seek();   
  218.           break;   
  219.   
  220.           default:   
  221.           cout<<"erro/n";   
  222.           seek();// 输入错误 ,再次调用 seek 函数 提示用户输入选择操作;   
  223.           break;   
  224.       }   
  225.   }   
  226.   return ;   
  227.   
  228. }   
  229.   
  230. int main()   
  231. {   
  232.     help();   
  233.     seek();   
  234.     //cout << "Hello world!" << endl;   
  235.     return 0;   
  236. }   
  237.   
  238.   

测试结果:

Code:
  1. 测试数据:   
  2. *****Created by hsw******   
  3. -------------------------   
  4.   *1.二分法             **   
  5.   *2.简单迭代法         **   
  6.   *3.Newton法           **   
  7.   *4.弦截法             **   
  8.   *0.退出               **   
  9. -------------------------   
  10. 请选择你要进行的操作:1   
  11. 你选择的是:二分法   
  12. 请输入区间的上界a:   
  13. -1   
  14. 请输入区间的下界b:   
  15. 1   
  16. 一个根为:x0: 0   
  17. 且f(x0) = 0   
  18. 二分法求解方程的解为:x = 0   
  19. 请选择你要进行的操作:2   
  20. 你选择的是:简单迭代法   
  21. 请输入你所要选取初始值x0:   
  22.   
  23. -1   
  24. -0.143633   
  25. 请选择你要进行的操作:3   
  26. 你选择的是:Newton法   
  27. 请输入你所要的选取的初始值x0:   
  28.   
  29. -1   
  30. 方程的一个根的解为:   
  31. 0   
  32. 你选择的是:Newton法   
  33. 请输入你所要的选取的初始值x0:   
  34.   
  35. 4   
  36. 方程的一个根的解为:   
  37. 3.14159   
  38. 你选择的是:Newton法   
  39. 请输入你所要的选取的初始值x0:   

你可能感兴趣的:(二分法 简单迭代法 Newton法 弦截法 求解非线性方程的根)