我正在调试优化例程。我生成了一个日志文本文件,我在其中跟踪优化例程中每次迭代的目标函数值。
这是上下文:我处理曲线拟合问题,模型在四个参数中是线性的,在 X 数据中是多项式
Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4
我对从该模型生成的无噪声无偏数据运行优化例程,以测试算法。
在日志文件中,第一个优化步骤显示没有问题。函数评估具有双重值(value)。在每次迭代中,计算 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 中的 f1 相同点的函数求值N-1
.
最佳答案
无穷大在计算中传播。最大的可能性是多项式产生 -Inf,因为 X 已经是 -Inf。这是由除以零的 X 计算引起的最大可能性。返回并添加检查除法中是否为零的代码。
关于C++,非常意外-1#INF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9965556/