Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

Topic: How to use FindMaximum with a parameter passed to NDSolve??
Replies: 5   Last Post: Dec 19, 2012 4:56 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Bob Hanlon

Posts: 892
Registered: 10/29/11
Re: How to use FindMaximum with a parameter passed to NDSolve??
Posted: Dec 18, 2012 2:34 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

Since pendulum uses NDSolve it can only be evaluated for a numeric
argument; consequently, its definition should be restricted to numeric
arguments. You will also need to use a higher precision than machine
precision.

eqns = Rationalize[{
fi''[t] + 9.8 Cos[long] Sin[fi[t]] +
.5 fi'[t] == 0, fi[0] == Pi/2, fi'[0] == 0}, 0];

pendulum[long_?NumericQ] := First[fi /. NDSolve[
eqns, fi, {t, 0, 50}, WorkingPrecision -> 25]]

total[dynamics_, p_] := dynamics[31/10] + p

max = FindMaximum[{total[pendulum[long], long]},
{long, 0.01`30}, WorkingPrecision -> 30];

max /. x_?NumericQ :> Round[x, 10.^-6]

{13.3595, {long -> 9.81034}}


Bob Hanlon


On Mon, Dec 17, 2012 at 2:58 AM, JBB <barandiaran.juan@gmail.com> wrote:
> Hello,
>
> This is probably a simple sintax question, but could somebody tell me how can I use the FindMaximum function when the variable used has to be used in an internal NDSolve??
>
> A simplified version of some code to show the error is as follows:
>
> pendulum[long_] :=
> First[fi /.
> NDSolve[{fi''[t] + 9.8 Cos[long] Sin[fi[t]] + .5 fi'[t] == 0,
> fi[0] == Pi/2, fi'[0] == 0}, fi, {t, 0, 50}]]
>
> total[dynamics_, p_] := dynamics[3.1] + p
>
> FindMaximum[{total[pendulum[long], long ] }, {long, 0.01}]
>
> I get the following error:
>
> In[146]:= FindMaximum[
> Evaluate[total[pendulum[long], long ] ], {long, 0.01}]
>
> During evaluation of In[146]:= NDSolve::ndnum: Encountered non-numerical value for a derivative at t == 0.`. >>
>
> During evaluation of In[146]:= ReplaceAll::reps: {NDSolve[{9.8 Cos[long] Sin[fi[<<1>>]]+0.5 (fi^\[Prime])[t]+(fi^\[Prime]\[Prime])[t]==0,fi[0]==\[Pi]/2,(fi^\[Prime])[0]==0},fi,{t,0,50}]} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing. >>
>
> During evaluation of In[146]:= FindMaximum::nrnum: The function value -0.01-fi[3.1] is not a real number at {long} = {0.01}. >>
>
> Out[146]= FindMaximum[long + fi[3.1], {long, 0.01}]
>
> If I understand correctly, probably because the variable "long" has not been assigned a value by FindMaximum before calling the internal NDSolve.
>
> Is there a simple way of doing this?
> In my real case the functions are longer but the essence of the problem is the same: I have to find the maximum of some function in which the variables are parameters of other functions including a NDSolve.
>
> Thanks for any hint,
>
> JBB





Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.