MathGroup Archive 1999

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

Search the Archive

Re: using FindMinimum to minimize a function involving NIntegrate

  • To: mathgroup at smc.vnet.net
  • Subject: [mg15577] Re: [mg15483] using FindMinimum to minimize a function involving NIntegrate
  • From: jtischer at col2.telecom.com.co (Cl-Jurgen Tischer)
  • Date: Tue, 26 Jan 1999 13:44:52 -0500 (EST)
  • Organization: Universidad del Valle
  • References: <199901180922.EAA20755@smc.vnet.net.>
  • Sender: owner-wri-mathgroup at wolfram.com

Albert,
essentially the only change you have to make is to protect e.e from
being evaluated with symbols instead of numbers. (I think FindMinimum
first tries to simplify the expression.) So change the definition of e
by 

e[t1_?NumericQ,t2_,l1_,l2_]:= prop-{p[t1],p[t2],pp[t2,t1,l1 l2]}

and here you are:

In[1]:= FindMinimum[
 
e[t1,t2,l1,l2].e[t1,t2,l1,l2],{t1,{-.95,-.9}},{t2,{-.3,-.4}},{l1,{.4,.5}},{
    l2,{.5,.6}}]

Out[1]= {0.00002806538169368238, 
  {t1 -> -0.9616702160148866, t2 -> -0.3170739825593457, 
   l1 -> 0.9244179012730739, l2 -> 0.5000000007597158}}

As you see, I didn't bother to check the gradient, so I had to give two
start values. By the way, it took a while for Mathematica to calculate
the minimum (70 seconds), so relax.

Jurgen

Albert Maydeu-Olivares wrote:
> 
> Hi, everyone
> 
> I can't get FindMinimum to work when the function to be minimized
> involves numerical integrals.
> Any suggestions would be most welcome.
> 
> I enclose a typical example: I'm trying to minimize     e .e where e =
>         {data1-definite integral of a univariate normal distribution,
>                 data2- definite integral of a univariate normal distribution,
>                 data3- definite integral of a bivariatye normal distribution} using
> Newton's method.
> 
> Below is the code. The gradient is correct.
> 
> In[1]:=
> dens[x_]=1/(E^(x^2/2)*Sqrt[2*Pi]);
> p[h_]:=Module[{x},NIntegrate[dens[x],{x,h,Infinity}]] dens2[h_,k_,x_]=
> 1/(2*E^((h^2 + k^2 - 2*h*k*x)/(2*(1 - x^2)))*Pi*Sqrt[1 - x^2]);
> pp[h_,k_,r_]:=  Module[{x},
>     NIntegrate[dens2[h,k,x],{x,0,r},PrecisionGoal->10]+p[h] p[k]]
> 
> In[3]:=
> nvars=2;ncorr=1;
> prop={.828,.628,.567};
> t={t1,t2};
> r={l1 *l2};
> gradient={{-dens[t1],0,0,0},
>         {0,-dens[t2],0,0},
>         {dens[t1]*(-1 + Erf[(-(l1*l2*t1) + t2)/Sqrt[2 - 2*l1^2*l2^2]])/2,
>          dens[t2]* (-1 + Erf[(t1 - l1*l2*t2)/Sqrt[2 - 2*l1^2*l2^2]])/2,
>          dens2[t1,t2,l1*l2]*l2,       dens2[t1,t2,l1*l2]*l1}};
> 
> In[4]:=
> e := prop-{p[t[[1]]],p[t[[2]]],pp[t[[2]],t[[1]],r[[1]]]} ; FindMinimum[e
> . e, {t1,-.95},{t2,-.4},{l1,.5},{l2,.6},
>                 Gradient->gradient, Method->Newton]
> 
> Out[4]=
> "Could not symbolically find the gradient of (e . e)
>  Try giving two starting values for each variable."
> 
> I believe the error message given by FindMinimum is misleading.
> 
> Trying to figure out what's going on, I specify the problem using
> Integrate and then
> numerically evaluating the integrals inside FindMinimum. It did not work
> either.
> It just sit there.
> 
> In[11]:=
> p2[h_]:=Integrate[dens[x],{x,h,Infinity}]
> pp2[h_,k_,r_]:=Integrate[dens2[h,k,x],{x,0,r}]+p[h] p[k]
> 
> e2 := prop-{p2[t[[1]]],p2[t[[2]]],pp2[t[[2]],t[[1]],r[[1]]]} ;
> FindMinimum[N[e2 . e2], {t1,-.95},{t2,-.4},{l1,.5},{l2,.6},
> 
> --
> 
> Albert Maydeu-Olivares                  Tel. +34 3 4021079 ext. 3099 Faculty of
> Psychology                      Fax. +34 3 4021362 University of Barcelona                      E-Mail:
> amaydeu at tinet.fut.es Passeig de la Vall d'Hebron, 171.
> 08035 - Barcelona (Spain)



  • Prev by Date: Re: a tricky limit
  • Next by Date: Re: Special characters
  • Previous by thread: using FindMinimum to minimize a function involving NIntegrate
  • Next by thread: Re: using FindMinimum to minimize a function involving NIntegrate