【问题标题】:Newton's method returns NaN牛顿方法返回 NaN
【发布时间】: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


【解决方案1】:

如果我改变了

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

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

然后FindRoot(sin, 4) 返回近似于 Pi 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2013-10-17
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多