牛顿·拉夫森的波动值
Fluctuating values in Newton Raphson
本文关键字:牛顿 更新时间:2023-10-16
我正在尝试使用Newton Raphson方法找到N根。这是我的实现...
double derive(int guess, int m, int n) {
return guess - (pow(guess, n)-m)/(n*pow(guess, n-1));
}
double getNRoot(int m, int n) {
double guess = 1;
double nextGuess = derive(guess, m, n);
while (fabs(guess-nextGuess) >= 0.0001) {
guess = nextGuess;
nextGuess = derive(guess, m, n);
printf ("%f %fn", guess, nextGuess);
}
return nextGuess;
}
它适用于许多值,但适用于m=8
和n=4
。当m=8
和n=4
时,guess
和nextGuess
在两个值之间波动。
2.750000 1.750000
1.750000 2.750000
2.750000 1.750000
...
那么这里出了什么问题呢?
派生函数返回一个双精度但操作 int 变量。即使在函数调用中你提供了 int,你也可以在函数原型中放置双精度以获得适当的精度:
double derive(double guess, double m, double n) {
return guess - (pow(guess, n)-m)/(n*pow(guess, n-1));
}
或者至少为非 pow 用途声明局部双精度变量:
double derive(int guess, int m, int n) {
double d_guess = guess;
double d_n = n;
double d_m = m
return d_guess - (pow(d_guess, n)-d_m)/(d_n*pow(d_guess, n-1));
}
考虑到这一点,您可能应该审查整个实现。也就是说,当需要"实数"时,使用双精度,在使用"整数"数字时使用"int"。