       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 == a}, El,
> {x, -1, 1}]; ((El /. s) a)[]}, {a, -1, 1, 0.1}]
>
> But a NMinimize or FindMinimum gives errors:
>
> NMinimize[s = NDSolve[{El'[x] + a Sin[x] El[x] == 0, El == a}, El,
> {x, -1, 1}]; (El  /. 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:= Attributes@{NMinimize, Table}

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:= f[a_?NumericQ] :=
Module[{s},
s = NDSolve[{El'[x] + a Sin[x] El[x] == 0, El == a},
El, {x, -1, 1}];
First[(El /. s) a]
]

NMinimize[f[a], a]
% // Chop

Out= {5.54633*10^-17, {a -> -7.44737*10^-9}}

Out= {0, {a -> -7.44737*10^-9}}

Regards,
-- Jean-Marc

```

• Prev by Date: Solve[] doesn't
• Next by Date: Re: WorldPlot, WorldRotation... with a twist?
• Previous by thread: Re: A NDSolve within a FindMinimum/NMinimize
• Next by thread: Re: A NDSolve within a FindMinimum/NMinimize