
Re: How to use FindMaximum with a parameter passed to NDSolve??
Posted:
Dec 18, 2012 2:34 AM


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 nonnumerical 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.01fi[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

