Поймать Mathematica предупреждения / ошибки, не отображая их - PullRequest
12 голосов
/ 15 марта 2011

У меня проблема с NDSolve в Mathematica, которую я запускаю несколько раз с разными значениями параметров.Для некоторых из этих значений решение приводит к особенностям, и NDSolve предупреждает с помощью NDSolve :: ndsz или других связанных предупреждений.

Я просто хотел бы перехватить эти предупреждения, отключить их отображение и просто отследить тот факт, что возникла проблема с этими конкретными значениями параметров.Я подумал о следующих опциях (ни одна из которых на самом деле не работает):

  1. Я знаю, что с помощью Check я могу определить, привела ли команда к предупреждению или ошибке.Тем не менее, это будет отображать предупреждение.Если я выключу его с помощью Off, Check также не выдаст предупреждение.
  2. Можно остановить NDSolve с помощью метода EventLocator, чтобы я мог проверить очень большие значения функцииили его производные и прекратить оценку в этом случае.Однако на практике это время от времени выдает предупреждения, предположительно потому, что размер шага иногда может быть настолько большим, что предупреждение NDSolve срабатывает до того, как произойдет мой Event.

Ответы [ 3 ]

11 голосов
/ 15 марта 2011

Если вы оберните Check с Quiet, то я считаю, что все должно работать так, как вы хотите.Например, вы можете подавить конкретное сообщение 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]
5 голосов
/ 15 марта 2011

Использование Quiet и Check вместе работает:

Quiet[Check[Table[1/Sin[x], {x, 0, \[Pi], \[Pi]}], $Failed]]
3 голосов
/ 15 марта 2011

Возможно, вы хотите перенаправить сообщения ? Это почти дословно скопировано с этой страницы.

stream = OpenWrite["msgtemp.txt"];

$Messages = {stream};

1/0

FilePrint["msgtemp.txt"]
...