我需要帮助才能改进我的代码。此代码查找方程的根,但是当它没有任何根时,屏幕上不会显示任何内容。我需要"输出"以这种方式:例如,
"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();
}
答案 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)
,则声明不存在/不可能。