Re: FindRoot with parameterized interpolated function from NDSolve
- To: mathgroup at smc.vnet.net
- Subject: [mg110759] Re: FindRoot with parameterized interpolated function from NDSolve
- From: Peter Pein <petsie at dordos.net>
- Date: Mon, 5 Jul 2010 06:01:52 -0400 (EDT)
- References: <i0pmlc$slv$1@smc.vnet.net>
Am Sun, 4 Jul 2010 10:09:48 +0000 (UTC)
schrieb Ulvi Yurtsever <a at b.c>:
> 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?
>
Define an auxilliary function which evaluates iff a _and_ t have got
numeric values (I changed solnn a bit for better handling):
In[1]:= Clear[solnn,x,y];
solnn[a_?NumericQ] :=
Block[{t},
First[
NDSolve[{x'[t] == a*y[t], y'[t] == -x[t], x[0]==1, y[0] == 0},
{x, y}, {t, 0, Pi}]
]]
In[3]:= FindRoot[x[t] - y[t] == 0 /. solnn[1], {t ,2}]
Out[3]= {t->2.35619}
In[4]:= target[a_?NumericQ, t_?NumericQ] := x[t] - y[t] /. solnn[a]
In[5]:= FindRoot[{target[a, t] == 0, a - t/3 == 0},
{{a, 0}, {t, 2, 0, Pi}}]
Out[5]= {a->0.860285,t->2.58085}
Peter