我正在以非常有限的方式进行newton-raphson方法。
x0=5; epsilon = 1e-07
new_rap1 = function(ini, eps){
f = function(a) a*a -2;
fpr = function(a) 2*a;
xn1 = ini-(f(ini)/fpr(ini))
if(abs(xn1-ini) > eps){
new_rap(xn1, eps)
}
xn1
}
new_rap1(x0, epsilon)
new_rap2 = function(ini, eps){
f = function(a) a*a -2;
fpr = function(a) 2*a;
xn1 = ini-(f(ini)/fpr(ini))
if(abs(xn1-ini) > eps){
new_rap(xn1, eps)
} else{xn1}
}
使用new_rap1函数,我得到了 2.7 这是错误的答案。
但是new_rap2函数给出了正确答案,即 1.414214 。
我不知道它们之间的区别。我看到的唯一区别是最后一个,但我不知道是什么让它与众不同。
new_rap1 = function(ini, eps){
f = function(a) a*a -2;
fpr = function(a) 2*a;
xn1 = ini-(f(ini)/fpr(ini))
if(abs(xn1-ini) > eps){
new_rap1(xn1, eps)
}
xn1;print(1)
}
我尝试了几次测试,然后我把那个打印声明,1次打印6次。 即。
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
(我想这是到达答案之前的递归次数。)
由于在遇到print语句之前在递归函数中遇到过,因此最后不应该只打印一次?
谢谢。
答案 0 :(得分:0)
在递归结束时,xn1
返回的new_rap1
在第一个牛顿步骤之后(即执行递归循环中最外层调用时)的值相同,即使递归计算的确是正确的值。您可以通过运行以下代码来查看:
x0=5; epsilon = 1e-07
new_rap1 = function(ini, eps){
f = function(a) a*a -2;
fpr = function(a) 2*a;
xn1 = ini-(f(ini)/fpr(ini))
print(xn1)
if(abs(xn1-ini) > eps){
new_rap1(xn1, eps)
}
xn1
}
new_rap1(x0, epsilon)
new_rap2
不会遇到此问题,因为永远不会评估第一次调用结束时的else{xn1}
:)
顺便说一下:我不会使用递归来进行迭代的根搜索方法,因为在某些情况下它可能最终会变成无限循环。最好使用具有固定最大牛顿数(二分等)步骤的for
循环。