1

我正在使用 c++ boost/odeint 来集成化学反应网络。一切正常,除非我消除了一些反应。然后有时会在输出中出现-nan。这是该输出的一小部分。第一列是时间,其他列是物种的浓度。

0.0 2.8701 3.4354 3.48348 4.30509 5.43538 5.35687 2.9138 5.31905 3.51382
0.0268472 -nan 2.93435 -nan -nan -nan -nan 2.9138 -nan -nan
0.0695729 -nan 2.28324 -nan -nan -nan -nan 2.9138 -nan -nan
0.112299 -nan 1.77661 -nan -nan -nan -nan 2.9138 -nan -nan
0.155024 -nan 1.3824 -nan -nan -nan -nan 2.9138 -nan -nan
0.19939 -nan 1.06535 -nan -nan -nan -nan 2.9138 -nan -nan

第二个物种只依赖于自己,第七个物种是恒定的。

所以我的问题是:odeint 什么时候给出 -nan 作为输出?也许某处有一个 0/​​0 的划分,但所有方程只包含产品,例如

dxdt[5] = - c[2] * x[5] + c[3] * x[9] * x[3];

非常感谢您的任何建议。

4

2 回答 2

3

NaN 有几个可能的原因:

  • 被零除x/0
  • 将 +- Infinity 与自身相除Infinity / Infinity
  • 乘法 0 × (+- Infinity)
  • 将 Infinity 添加/减去自身(例如Infinity - Infinity
  • Any operation with NaN也会导致 NaN

所以最有可能的是,上面提到的一些事情发生在你的代码中。IEEE 754 中的 NaN 采用所有指数位 = 1,但尾数位而不是尾数位的形式。前导位表示 + 或 - NaN。

于 2014-06-05T07:11:12.267 回答
1

我在其他地方读到步长可能是个问题。所以我只是将初始步长 dt 减小了 10 倍,现在它正在工作。对于某些物种来说,最初的坡度可能太大了。感谢您的回复!

为什么你要为答案苦苦挣扎好几天,而一旦你在 stackoverflow 上提出问题,你就会自己找到答案?:D

于 2014-06-05T07:48:13.543 回答