Re: A NDSolve within a FindMinimum/NMinimize
- To: mathgroup at smc.vnet.net
- Subject: [mg90608] Re: A NDSolve within a FindMinimum/NMinimize
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Wed, 16 Jul 2008 06:27:38 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <g5htfb$j7t$1@smc.vnet.net>
philip.ingrey at googlemail.com wrote:
> I'm trying to find the value of a coefficient that minimizes a
> function. Below is a simplified version of the problem:
> Using a Table to print out some results is fine:
>
> Table[{a, s = NDSolve[{El'[x] + a Sin[x] El[x] == 0, El[0] == a}, El,
> {x, -1, 1}]; ((El[1] /. s) a)[[1]]}, {a, -1, 1, 0.1}]
>
> But a NMinimize or FindMinimum gives errors:
>
> NMinimize[s = NDSolve[{El'[x] + a Sin[x] El[x] == 0, El[0] == a}, El,
> {x, -1, 1}]; (El[1] /. s) a, a]
>
> As it seams to try and evaluate the NDSolve then apply a value for a,
> is there a way to solve this?
Contrary to Table[], NMinimize[] has none of the attributes of the Hold*
family, so it does not prevent the evaluation of its arguments before is
own evaluation.
In[1]:= Attributes@{NMinimize, Table}
Out[1]= {{Protected, ReadProtected}, {HoldAll, Protected}}
One way of fixing this is to write a function that is called only for
numeric argument and contains your original compound expression,
possibly with the use of construct such as Module[] to localize variables.
In[2]:= f[a_?NumericQ] :=
Module[{s},
s = NDSolve[{El'[x] + a Sin[x] El[x] == 0, El[0] == a},
El, {x, -1, 1}];
First[(El[1] /. s) a]
]
NMinimize[f[a], a]
% // Chop
Out[3]= {5.54633*10^-17, {a -> -7.44737*10^-9}}
Out[4]= {0, {a -> -7.44737*10^-9}}
Regards,
-- Jean-Marc