Re: How does NIntegrate suppress messages?
- To: mathgroup at smc.vnet.net
- Subject: [mg62614] Re: How does NIntegrate suppress messages?
- From: Andrew Moylan <andrew.moylan at anu.edu.au>
- Date: Tue, 29 Nov 2005 04:46:21 -0500 (EST)
- References: <dm95bd$6q1$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Excellent, thanks Ingolf. I think your post answers all the questions
about this topic.
Ingolf Dahl wrote:
> Hi
> A general method to suppress messages from Check is the following:
>
> Block[{$Messages = {}}, Check[expr, failexpr]]
>
> My theory is that Nintergrate uses the same mechanism. Can we find a way to
> unsuppress the messages?
>
> One example:
>
> func[x_]:=1/x;
>
> x=0;Check[func[x],"Divide by zero"]
>
> gives both a message and evalutated failexpr, but
>
> x = 0; Block[{Set[$Messages, {}]}, Check[func[x], "Divide by zero"]]
>
> just evaluates failexpr. We might turn on the messages by redefining the
> function:
>
> newfunc[x_] := Block[{Set[$Messages, {OutputStream["stdout", 1]}]},
> func[x]];
>
> x = 0; Block[{Set[$Messages, {}]}, Check[newfunc[x], "Divide by zero"]]
>
> will give us the message back. To apply the same on NIntegrate is a bit
> tricky.Define first
>
> f::err = "error"; f[x_?NumericQ] := ( Message[f::err]; x )
>
> Then
>
> NIntegrate[f[x], {x, 0, 1}]
>
> will give no messages. Embedd f in a new function in the following ways:
>
> newf[ x_?NumericQ]:= ( Block[ { $MessageList=msl, $Messages= {
> OutputStream[ "stdout",1]}}, { f[x], msl=$MessageList}[[1]]])
>
> msl = {}; NIntegrate[newf[x], {x, 0, 1}]
>
> will then give you error messages. The NumericQ test is essential.
>
> Best regards
>
> Ingolf Dahl
> Sweden
>
>
>
>
>>-----Original Message-----
>>From: Andrew Moylan [mailto:andrew.moylan at anu.edu.au]
To: mathgroup at smc.vnet.net
>>Sent: den 25 november 2005 08:25
>>Subject: [mg62614] Re: How does NIntegrate suppress messages?
>>
>>It's quite a mystery. My guess is that NIntegrate temporarily
>>redefines the Message[...] function.
>>
>>Personally, I want to know because I want to copy this
>>behaviour of NIntegrate for my own functions, if it is easy.
>>Often I write code that uses Check, and I don't want the
>>messages generated and appearing as errors and clogging up the output.
>>
>>"Alan" <info at optioncity.REMOVETHIS.net> wrote in message
>>news:dm499k$srh$1 at smc.vnet.net...
>>
>>>"Andrew Moylan" <andrew.moylan at anu.edu.au> wrote in message
>>>news:dm1b0v$ic1$1 at smc.vnet.net...
>>>
>>>>Whenever the integrand in NIntegrate generates messages
>>
>>(by calling
>>
>>>>Message), the output of these messages are suppressed,
>>
>>although they
>>
>>>>are still generated in the sense that they can be caught
>>
>>using Check.
>>
>>>>Does anyone know how NIntegrate does this?
>>>
>>>I don't, but your post answers a question of mine about
>>
>>behavior which
>>
>>>has always seemed a puzzle. Often I will wrap a complicated
>>>computation in a Check in order to Abort[] on any message. Then, I
>>>will sometimes get an Abort[], but no message! And, indeed,
>>
>>often an
>>
>>>NIntegrate is involved. When that occurs, I have never been able to
>>>re-write the code to retrieve those missing messages.
>>>So if there is a way to "unsuppress", that will be helpful
>>
>>to me, too.
>>
>>>regards,
>>>alan
>>>
>>>
>>
>>
>>
>
>