2017-12-02 79 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循环。