2017-12-02 78 views
0

我做在一個非常有限的方式牛頓迭代方法。牛頓迭代法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只一次在印刷結束?

謝謝。

+0

可能是一個簡單的範圍界定問題,如果語句可能產生不同的結果,xn1會在內部/外部調用 –

回答

0

在遞歸結束時,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循環。