如何在C中改进Newton-Raphson方法的代码?

时间:2015-04-19 20:32:02

标签: c numerical-methods

我需要帮助才能改进我的代码。此代码查找方程的根,但是当它没有任何根时,屏幕上不会显示任何内容。我需要"输出"以这种方式:例如,
"input" x^2+x+1=0;
"output" There is not root of equation.
先感谢您。

        #include <stdio.h>
        #include <conio.h>
        #include <math.h>
        #include <stdlib.h> 

        double F(double x){ 
              return asin(x)-M_PI/6;
        }


        #define Tk (double)0.0000001 
        double Fx(double x,double(*F)(double),double k){ 
              return (double)((F(x+k)-F(x))/k); }

        main()
        {
             double x0=100, x, eps=0.001, ep;
              while(1)
            {  
              x=x0-F(x0)/Fx(x0,F,Tk);
              ep=fabs((x-x0)/x)*100;
              x0=x;
              if(fabs(ep)<eps) break;
              }
              printf("%lf", x0);
              getch();
              } 

1 个答案:

答案 0 :(得分:0)

Newton-Raphson在以下情况下迅速收敛解决方案:
1)最初的猜测很接近 2)存在解决方案。

当收敛没有及时发生时,可能出于两个原因中的任何一个,即使OP对理由#2感兴趣。由于计算机的精度有限,第三个原因也存在:关于+答案和-答案的振荡,其中fabs(ep)<eps未得到满足。在这种情况下,当两个值接近时返回平均值。

2种方法:简单或深入

建议OP
简单:限制迭代次数。一旦发生N次迭代(建议位宽double),退出循环时找不到解决方案(不存在或没有收敛)。&#34;

深度:与N-R一起执行二进制搜索。一旦f(lo)为一个符号且f(hi)为另一个符号(对于连续函数),即使无法通过N-R找到,解决方案也必须存在。使用更好的N-R和二分搜索来找到它。如果找不到相反的符号f(x),则声明不存在/不可能。