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

How to improve my code for Newton-Raphson method in C?

我需要帮助来改进我的代码。这段代码找到了方程的根,但是当它没有任何根时,屏幕上什么也没有出现。我需要这样的"output":例如,
"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();
              } 

Newton-Raphson 在以下情况下快速收敛到一个解:
1) 初步猜测接近。
2) 存在解决方案。

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

2 种方法:简单或深入

为 OP 推荐这个
简单:限制迭代次数。一旦发生 N 次迭代(建议位宽 double),以 "solution not found (does not exist or no convergence)."

退出循环

Deep:结合N-R,进行二分查找。一旦 f(lo) 是一个符号并且 f(hi) 是另一个符号(对于连续函数),即使无法通过 N-R 找到解决方案 也必须 存在。使用更好的 N-R 和二进制搜索来找到它。如果没有找到相反的符号 f(x),声明 non-existence/unfind-ability.