Mathematica 中生成消息的内省

3
有没有办法在Mathematica表达式求值期间获取实际生成的消息?比如说,我正在数值求解一个常微分方程,但是它会像这样崩溃:
In[1] := sol = NDSolve[{x'[t] == -15 x[t], x[0] == 1}, x, {t, 0, 1}, 
                       Method -> "ExplicitEuler"];

在这种情况下,我会得到 NDSolve::mxst 错误,告诉我在 t == 0.08671962566152185 时已经达到了最大10000步数的限制。现在,如果我查看 $MessageList 变量,我只能收到消息名称;特别是,NDSolve 决定退出的 t 值的信息已经丢失。
现在,我总是可以使用标准附加包中的 InterpolatingFunctionDomain 函数从 sol 中获取该信息,但是如果我能够从消息中提取它,那将会非常有帮助。

强相关: "在Mathematica中看到截断的消息". - Alexey Popkov
2个回答

3

您可以使用$MessagePrePrint来设置一个函数,该函数将存储每个消息以供以后检索。


到目前为止,这似乎是最好的选择。$MessagePrePrint 的文档建议使用 Sow/Reap 来实现此目的。 - Pillsy
我尝试了使用 Sow/Reap 方案和 $MessagePrePrint。它运行良好,但最终我发现检查返回的 InterpolatingFunction 对象要简单得多。 - Pillsy

1

我不知道这是否有效,但如果您只想在错误点知道特定参数的值,则可以通过全局定义具有虚拟值的变量来获得它们。这适用于循环计数器,但我不知道它是否从NDSolve内部起作用。另一种方法是将t Dynamic并使用一个已评估的单元格来显示t。

更优雅(也可能是正确的)的方法是使用ReapSow


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接