Wolfram mathematica 对Mathematica中生成的消息的反思

Wolfram mathematica 对Mathematica中生成的消息的反思,wolfram-mathematica,Wolfram Mathematica,在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步的最大

在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
变量,我只会收到消息名;特别是,有关决定退出的
t
的值的信息已丢失


现在,我总是可以使用一个标准的附加包中的
interpolingfunctiondomain
函数从
sol
中获取这些信息,但是如果我能够以某种方式将其从消息中提取出来,这将非常有帮助

您可以使用$MessagePrePrint设置一个函数,用于存储每条消息以备以后检索。

我不知道这是否可行,但是,如果您只想知道错误点处特定参数的值,那么获取这些值的一种笨拙的方法就是全局地用伪值定义这些变量。这适用于循环计数器,但我不知道它是否在
NDSolve
中起作用。另一个难题是生成t,并用t计算一个单元格


一种更优雅(可能也是正确的)方法是使用和。

到目前为止,这似乎是最好的选择。
$MessagePrePrint
的文档建议为此使用
Sow
/
eau
。我用
$MessagePrePrint
尝试了
Sow
/
eau
解决方案。它工作正常,但最终我发现内省返回的
interpolingfunction
对象要简单得多。