[英]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.