MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: How to make fitting code using NDSolve?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127767] Re: How to make fitting code using NDSolve?
  • From: "Kevin J. McCann" <kjm at KevinMcCann.com>
  • Date: Mon, 20 Aug 2012 21:29:23 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net
  • References: <k0sroq$jn4$1@smc.vnet.net>

There are a couple of problems below.One is that you have a number of 
subscripted variables that need to be Symbolized first. Also, your call 
of model in FindFit has both the variables as inputs (ok), and the 
desired output, but the latter is not defined as an output in your 
definition of model.

I prefer to roll my own lsq rather than use FindFit, and have included a 
notebook under separate email. Hope this helps.

Kevin

On 8/20/2012 4:16 AM, JYeom wrote:
> Hello,
> I am trying to fit some basic data to a partial differential equation- here are the data points:
>
> data = {
>    {2.113, 2.915*^-7}, {2.256, 2.758*^-7}, {2.303, 2.567*^-7}, {2.493,
>     2.343*^-7}, {2.635, 2.085*^-7}, {2.825, 1.838*^-7}, {3.015,
>     1.614*^-7}, {3.205, 1.412*^-7}, {3.538, 1.199*^-7}, {3.775,
>     1.03*^-7}, {4.108, 8.173*^-8}, {4.487, 6.266*^-8}, {4.915,
>     4.695*^-8}, {5.295, 3.349*^-8}, {5.912, 2.34*^-8}, {6.672,
>     1.554*^-8}, {7.527, 7.692*^-9}, {8.524, 5.448*^-9}, {9.426,
>     4.326*^-9}, {10.23, 3.205*^-9}, {10.99,
>     2.083*^-9}, {11.99, -1.608*^-10}
>    }
>
> And there are four parameters to fit in our fitting equation:
>
> model[ka_?NumberQ, kr_?NumberQ, kd_?NumberQ,
>    kb_?NumberQ] := (model[ka, kr, kd, kb] =
>     First[Subscript[Dye, 0] /. NDSolve[{
>         Derivative[1][Subscript[Dye, 0]][
>           t] ==\[VeryThinSpace]-ka Subscript[Dye, 0][t] +
>           kr  Subscript[Dyes, 0][t], Subscript[Dye, 0][0] == 1.22 10^-6,
>         Derivative[1][Subscript[Dye, 1]][
>           t] == -ka Subscript[Dye, 1][t] + kr  Subscript[Dyes, 1][t],
>         Subscript[Dye, 1][0] == 0,
>
>         Derivative[1][Subscript[Dyes, 0]][t] ==
>          ka  Subscript[Dye, 0][t] - kr  Subscript[Dyes, 0][t] -
>           kd  Subscript[CI, 0][t] Subscript[Dyes, 0][t] -
>           kd /2 * Subscript[CI, 1][t] Subscript[Dyes, 1][t],
>         Subscript[Dyes, 0][0] == 0,
>         Derivative[1][Subscript[Dyes, 1]][t] ==
>          ka Subscript[Dye, 1][t] -
>           kd Subscript[CI, 1][t] Subscript[Dyes, 0][t] -
>           kr Subscript[Dyes, 1][t] -
>           kd  Subscript[CI, 0][t] Subscript[Dyes, 1][t],
>         Subscript[Dyes, 1][0] == 0,
>
>         Derivative[1][Subscript[CI, 0]][
>           t] == -kd Subscript[CI, 0][t] Subscript[Dyes, 0][t] -
>           kd/2*  Subscript[CI, 1][t] Subscript[Dyes, 1][t] -
>           kb Subscript[CI, 0][t] Subscript[HDye, 0][t] -
>           kb/2* Subscript[CI, 1][t] Subscript[HDye, 1][t],
>         Subscript[CI, 0][0] == 3.18 10^-3,
>         Derivative[1][Subscript[CI, 1]][
>           t] == -kd Subscript[CI, 1][t] Subscript[Dyes, 0][t] -
>           kd/2*  Subscript[CI, 0][t] Subscript[Dyes, 1][t] -
>           kb Subscript[CI, 1][t] Subscript[HDye, 0][t] -
>           kb/2*Subscript[CI, 0][t] Subscript[HDye, 1][t],
>         Subscript[CI, 1][0] == 0,
>
>         Derivative[1][Subscript[HDye, 0]][t] ==
>          kd  Subscript[CI, 0][t] Subscript[Dyes, 0][t] +
>           kd/2* Subscript[CI, 1][t] Subscript[Dyes, 1][t] -
>           kb  Subscript[CI, 0][t] Subscript[HDye, 0][t] -
>           kb /2* Subscript[CI, 1][t] Subscript[HDye, 1][t],
>         Subscript[HDye, 0][0] == 0,
>         Derivative[1][Subscript[HDye, 1]][t] ==
>          kd  Subscript[CI, 1][t] Subscript[Dyes, 0][t] +
>           kd  Subscript[CI, 0][t] Subscript[Dyes, 1][t] -
>           kb Subscript[CI, 1][t] Subscript[HDye, 0][t] -
>           kb  Subscript[CI, 0][t] Subscript[HDye, 1][t],
>         Subscript[HDye, 1][0] == 0
>         }, {Subscript[Dye, 0][t], Subscript[Dyes, 0][t],
>         Subscript[CI, 0][t], Subscript[HDye, 0][t],
>         Subscript[Dye, 1][t], Subscript[Dyes, 1][t],
>         Subscript[CI, 1][t], Subscript[HDye, 1][t]}, {t, 0, 12}]])
>
> In the NDSolve, what we want to fit is Dye0[t]. So we wrote code for fitting using FindFit:
>
> fit = FindFit[data,
>    model[ ka, kr, kd, kb][Subscript[Dye,
>     0]], {{ka, 10^(-4)}, {kr, 10^(-4)}, {kd, 500}, {kb, 500}},
>    Subscript[Dye, 0]]
>
> However, we encountered the error message like this:
>
> FindFit::nrlnum: "The function value {-2.915*10^-7+Subscript[Dye, 0][2.113],-2.758*10^-7+Subscript[Dye, 0][2.256],-2.567*10^-7+Subscript[Dye, 0][2.303],<<16>>,-3.205*10^-9+Subscript[Dye, 0][10.23],-2.083*10^-9+Subscript[Dye,0][10.99],1.608*10^-10+Subscript[Dye, 0][11.99]} is not a list of real numbers with dimensions {22} at {ka,kr,kd,kb} = {0.0001,0.0001,500.,500.}."
>
> The desirable solution for parameter is around ka= 0.67, kr = 10^(-3), kd=1600, kb=1600.
>
> Does anyone know what I am doing wrong?
>



  • Prev by Date: Re: Thread::tdlen: Objects of unequal length in
  • Next by Date: Re: StepMonitor problem
  • Previous by thread: Re: How to make fitting code using NDSolve?
  • Next by thread: Re: StepMonitor problem