I am trying to fit some data to the solution of a differential equation. I am using ParametricNDSolve
to create a model which should fit the data using FindFit
.
Now, the code I propose is very similar to the examples I have seen to solve similar problems. However, the equation of this case is a little more complicated that the examples of Mathematica manuals (because is a function of two variables, and the initials conditions involves two numeric integrals).
The code keeps running for hours, and it does not appear to solve the problems at all:
data = {{21/100, 0.260882276365091`}, {6/25, 0.330910580727009`}, {27/
100, 0.271601829283246`}, {3/10, 0.294039749043066`}, {33/100,
0.373363616981994`}, {9/25, 0.467495450916`}, {39/100,
0.50972503848512`}, {21/50, 0.639300915026114`}, {9/20,
0.679672806174314`}, {12/25, 0.693446859556429`}, {51/100,
0.697043731283207`}, {27/50, 0.736147748563448`}, {57/100,
0.706580484286456`}, {3/5, 0.719128578284264`}, {63/100,
0.762276173639189`}, {33/50, 0.788753648395851`}, {69/100,
0.802107836002146`}, {18/25, 0.803992011056852`}, {3/4,
0.796349018322968`}, {39/50, 0.795845629380594`}, {81/100,
0.808805024532776`}, {21/25, 0.812210415525446`}, {87/100,
0.811677706096654`}, {9/10, 0.796614634731033`}, {93/100,
0.802573366818874`}, {24/25, 0.801851431134633`}, {99/100,
0.799762250401537`}, {51/50, 0.803234757269179`}, {21/20,
0.812346679044962`}, {27/25, 0.804974524275207`}, {111/100,
0.813054479870107`}, {57/50, 0.802494974488922`}, {117/100,
0.811124462792484`}, {6/5, 0.810259975308694`}, {123/100,
0.810910967136978`}, {63/50, 0.815891670404585`}, {33/25,
0.803843274767398`}, {69/50, 0.814778081357444`}, {36/25,
0.809686831953762`}, {3/2, 0.829532613157218`}, {9/5,
0.815351190536115`}, {21/10, 0.828143435644695`}, {12/5,
0.791269047273677`}, {27/10, 0.821321230878138`}, {3,
0.81153212440728`}, {33/10, 0.821798500231733`}, {18/5,
0.819594302125574`}, {39/10, 0.828629593518031`}};
model = ParametricNDSolveValue[{
D[v[x, t], t] == d1*D[v[x, t], x, x],
v[-5, t] == 0,
v[10, t] == flux,
v[x, 0] == flux*NIntegrate[Cos[y]^n1, {y, ArcTan[-b1*(x + a1)], Pi/2}]/NIntegrate[Cos[y]^n1, {y, -Pi/2, Pi/2}]},
v, {x, -5, 10}, {t, 0, 2}, {d1, flux, n1, b1, a1}]
fit = FindFit[data,
(c*model[d1, flux, n1, b1, a1][x, 2])/((c - 1)*model[d1, flux, n1, b1, a1][x, 2] + 1),
{{d1, 0.001}, {flux, 0.57}, {c, 3.2}, {n1, 2}, {b1,1}, {a1, -0.4}}, x]
I guess that this code is computationally inefficient, but I need help to understand why.
Thank you all very much
Ps: english is obviously not my first lenguage, so I apologize for the grammar mistakes.
data
have a list of triples instead since you're fitting to a PDE? $\endgroup$data
is a list of $x$-$t$ pairs, no? $\endgroup$v
is a function ofx
andt
according to yourmodel
, so I'm not understanding at all how you'd propose to fit a function of two independent variables to data that comprises a list of pairs (which would imply only one independent variable, and one dependent variable), and not a list of triples. If you're trying to determine a wholev[x, t]
from just a singlet
slice, then clearly you are not supplying enough information. $\endgroup$x
space and thet
time). However when I try to fit the data, I fix the second variable inFindFit
tot=2
, leaving only one free variable to the model. Maybe this is not the correct way to so. $\endgroup$