【发布时间】:2012-11-16 01:25:09
【问题描述】:
我写了牛顿方法的简单递归版本:
#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 的内容。
【问题讨论】:
-
您的
FindRoot中缺少return。是这个问题吗? -
谢谢!我知道这是一件愚蠢的事情。使用
return FindRoot(...)它可以工作。 -
如果你在 GCC 领域,你应该更多地使用像
-Wall这样的东西,这会给你 "test.cpp:16: 警告:控制到达非结束-void 函数”
标签: c++ nan newtons-method