簡體   English   中英

R中的Newton-Raphson方法,else和遞歸

[英]Newton-Raphson method in R, else and recursion

我以非常有限的方式進行了牛頓-拉普森法。

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僅在最后打印一次?

謝謝。

在遞歸結束時,即使遞歸計算確實是正確的值, 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循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM