Message Boards Message Boards

3 Replies
1 Total Likes
View groups...
Share this post:

Fitting Data to the Sum of some Solutions of an ODE System

Posted 9 years ago

Hello all,

I have a system consisting of 4 ODEs, which I call sys (incl. initial conditions). The parameters are called par1, par2, par3. My data consists of a time series of measurements (from time 0 to 100), which represents the sum of the last two solutions (sol3, sol4) of the ODE system. For fitting the model to this kind of data, I did the following:

(* Numerical solution *)
model[par1_, par2_, par3_] := model [par1, par2, par3] = Module[{nsol, sol1, sol2, sol3, sol4, t},
nsol = NDSolveValue[{sys}, {sol1, sol2, sol3, sol4},{t,0,100}, MaxSteps->10000];

(* Relevant solution part *)
modeldata[par1_?NumericQ, par2_?NumericQ, par3_?NumericQ] := Total[Through[Part[model[par1, par2, par3], 3:4][t]]];

(* Fitting *)
nlm=NonlinearModelFit[data, modeldata[par1, par2, par3], {par1, par2, par3}, t, Method->"NMinimize"];

Problem: Mathematica complains about the Interpolating Function: Input value lies outside the range of data in the interpolating function. Extrapolation will be used.

I really do not see where the problem lies. Indeed, the data range should be covered by the InterpolatingFunction since the integration covers the relevant range.

Thanks for any advice.

POSTED BY: marc123
3 Replies

That error message isn't uncommon. Especially if you search online for "NDSolve::mxst". It basically just means the function is hard to numerically integrate beyond some point. There's no simple, general solution for that. There are many different techniques that can be done depending on the nature of the equations.

Off the top of my head, here's what I normally try:

  • Try out many different possible values for the "Method" option. Maybe you'll get lucky and one of them will work.
  • Look at the equation. Can it be related to a simpler set of equations somehow?
  • Plug the results back into the original equations and see how well they satisfy them. It might be possible to show that it was sol 1, 2, 3, or 4 that was really causing the problem. Maybe it's changing values very quickly or becoming highly oscillatory.
  • Read through the list of available "Method" options again and see which seem to address the problem I'm seeing.
  • Reduce and simplify the equations to get the simplest version of them that produces the problem. This will help other people advise you on how to solve it numerically at very least.
  • Try to find a solvable approximation of the equation.

I'd really first bombard the problem with many different numerical methods. One of my favorites that I always try is (Method -> "StiffnessSwitching").

POSTED BY: Sean Clarke
Posted 9 years ago
POSTED BY: marc123

It's hard to debug this without the code, but first, as a general suggestion, try rewriting it using ParametricNDSolve.

There are some examples at the bottom of that page on optimizing parameter values. They might be helpful if you haven't already seen them.

So, modeldata[...] appears to be an Interpolating function and it is complaining that it is being given a t value out of its range. What are the t values in data? That is, what are the values of data[[All,1]]? What happens when you run modeldata[...] on every one of them with some reasonable value for the parameters? I get the feeling that one of them is outside the range of modeldata[...]. I don't know if the range of modeldata[...] depends on it's parameters or not.

POSTED BY: Sean Clarke
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract