R中的Newton-Raphson方法,否则和递归

时间:2017-12-02 17:06:18

标签: r if-statement recursion

我正在以非常有限的方式进行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语句之前在递归函数中遇到过,因此最后不应该只打印一次?

谢谢。

1 个答案:

答案 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循环。