Подтвердить что ты не робот

Catch Mathematica предупреждения/ошибки, не отображая их

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

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

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

Любые другие предложения?

4b9b3361

Ответ 1

Если вы завернете 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]

Ответ 2

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

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

Ответ 3

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

stream = OpenWrite["msgtemp.txt"];

$Messages = {stream};

1/0

FilePrint["msgtemp.txt"]