C++,非常出乎意料-1#INF

C++, very unexpected -1#INF

本文关键字:-1#INF 出乎意料 非常 C++      更新时间:2023-10-16

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

上下文如下:我处理一个曲线拟合问题,该问题的模型在四参数中是线性的,在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 N处,只有f3是在新点处的函数评估,并且f1是在与ITERATION N-1中的f1相同的点处的功能评估。

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