MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Hold[] ReleaseHold[] ? or what ?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg60189] Re: Hold[] ReleaseHold[] ? or what ?
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Wed, 7 Sep 2005 04:03:48 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, U.K.
  • References: <dfiuvc$p7n$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

lupos wrote:
> hi all,
> 
> why does the following code work as hoped ?
> 
> In[1]
> fn[u_Real] := NIntegrate[Sin[x + u], {x, 1, 2}];
> FindMinimum[fn[u], {u, 0}]
> 
> Out[2]=
> {-0.9588510772084058, {u -> -3.070796346594197}}
> 
> 
> 
> but the next line generates some warnings/errors altough calculating
> correctly.
> how can the situation be fixed in a nice way ?
> maybe some Hold[] / ReleaseHold[] ?
> 
> In[3]:=
> FindMinimum[NIntegrate[Sin[x + u], {x, 1, 2}], {u, 0}]
> 
> Out[3]:=
> NIntegrate::inum : Integrand Sin[u+x] is not numerical at {x} = {1.5`}.
> NIntegrate::inum : Integrand Sin[u+x] is not numerical at {x} = {1.5`}.
> NIntegrate::inum : Integrand Sin[u+x] is not numerical at {x} = {1.5`}.
> {-0.958851077208406, {u -> -3.0707963268148295}}
> 
> 
> thanks for any hints
> robert.
> 
Hi Robert,

*NIntegrate* _must_ know the value of ALL the values/parameters before 
hand. To do the integration within the function *FindMinimum* you must 
use *Integrate*, that is first you ask Mathematica to do a symbolic 
integration with some parameter still unevaluated (operation that 
symbolic integration knows how to handle) then to find a minimum with a 
starting value of zero for the variable/parameter u. So, you may ask why 
using *NIntegrate* within a function definition works. It has worked in 
your case just because you have used *SetDelayed* (symbol ":=") rather 
than *Set* (symbol "="); see the last couple of pair-In-Out lines in the 
following code extract:

In[1]:=
FindMinimum[Integrate[Sin[x + u], {x, 1, 2}], {u, 0}]

Out[1]=
{-0.958851,{u -> -3.0708}}

In[2]:=
Integrate[Sin[x + u], {x, 1, 2}]

Out[2]=
2*Sin[1/2]*Sin[3/2 + u]

In[3]:=
% /. u -> 0 // N

Out[3]=
0.956449

In[4]:=
NIntegrate[Sin[x + u], {x, 1, 2}]

NIntegrate::inum: Integrand Sin[u + x] is not numerical at {x} = {1.5`}. 
More...

Out[4]=
NIntegrate[Sin[x+u],{x,1,2}]

In[5]:=
NIntegrate[Sin[x + u] /. u -> 0, {x, 1, 2}]

Out[5]=
0.956449

In[6]:=
fn[u_Real] := NIntegrate[Sin[x + u], {x, 1, 2}];

In[7]:=
fn[u_Real]=NIntegrate[Sin[x+u],{x,1,2}]

NIntegrate::inum: Integrand Sin[u + x] is not numerical at {x} = {1.5`}. 
More...

NIntegrate::inum: Integrand Sin[u + x] is not numerical at {x} = {1.5`}. 
More...

Out[7]=
NIntegrate[Sin[x + u], {x, 1, 2}]

However, if we substitute a value for u, the command works

In[8]:=
fn[u_Real] = NIntegrate[Sin[x + u] /. u -> 0, {x, 1, 2}]

Out[8]=
0.956449

Best regards,
/J.M.


  • Prev by Date: Re: Abs[ ] traditional form
  • Next by Date: Re: Why this function does not return a single value
  • Previous by thread: Re: Hold[] ReleaseHold[] ? or what ?
  • Next by thread: Latex & Mathematica