【问题标题】:C++, very unexpected -1#INFC++,非常意外 -1#INF
【发布时间】:2012-04-15 11:19:03
【问题描述】:

我正在调试优化程序。我生成一个日志文本文件,在其中跟踪优化例程中每次迭代的目标函数值。

这里是上下文:我处理曲线拟合问题,模型在四个参数中是线性的,在 X 数据中是多项式

Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4

然后我对从此模型生成的无噪声无偏数据运行优化例程,以测试算法。

在日志文件中,第一个优化步骤显示没有问题。函数评估具有双重价值。在每次迭代中,计算 5 个函数值(并显示在日志文件中)。从给定的迭代中,事情变得糟糕:一个函数评估变为-1#INF,尽管此时目标函数已经成功评估(!)。在接下来的迭代中,“坏点”继续评估为-1#INF,并且一个接一个地最终评估为 -1#INF。考虑到公式和之前已经正确评估过的事实,在这些点计算 Y 并不困难。

另外,我怀疑还有另一个原因,比如内存管理。您对此有什么想法,或者有什么建议可以更密切地跟踪问题吗?


编辑

我在日志文件中看到-1#INF 的第一次出现。每次迭代时,函数在 5 个点进行评估,但这 5 个点中只有一个是“新点”。当-1#INF 首次出现时,此时函数已成功求值。

看起来像

ITERATION N-1
f1 559.011
f2 560.034
f3 562.034
f4 560.342
f5 560.344

ITERATION N 
f1 -1#INF
f2 560.034
f3 558.034
f4 560.342
f5 560.344

其中ITERATION Nf3 是新点的函数评估,f1 是与ITERATION N-1 中的f1 相同点的函数评估。

【问题讨论】:

  • “成功评估”到底是什么意思?您确定没有发生溢出或被零除吗?
  • 内存管理无疑是个问题。你的迭代算法是发散的。尝试追踪产生 INF 的第一个计算。
  • 使用调试器(或添加打印语句)来追踪导致错误的确切代码行。
  • 除非您发布一些实际代码,否则几乎无法为您提供帮助。
  • @Potatoswatter 我看到了第一次出现。每次迭代时,函数在 5 个点进行评估,但这 5 个点中只有一个是“新点”。当 -1#INF 首次出现时,此时函数已成功求值。

标签: c++ algorithm debugging optimization nan


【解决方案1】:

无穷大在计算中传播。最大的可能性是多项式产生了 -Inf,因为 X 已经是 -Inf。最大的可能性是,这是由 X 除以零的计算引起的。回过头来添加检查除法为零的代码。

【讨论】:

  • 谢谢。但是,从一开始就在每次计算中使用的向量 X 都是相同的……因此,如果在多项式中与任何操作数有任何冲突,它就会从一开始就出现。只有变量是参数,是公式中的乘法常数...
  • 好吧,然后将检查移至生成参数值的代码。您的 sn-p 太简短,无法给出准确的答案。
  • 他似乎描述的迭代求解器可以通过指数发散达到无穷大,无需除法。
  • 由于使用的规范,a.o.问题已解决,抱歉各位。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2010-09-23
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多