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\ > \[Ellipsis]\\\", ButtonStyle->\\\"RefGuideLinkText\\\", \ > 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]\\\", \ > ButtonStyle->\\\"RefGuideLinkText\\\", ButtonFrame->None, \ > 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]\\\", \ > ButtonStyle->\\\"RefGuideLinkText\\\", ButtonFrame->None, \ > 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 ]] > } > >