Re: Using NDSolve in NonlinearFit

*To*: mathgroup at smc.vnet.net*Subject*: [mg48810] Re: [mg48771] Using NDSolve in NonlinearFit*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Thu, 17 Jun 2004 04:07:22 -0400 (EDT)*References*: <200406160854.EAA12153@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

On 16 Jun 2004, at 17:54, Dr. Ernst H.K. Stelzer wrote: > 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 The problem you are experiencing is due to the fact that when you call NonlinearFit[data, f[cc, x1, x2, x3, x5], cc, {{x1, 1.1}, {x2, 1.2}, {x3, 0.9}, {x5, 9}}] NonlinearFit attempts to evaluate f[cc, x1, x2, x3, x5] with symbolic values, which of course can't be done. One can try to fix it using a defintion of the form f[cc_?NumericQ, x1_?NumericQ, x2_?NumericQ, x3_?NumericQ, x5_?NumericQ] := .... but in any case this looks unlikely to work well. However, your problem is very easy to Solve in a much simpler way, since actually your differential equation can be solved exacly using DSolve. I am including below my modification of your code (in InputForm and with all outputs except the last one deleted) which differs from your original only in that I use DSolve instead of NDSolve, = instead of := in the defintion of f, and FindFit instead of NonLinearFit. Of course the latter also would work. Andrzej Kozlowski Chiba, Japan http://www.mimuw.edu.pl/~akoz/ ------------------------------------------------------------------------ ----------------------- models = {Derivative[1][n0][c] == (-a00a)*(n0[c] - b0), Derivative[1][n0a][c] == a00a*(n0[c] - b0) - a01*n0a[c], Derivative[1][n1][c] == a01*n0a[c] - a11*n1[c], n0[0] == n00, n0a[0] == n0a0, n1[0] == n10}; parms = {a00a :> 1, b0 :> 1, a01 :> 1, a11 :> 1, n00 :> 10, n0a0 :> 5, n10 :> 3}; sol1 = DSolve[Evaluate[models /. parms], {n0[c], n0a[c], n1[c]}, c] Plot[Evaluate[{n0[c], n0a[c], n1[c]} /. sol1], {c, 0, 10}, AxesLabel -> {"[c]", "[#]"}]; data = Table[{c, First[Evaluate[n0[c] /. sol1] + Random[Real, {-1, 1}]]}, {c, 0, 10, 0.2}]; ListPlot[data] vars = {a00a -> x1, b0 -> x2, a01 -> x3, n00 -> x5}; values = {a00a :> 1, b0 :> 1, a01 :> 1, a11 :> 1, n00 :> 10, n0a0 :> 5, n10 :> 3}; mdls = models /. vars /. values f[cc_, x1_, x2_, x3_, x5_] = Module[{sol1}, sol1 = DSolve[{Derivative[1][n0][c] == (-x1)*(-x2 + n0[c]), Derivative[1][n0a][c] == x1*(-x2 + n0[c]) - x3*n0a[c], Derivative[1][n1][c] == x3*n0a[c] - n1[c], n0[0] == x5, n0a[0] == 5, n1[0] == 3}, {n0[c], n0a[c], n1[c]}, c]; First[Evaluate[n0[c] /. sol1]] /. c -> cc] N[f[1, 1, 1, 1, 10]] FindFit[data, f[cc, x1, x2, x3, x5], {{x1, 1.1}, {x2, 1.2}, {x3, 0.9}, {x5, 9}}, {cc}] {x1 -> 1.04338, x2 -> 1.07025, x3 -> 0.9, x5 -> 9.81829}

**References**:**Using NDSolve in NonlinearFit***From:*"Dr. Ernst H.K. Stelzer" <stelzer@embl-heidelberg.de>