0
|
4907 Views
|
3 Replies
|
1 Total Likes
View groups...
Share
GROUPS:

# 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]; Return[nsol]; ] (* 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.
3 Replies
Sort By:
Posted 9 years ago
 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 9 years ago
Posted 9 years ago
 It's hard to debug this without the code, but first, as a general suggestion, try rewriting it using ParametricNDSolve.http://reference.wolfram.com/language/ref/ParametricNDSolve.htmlThere 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.