牛顿迭代法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

回到顶部