Re: Using NDSolve in NonlinearFit

• To: mathgroup at smc.vnet.net
• Subject: [mg48797] Re: Using NDSolve in NonlinearFit
• From: "Jens-Peer Kuska" <kuska at informatik.uni-leipzig-de>
• Date: Wed, 16 Jun 2004 07:48:59 -0400 (EDT)
• Organization: Uni Leipzig
• References: <cap36v\$c82\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Hi,

what is with:
fun[omega_?NumericQ, x_?NumericQ] :=
Module[{t, sol},
sol = NDSolve[
{y1'[t] == y2[t],
y2'[t] == -omega^2*y1[t],

y1[0] == 0, y2[0] == omega},

{y1[t], y2[t]},
{t, 0, x}];
y1[t] /. sol[[1]] /. t -> x
]

data = Table[{x, Sin[2*x]}, {x, 0, 2Pi, 2Pi/256}];

FindFit[data, fun[omega, x], {{omega, 2.2}}, x]

Regards
Jens

"Dr. Ernst H.K. Stelzer" <stelzer at embl-heidelberg.de> schrieb im Newsbeitrag
news:cap36v\$c82\$1 at smc.vnet.net...
> Hi,
>
> I have been trying to use NDSolve inside various Fitting routines
> (NonlinearFit, FindFit, ...).  Although the NDSolve works fine both inside
> and outside a Module wrapper once inside a "fit"-function the variables
are
> never resolved.  At least the Print inside the function returns names
rather
> than numbers??
>
> What is my mistake?
> Has anybody solved this problem differently?
>
> I do not wish to write a new Fit-function and search myslef if it can be
> avoided.  The text below is copied as CellFormat and can be inserted and
> interpreted in any Mathematica Notebook.
>
> Sincerely
>
>        Ernst
>
> --------------------------------------------------------------------
>   Dr. Ernst H.K. Stelzer                 Tel: +49 (6221) 387354
>   Scientific Groupleader                 Fax: +49 (6221) 387306
>   Cell Biology and Biophysics Programme
>   EMBL
>   European Molecular Biology Laboratory
>   Meyerhofstrasse 1                      Postfach 10 22 09
>   69117 Heidelberg                       69012 Heidelberg
>
>   e-mail: mailto:stelzer at embl-heidelberg.de
>   http://www.embl.de/ExternalInfo/stelzer/index.html
>   http://www.embl.de/ExternalInfo/stelzer/frames.html?publications
> --------------------------------------------------------------------
>
> {
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"models", " ", "=", " ",
>         RowBox[{"{", "\[IndentingNewLine]",
>           RowBox[{
>             RowBox[{
>               RowBox[{
>                 RowBox[{"n0", "'"}], "[", "c", "]"}], "\[Equal]",
>               RowBox[{
>                 RowBox[{"-", "a00a"}],
>                 RowBox[{"(", " ",
>                   RowBox[{
>                     RowBox[{"n0", "[", "c", "]"}], "-", "b0"}],
>                   ")"}]}]}], ",", "\[IndentingNewLine]",
>             RowBox[{
>               RowBox[{
>                 RowBox[{"n0a", "'"}], "[", "c", "]"}], "==",
>               RowBox[{
>                 RowBox[{"a00a",
>                   RowBox[{"(", " ",
>                     RowBox[{
>                       RowBox[{"n0", "[", "c", "]"}], "-", "b0"}],
>                     ")"}]}], "-",
>                 RowBox[{"a01", " ",
>                   RowBox[{"n0a", "[", "c", "]"}]}]}]}], ",", " ",
>             "\[IndentingNewLine]",
>             RowBox[{
>               RowBox[{
>                 RowBox[{"n1", "'"}], "[", "c", "]"}], "\[Equal]",
>               RowBox[{
>                 RowBox[{"a01", " ",
>                   RowBox[{"n0a", "[", "c", "]"}]}], "-",
>                 RowBox[{"a11", " ",
>                   RowBox[{"n1", "[", "c", "]"}]}]}]}], ",",
>             "\[IndentingNewLine]",
>             RowBox[{
>               RowBox[{"n0", "[", "0", "]"}], "\[Equal]", "n00"}], ",",
>
>             RowBox[{
>               RowBox[{"n0a", "[", "0", "]"}], "\[Equal]", "n0a0"}],
>             ",",
>             RowBox[{
>               RowBox[{"n1", "[", "0", "]"}], "==", "n10"}]}],
>           "\[IndentingNewLine]", "}"}]}], ";"}]], "Input",
>   CellLabel->"In[9]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"parms", " ", "=", " ",
>         RowBox[{"{",
>           RowBox[{
>             RowBox[{"a00a", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"b0", " ", "\[RuleDelayed]", " ", "1"}], ",", " ",
>
>             RowBox[{"a01", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"a11", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"n00", " ", "\[RuleDelayed]", " ", "10"}], ",",
>             " ",
>             RowBox[{"n0a0", " ", "\[RuleDelayed]", " ", "5"}], ",",
>             " ",
>             RowBox[{"n10", " ", "\[RuleDelayed]", " ", "3"}]}],
>           "}"}]}], ";"}]], "Input",
>   CellLabel->"In[10]:="],
>
> Cell[CellGroupData[{
>
> Cell[BoxData[
>     RowBox[{"sol1", "=",
>       RowBox[{"NDSolve", "[",
>         RowBox[{
>           RowBox[{"Evaluate", "[",
>             RowBox[{"models", "/.", "parms"}], "]"}], ",",
>           RowBox[{"{",
>             RowBox[{
>               RowBox[{"n0", "[", "c", "]"}], ",",
>               RowBox[{"n0a", "[", "c", "]"}], ",",
>               RowBox[{"n1", "[", "c", "]"}]}], "}"}], ",",
>           RowBox[{"{",
>             RowBox[{"c", ",", " ", "0", ",", " ", "10"}], "}"}]}],
>         "]"}]}]], "Input",
>   CellLabel->"In[11]:="],
>
> Cell[BoxData[
>     RowBox[{"{",
>       RowBox[{"{",
>         RowBox[{
>           RowBox[{
>             RowBox[{"n0", "[", "c", "]"}], "\[Rule]",
>             RowBox[{
>               TagBox[
>                 RowBox[{"InterpolatingFunction", "[",
>                   RowBox[{
>                     RowBox[{"{",
>                       RowBox[{"{",
>                         RowBox[{"0.`", ",", "10.`"}], "}"}], "}"}],
>                     ",", "\<\"<>\"\>"}], "]"}],
>                 False,
>                 Editable->False], "[", "c", "]"}]}], ",",
>           RowBox[{
>             RowBox[{"n0a", "[", "c", "]"}], "\[Rule]",
>             RowBox[{
>               TagBox[
>                 RowBox[{"InterpolatingFunction", "[",
>                   RowBox[{
>                     RowBox[{"{",
>                       RowBox[{"{",
>                         RowBox[{"0.`", ",", "10.`"}], "}"}], "}"}],
>                     ",", "\<\"<>\"\>"}], "]"}],
>                 False,
>                 Editable->False], "[", "c", "]"}]}], ",",
>           RowBox[{
>             RowBox[{"n1", "[", "c", "]"}], "\[Rule]",
>             RowBox[{
>               TagBox[
>                 RowBox[{"InterpolatingFunction", "[",
>                   RowBox[{
>                     RowBox[{"{",
>                       RowBox[{"{",
>                         RowBox[{"0.`", ",", "10.`"}], "}"}], "}"}],
>                     ",", "\<\"<>\"\>"}], "]"}],
>                 False,
>                 Editable->False], "[", "c", "]"}]}]}], "}"}],
>       "}"}]], "Output",
>   CellLabel->"Out[11]="]
> }, Open  ]],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"Plot", "[",
>         RowBox[{
>           RowBox[{"Evaluate", "[",
>             RowBox[{
>               RowBox[{"{",
>                 RowBox[{
>                   RowBox[{"n0", "[", "c", "]"}], ",", " ",
>                   RowBox[{"n0a", "[", "c", "]"}], ",", " ",
>                   RowBox[{"n1", "[", "c", "]"}]}], "}"}], "/.",
>               "sol1"}], "]"}], ",", " ",
>           RowBox[{"{",
>             RowBox[{"c", ",", " ", "0", ",", " ", "10"}], "}"}], ",",
>           " ",
>           RowBox[{"AxesLabel", "\[Rule]",
>             RowBox[{"{",
>               RowBox[{"\"\<[c]\>\"", ",", " ", "\"\<[#]\>\""}],
>               "}"}]}]}], "]"}], ";"}]], "Input",
>   CellLabel->"In[12]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"data", " ", "=", " ",
>         RowBox[{"Table", "[",
>           RowBox[{
>             RowBox[{"{",
>               RowBox[{"c", ",", " ",
>                 RowBox[{"First", "[",
>                   RowBox[{
>                     RowBox[{"Evaluate", "[",
>                       RowBox[{
>                         RowBox[{"n0", "[", "c", "]"}], "/.", "sol1"}],
>                        "]"}], " ", "+", " ",
>                     RowBox[{"Random", "[",
>                       RowBox[{"Real", ",",
>                         RowBox[{"{",
>                           RowBox[{
>                             RowBox[{"-", "1"}], ",", " ", "1"}],
>                           "}"}]}], "]"}]}], "]"}]}], "}"}], ",", " ",
>
>             RowBox[{"{",
>               RowBox[{
>               "c", ",", " ", "0", ",", " ", "10", ",", " ", "0.2"}],
>               "}"}]}], "]"}]}], ";"}]], "Input",
>   CellLabel->"In[13]:="],
>
> Cell[CellGroupData[{
>
> Cell[BoxData[
>     RowBox[{"ListPlot", "[", "data", "]"}]], "Input",
>   CellLabel->"In[14]:="],
>
> Cell[BoxData[
>     TagBox[
>       RowBox[{
>       "\[SkeletonIndicator]", "Graphics", "\[SkeletonIndicator]"}],
>       False,
>       Editable->False]], "Output",
>   CellLabel->"Out[14]="]
> }, Open  ]],
>
> Cell[BoxData[
>     RowBox[{"<<", "Statistics`NonlinearFit`"}]], "Input",
>   CellLabel->"In[3]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"vars", " ", "=", " ",
>         RowBox[{"{",
>           RowBox[{
>             RowBox[{"a00a", " ", "\[Rule]", " ", "x1"}], ",", " ",
>             RowBox[{"b0", " ", "\[Rule]", " ", "x2"}], ",", " ",
>             RowBox[{"a01", " ", "\[Rule]", " ", "x3"}], ",", " ",
>             RowBox[{"n00", " ", "\[Rule]", " ", "x5"}]}], "}"}]}],
>       ";"}]], "Input",
>   CellLabel->"In[15]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"values", " ", "=", " ",
>         RowBox[{"{",
>           RowBox[{
>             RowBox[{"a00a", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"b0", " ", "\[RuleDelayed]", " ", "1"}], ",", " ",
>
>             RowBox[{"a01", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"a11", " ", "\[RuleDelayed]", " ", "1"}], ",",
>             " ",
>             RowBox[{"n00", " ", "\[RuleDelayed]", " ", "10"}], ",",
>             " ",
>             RowBox[{"n0a0", " ", "\[RuleDelayed]", " ", "5"}], ",",
>             " ",
>             RowBox[{"n10", " ", "\[RuleDelayed]", " ", "3"}]}],
>           "}"}]}], ";"}]], "Input",
>   CellLabel->"In[16]:="],
>
> Cell[CellGroupData[{
>
> Cell[BoxData[
>     RowBox[{"mdls", " ", "=", " ",
>       RowBox[{
>         RowBox[{"models", "/.", "vars"}], "/.",
>         "values"}]}]], "Input",
>   CellLabel->"In[17]:="],
>
> Cell[BoxData[
>     RowBox[{"{",
>       RowBox[{
>         RowBox[{
>           RowBox[{
>             SuperscriptBox["n0", "\[Prime]",
>               MultilineFunction->None], "[", "c", "]"}], "\[Equal]",
>           RowBox[{
>             RowBox[{"-", "x1"}], " ",
>             RowBox[{"(",
>               RowBox[{
>                 RowBox[{"-", "x2"}], "+",
>                 RowBox[{"n0", "[", "c", "]"}]}], ")"}]}]}], ",",
>         RowBox[{
>           RowBox[{
>             SuperscriptBox["n0a", "\[Prime]",
>               MultilineFunction->None], "[", "c", "]"}], "\[Equal]",
>           RowBox[{
>             RowBox[{"x1", " ",
>               RowBox[{"(",
>                 RowBox[{
>                   RowBox[{"-", "x2"}], "+",
>                   RowBox[{"n0", "[", "c", "]"}]}], ")"}]}], "-",
>             RowBox[{"x3", " ",
>               RowBox[{"n0a", "[", "c", "]"}]}]}]}], ",",
>         RowBox[{
>           RowBox[{
>             SuperscriptBox["n1", "\[Prime]",
>               MultilineFunction->None], "[", "c", "]"}], "\[Equal]",
>           RowBox[{
>             RowBox[{"x3", " ",
>               RowBox[{"n0a", "[", "c", "]"}]}], "-",
>             RowBox[{"n1", "[", "c", "]"}]}]}], ",",
>         RowBox[{
>           RowBox[{"n0", "[", "0", "]"}], "\[Equal]", "x5"}], ",",
>         RowBox[{
>           RowBox[{"n0a", "[", "0", "]"}], "\[Equal]", "5"}], ",",
>         RowBox[{
>           RowBox[{"n1", "[", "0", "]"}], "\[Equal]", "3"}]}],
>       "}"}]], "Output",
>   CellLabel->"Out[17]="]
> }, Open  ]],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"f", "[",
>         RowBox[{
>         "cc_", ",", " ", "x1_", ",", " ", "x2_", ",", " ", "x3_", ",",
>            " ", "x5_"}], "]"}], " ", ":=", " ",
>       RowBox[{"Module", "[",
>         RowBox[{
>           RowBox[{"{", "sol1", "}"}], ",", " ",
>           RowBox[{
>             RowBox[{"Print", "[",
>               RowBox[{
>               "cc", ",", " ", "\"\<, \>\"", ",", " ", "x2", ",", " ",
>                 "\"\<, \>\"", ",", " ", "x5"}], "]"}], ";",
>             RowBox[{"sol1", "=",
>               RowBox[{"NDSolve", "[", "\[IndentingNewLine]",
>                 RowBox[{
>                   RowBox[{"{", "\[IndentingNewLine]",
>                     RowBox[{
>                       RowBox[{
>                         RowBox[{
>                           SuperscriptBox["n0", "\[Prime]",
>                             MultilineFunction->None], "[", "c", "]"}],
>                          "\[Equal]",
>                         RowBox[{
>                           RowBox[{"-", "x1"}], " ",
>                           RowBox[{"(",
>                             RowBox[{
>                               RowBox[{"-", "x2"}], "+",
>                               RowBox[{"n0", "[", "c", "]"}]}],
>                             ")"}]}]}], ",",
>                       RowBox[{
>                         RowBox[{
>                           SuperscriptBox["n0a", "\[Prime]",
>                             MultilineFunction->None], "[", "c", "]"}],
>                          "\[Equal]",
>                         RowBox[{
>                           RowBox[{"x1", " ",
>                             RowBox[{"(",
>                               RowBox[{
>                                 RowBox[{"-", "x2"}], "+",
>                                 RowBox[{"n0", "[", "c", "]"}]}],
>                               ")"}]}], "-",
>                           RowBox[{"x3", " ",
>                             RowBox[{"n0a", "[", "c", "]"}]}]}]}], ",",
>
>                       RowBox[{
>                         RowBox[{
>                           SuperscriptBox["n1", "\[Prime]",
>                             MultilineFunction->None], "[", "c", "]"}],
>                          "\[Equal]",
>                         RowBox[{
>                           RowBox[{"x3", " ",
>                             RowBox[{"n0a", "[", "c", "]"}]}], "-",
>                           RowBox[{"n1", "[", "c", "]"}]}]}], ",",
>                       RowBox[{
>                         RowBox[{"n0", "[", "0", "]"}], "\[Equal]",
>                         "x5"}], ",",
>                       RowBox[{
>                         RowBox[{"n0a", "[", "0", "]"}], "\[Equal]",
>                         "5"}], ",",
>                       RowBox[{
>                         RowBox[{"n1", "[", "0", "]"}], "\[Equal]",
>                         "3"}]}], "\[IndentingNewLine]", "}"}], ",",
>                   RowBox[{"{",
>                     RowBox[{
>                       RowBox[{"n0", "[", "c", "]"}], ",",
>                       RowBox[{"n0a", "[", "c", "]"}], ",",
>                       RowBox[{"n1", "[", "c", "]"}]}], "}"}], ",",
>                   RowBox[{"{",
>                     RowBox[{"c", ",", " ", "0", ",", " ", "10"}],
>                     "}"}]}], "]"}]}], ";", " ",
>             RowBox[{
>               RowBox[{"First", "[",
>                 RowBox[{"Evaluate", "[",
>                   RowBox[{
>                     RowBox[{"n0", "[", "c", "]"}], "/.", "sol1"}],
>                   "]"}], "]"}], "/.",
>               RowBox[{"c", "\[Rule]", " ", "cc"}]}]}]}],
>         "\[IndentingNewLine]", "]"}]}]], "Input",
>   CellLabel->"In[18]:="],
>
> Cell[CellGroupData[{
>
> Cell[BoxData[
>     RowBox[{"f", "[",
>       RowBox[{
>       "1", ",", " ", "1", ",", " ", "1", ",", " ", "1", ",", " ",
>         "10"}], "]"}]], "Input",
>   CellLabel->"In[19]:="],
>
> Cell[BoxData[
>     InterpretationBox[
>       RowBox[{
>       "1", "\[InvisibleSpace]", "\<\", \"\>", "\[InvisibleSpace]",
>         "1", "\[InvisibleSpace]", "\<\", \"\>", "\[InvisibleSpace]",
>         "10"}],
>       SequenceForm[ 1, ", ", 1, ", ", 10],
>       Editable->False]], "Print",
>   CellLabel->"From In[19]:="],
>
> Cell[BoxData["4.3109149874187755`"], "Output",
>   CellLabel->"Out[19]="]
> }, Open  ]],
>
> Cell[CellGroupData[{
>
> Cell[BoxData[
>     RowBox[{"NonlinearFit", "[",
>       RowBox[{"data", ",",
>         RowBox[{"f", "[",
>           RowBox[{
>           "cc", ",", " ", "x1", ",", " ", "x2", ",", " ", "x3", ",",
>             " ", "x5"}], "]"}], ",", " ", "cc", ",",
>         "\[IndentingNewLine]",
>         RowBox[{"{",
>           RowBox[{
>             RowBox[{"{",
>               RowBox[{"x1", ",", "1.1"}], "}"}], ",", " ",
>             RowBox[{"{",
>               RowBox[{"x2", ",", " ", "1.2"}], "}"}], ",",
>             RowBox[{"{",
>               RowBox[{"x3", ",", " ", "0.9"}], "}"}], ",",
>             RowBox[{"{",
>               RowBox[{"x5", ",", "9"}], "}"}]}], "}"}]}],
>       "]"}]], "Input",
>   CellLabel->"In[21]:="],
>
> Cell[BoxData[
>     InterpretationBox[
>       RowBox[{
>       "cc", "\[InvisibleSpace]", "\<\", \"\>", "\[InvisibleSpace]",
>         "x2", "\[InvisibleSpace]", "\<\", \"\>", "\[InvisibleSpace]",
>         "x5"}],
>       SequenceForm[ cc, ", ", x2, ", ", x5],
>       Editable->False]], "Print",
>   CellLabel->"From In[21]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"NDSolve", "::", "\<\"ndinnt\"\>"}],
>       RowBox[{
>       ":", " "}], "\<\"Initial condition \\!\\(x5\\) is not a number \
> or a rectangular array of numbers. \\!\\(\\*ButtonBox[\\\"More\
> ButtonFrame->None, ButtonData:>\\\"NDSolve::ndinnt\\\"]\\)\"\>"}]], \
> "Message",
>   CellLabel->"From In[21]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"ReplaceAll", "::", "\<\"reps\"\>"}],
>       RowBox[{
>       ":", " "}], "\<\"\\!\\({\\(NDSolve[\\(\\(\[LeftSkeleton] 1 \
> \[RightSkeleton]\\)\\)]\\)}\\) is neither a list of replacement rules \
> nor a valid dispatch table, and so cannot be used for replacing. \
> \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", \
> ButtonData:>\\\"ReplaceAll::reps\\\"]\\)\"\>"}]], "Message",
>   CellLabel->"From In[21]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"FindFit", "::", "\<\"nlnum\"\>"}],
>       RowBox[{
>       ":", " "}], "\<\"The function value \
> \\!\\({\\(\\(\\(\\(-9.931660812424306`\\)\\) + \\(\\(n0[0.`]\\)\\)\\)\
> \\), \\(\\(\\(\\(-9.015163674620991`\\)\\) + \
> \\(\\(n0[0.2`]\\)\\)\\)\\), \\(\\(\[LeftSkeleton] 7 \
> \[RightSkeleton]\\)\\), \\(\\(\\(\\(-2.2641341584217156`\\)\\) + \
> \\(\\(n0[1.8`]\\)\\)\\)\\), \\(\\(\[LeftSkeleton] 41 \[RightSkeleton]\
> \\)\\)}\\) is not a list of numbers with dimensions \\!\\({51}\\) at \
> \\!\\({x1, x2, x3, x5}\\) = \\!\\({1.1`, 1.2`, 0.9`, 9.`}\\). \
> \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", \
> ButtonData:>\\\"General::nlnum\\\"]\\)\"\>"}]], "Message",
>   CellLabel->"From In[21]:="],
>
> Cell[BoxData[
>     RowBox[{
>       RowBox[{"NonlinearFit", "::", "\<\"fitfail\"\>"}],
>       RowBox[{
>       ":", " "}], "\<\"The fitting algorithm failed.\"\>"}]], \
> "Message",
>   CellLabel->"From In[21]:="]
> }, Open  ]]
> }
>
>

```

• Prev by Date: Re: (**) comments highlighted - newbie
• Next by Date: Question about Hold
• Previous by thread: Re: Using NDSolve in NonlinearFit
• Next by thread: Re: Using NDSolve in NonlinearFit