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