Hey! I am working with FindFit to do some model fitting but am having a hard time combining two different approaches. I will show those working examples and then ask why the combined example failed.
First, lets say I want to apply conditions on my model for a FindFit function. This can be done in the following way:
modelt[a_?NumberQ, k_?NumberQ] := (modelt[a, k] =
First[x /.
NDSolve[{x'[t] == (k/2)*(Sin[x[t] + a] + Cos[x[t] + a]),
x[0] == Pi/2}, {x}, {t, 0, 1000}]])
FindFit[{1000, Pi/6}, {modelt[a, k][t], modelt[a, k]''[1000] < 0}, {a,
k}, t, Method -> {NMinimize, Method -> "SimulatedAnnealing"}]
where modelt[a, k]''[1000] < 0 returns the value of the second derivative of model for optimal parameter values.
However, lets say I have a system of two equations and still only one dataset. I can change the above to handle that:
ModelSol =
ParametricNDSolveValue[{x'[t] ==
k[t]/2 (Sin[x[t] + a] + Cos[x[t] + a]), k'[t] == f Sin[-x[t]],
x[0] == \[Pi]/2, k[0] == 1/3}, {x, k}, {t, 0, 5000}, {a, f}];
model[a_, f_][i_, t_] :=
Through[ModelSol[a, f][t], List][[i]] /;
And @@ NumericQ /@ {a, f, i, t};
FindFit[{{1, 5000, \[Pi]}}, {model[a, f][i, t]}, {a, f}, {i, t},
Method -> {NMinimize, Method -> "SimulatedAnnealing"}]
Now this allows me to handle multiple equations even with only that one data point, but I can no longer specify constraints on the derivatives of model or ModelSol. Is there a way to allow this? That is, change one of the above examples to both handle multiple equations with one data point and allow for constraints on the derivative?
Info:
-
I believe the issue arises from the fact that
modelin the second example no longer refers to the solution of the model as it did in the first. -
There is also perhaps a slight issue with asking for a time derivative of the output from
ParametricNDSolveValue, I haven’t been able to ask for a time derivative of the output and then find a numerical value. In principle, the problem could be fixed if I could figure