C++,非常意外-1#INF

标签 c++ algorithm debugging optimization nan

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

这是上下文:我处理曲线拟合问题,模型在四个参数中是线性的,在 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/

相关文章:

python - pycharm是如何工作的?他们是如何连接到口译员的?

c++ - 未初始化的本地自动数组 C++

c++ - const 函数指针

php - 第 1 行第 'budget' 列的数据被截断”

java - 在Windows或Mac上运行pi4j程序

组织矩阵以使邻居最接近的算法

c++ - 旋转 QLabel 并保留其功能/样式表

c++ - DLL 不会在生成后事件中复制

python - 是否可以在不超过最大递归深度的情况下在 python 中使用参数 m>=4 和 n>=1 计算递归 ackermann(m,n) 函数?

c - 相差至少 K 的数字对的数量