Re: FindRoot with parameterized interpolated function from NDSolve
- To: mathgroup at smc.vnet.net
- Subject: [mg110756] Re: FindRoot with parameterized interpolated function from NDSolve
- From: danl at wolfram.com
- Date: Mon, 5 Jul 2010 06:01:18 -0400 (EDT)
> I have an interpolated function obtained > as the solution to a system of ODEs via NDSOlve. > The system and the solution depend on a number > of parameters. I then want to plug this function into > FindRoot to find the numerical solution of a system > of equations which depend on both the dependent variable > of the ODEs and the parameters. Mathematica barfs at > the use of parameters as in the following example: > > First, what works as expected: > > > In[135]:= solnn =. > > In[142]:= > solnn[a_] := > NDSolve[{x'[t] == a *y[t], y'[t] == -x[t], x[0] == 1, y[0] == 0}, {x, > y}, {t, 0, Pi}] > > In[144]:= FindRoot[(x /. solnn[1][[1]])[t] - (y /. solnn[1][[1]])[ > t] == 0, {t, 2}] > > Out[144]= {t -> 2.35619} > > > however: > > > FindRoot[{(x /. solnn[a][[1]])[t] - (y /. solnn[a][[1]])[t] == 0, > a - 1 == 0}, {{a, 0}, {t, 2}}] > > > produces, instead of the expected > > {a->1., t->2.355619}, > > lots of error messages to the effect that NDSolve has encountered non- > numerical initial values etc > > Is there any other way to use FindRoot for the purpose I am trying to > use it? It is best done by restricting some functions to numeric arguments. That way FindRoot will not try to evaluate symbolic things for which it does not have numeric parameter values. solnn[a_?NumericQ] := {x, y} /. First[NDSolve[{x'[t] == a*y[t], y'[t] == -x[t], x[0] == 1, y[0] == 0}, {x, y}, {t, 0, Pi}]] eqn[a_?NumericQ, t_?NumericQ] := With[{sol = solnn[a]}, sol[[1]][t] - sol[[2]][t]] In[85]:= FindRoot[{eqn[a, tt] == 0, a - 1 == 0}, {{a, 0}, {tt, 2}}] Out[85]= {a -> 1., tt -> 2.35619} Daniel Lichtblau Wolfram Research