2011-03-15 11 views
12

Tengo un problema relacionado con NDSolve en Mathematica, que ejecuto varias veces con diferentes valores de los parámetros. Para algunos de estos valores, la solución da como resultado singularidades y NDSolve advierte con NDSolve :: ndsz u otras advertencias relacionadas.Detecta advertencias/errores de Mathematica sin mostrarlos

Simplemente me gustaría captar estas advertencias, suprimir su visualización, y simplemente hacer un seguimiento del hecho de que ocurrió un problema para estos valores particulares de los parámetros. Pensé en las siguientes opciones (ninguno de los cuales realmente hacer el truco):

  1. Sé que puedo determinar si un comando se ha traducido en una advertencia o error utilizando Check. Sin embargo, eso aún mostrará la advertencia. Si lo apago con Off, el Check no informa la advertencia también.
  2. Es posible detener NDSolve utilizando el método EventLocator, por lo que pude verificar valores muy grandes de la función o sus derivados y detener la evaluación en ese caso. Sin embargo, en la práctica, esto todavía produce advertencias de vez en cuando, presumiblemente porque el tamaño del paso a veces puede ser tan grande que se dispara la advertencia NDSolve antes de que mi Event haya tenido lugar.

¿Alguna otra sugerencia?

Respuesta

11

Si ajusta Check con Quiet, entonces creo que todo debería funcionar como desee. Por ejemplo, puede suprimir el mensaje específico Power::indet

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

pero otros mensajes siguen siendo representada

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] 
+1

Si bien Check no parece detectar las advertencias de NDSolve :: ndsz, la sugerencia sobre Silencio fue muy útil. –

+1

@Kasper: Me alegro de poder ayudar. ¿Puedes dar un ejemplo en el que 'Check' no capte la advertencia' NDSolve'? – Simon

5

Usando tranquila y Check conjunto de obras:

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

Lo siento, no vi venir la respuesta anterior de Simon. Recordatorio para mí: actualice antes de publicar –

+0

su única línea de explicación resolvió mi problema por completo. – Rorschach

3

Quizás desea redirect messages? Esto se copia casi textualmente desde esa página.

stream = OpenWrite["msgtemp.txt"]; 

$Messages = {stream}; 

1/0 

FilePrint["msgtemp.txt"] 
+0

+1: en una nota similar, ver http://stackoverflow.com/q/4264734/421225 – Simon