牛顿迭代法R,否则和递归
我做在一个非常有限的方式牛顿迭代方法。牛顿迭代法R,否则和递归
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
(我猜是递归的数量,直到达到了答案。)
由于遇到打印语句之前在递归函数遇到过,应该不是1只一次在印刷结束?
谢谢。
回答:
在递归结束时,new_rap1
返回的xn1
与第一个牛顿步之后的值相同(即执行递归循环中最外层的调用时),即使递归计算的确是正确的值。您可以通过运行下面的代码看到这一点:
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
循环。
以上是 牛顿迭代法R,否则和递归 的全部内容, 来源链接: utcz.com/qa/257421.html