2012-11-15 130 views
0

我寫牛頓方法的簡單的遞歸版本:牛頓方法返回NaN

#include <cmath> 

using namespace std; 

double DeriveAt(double (*f)(double), double x){ 
    return((f(x+0.001)-f(x-0.001))/0.002); 
}; 

double FindRoot(double (*f)(double), double x0){ 
    double corr=f(x0)/DeriveAt(f,x0); 
    if(abs(corr) > 1.E-7) 
      FindRoot(f, x0-corr); 
    else return(x0); 
}; 

如果我把我的功能,例如返回FindRoot(sin, 4),NaN。我在每一步之後通過打印x0的值來檢查函數,並且一切似乎都在最後一次迭代中工作。出於某種原因,函數調用本身的次數超過了實際應用,可能在計算最後的corr時會創建類似0/0的東西。

+3

你錯過了'FindRoot'的'return'。這是問題嗎? – Rook

+0

謝謝!我知道這是愚蠢的。使用'return FindRoot(...)'它可以工作。 – einbandi

+3

如果你在海灣合作委員會的土地上,你應該更多地使用像'-Wall'這樣的東西,它會給你_「test.cpp:16:warning:控制達到非void函數的結束_ – Rook

回答

3

如果我改變

if(abs(corr) > 1.E-7) 
     FindRoot(f, x0-corr); 

if(abs(corr) > 1.E-7) 
     return FindRoot(f, x0-corr); 

然後FindRoot(sin, 4)回報的東西逼近皮。