【问题标题】:Catch Mathematica warnings/errors without displaying them捕获 Mathematica 警告/错误而不显示它们
【发布时间】:2011-03-15 09:57:01
【问题描述】:

我在 Mathematica 中遇到了一个涉及 NDSolve 的问题,我使用不同的参数值运行了多次。对于其中一些值,解会导致奇点,并且 NDSolve 会发出 NDSolve::ndsz 警告或其他相关警告.

我只想捕获这些警告,禁止显示它们,并跟踪这些特定参数值发生问题的事实。我想到了以下选项(两者都没有真正的作用):

  1. 我知道我可以使用Check 确定命令是否导致警告或错误。但是,这仍然会显示警告。如果我用Off 关闭它,Check 也无法报告警告。
  2. 可以使用 EventLocator 方法停止 NDSolve,因此我可以检查函数或其导数的非常大的值并在这种情况下停止计算。但是,在实践中,这仍然会不时产生警告,大概是因为步长有时可能会很大,以至于在我的Event 发生之前触发 NDSolve 警告。

还有其他建议吗?

【问题讨论】:

    标签: warnings wolfram-mathematica try-catch


    【解决方案1】:

    如果您将CheckQuiet 包装在一起,那么我相信一切都应该按照您的意愿进行。例如,您可以抑制特定消息Power::indet

    In[1]:= Quiet[Check[0^0,err,Power::indet],Power::indet]
    Out[1]= err
    

    但仍显示其他消息

    In[2]:= Quiet[Check[Sin[x,y],err,Power::indet],Power::indet]
    During evaluation of In[2]:= Sin::argx: Sin called with 2 arguments; 1 argument is expected. >>
    Out[2]= Sin[x,y]
    

    【讨论】:

    • 虽然 Check 似乎没有捕捉到 NDSolve::ndsz 警告,但关于 Quiet 的提示非常有帮助。
    • @Kasper:很高兴我能帮上忙。你能举一个Check 未能捕捉到NDSolve 警告的例子吗?
    【解决方案2】:

    同时使用 Quiet 和 Check 有效:

    Quiet[Check[Table[1/Sin[x], {x, 0, \[Pi], \[Pi]}], $Failed]]
    

    【讨论】:

    • 抱歉,没看到Simon之前的回答。提醒自己:发帖前刷新
    【解决方案3】:

    也许你想redirect messages?这几乎是从该页面逐字复制的。

    stream = OpenWrite["msgtemp.txt"];
    
    $Messages = {stream};
    
    1/0
    
    FilePrint["msgtemp.txt"]
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2017-08-15
      • 2023-03-14
      • 1970-01-01
      • 2011-02-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多