Observation:
I can see even for very simple modification in case of an scalar objective involving an definite integral in time ParametricNDSolve fails. Here is an example!
eqns = {y''[t] + y[t] == 3 a Sin[y[t]], y[0] == y'[0] == 1};
pfun =ParametricNDSolveValue[eqns,Integrate[y[s] - a s, {s, 0, 5}], {t, 0, 5}, {a},
Method -> {"ParametricSensitivity" -> "ForwardSensitivity"}];
pfun[1.5]
Meaningless output!
Same kind of output for pfun'[1.5] but from pfun''[1.5] onwards for higher derivatives we get numerical values which I guess are totally wrong.
However everything will be fine if one uses Integrate[y[s], {s, 0, 5}]! So I tried {"ParametricSensitivity" -> "AdjointSensitivity"} which is most suitable for integrated objective functions. Again failure but this time for both the cases. We get the following error
ParametricNDSolveValue::adjsens: The adjoint sensitivity method cannot be used for the output function {t,0,5}. It can only be used for output functions that are at a particular time or are a definite integral over time. >>
I feel this is a major inconsistency of implementation internal. Using Trace I found some esoteric IntegrateImproperDump` andInternalDependsOnQ.
What should be pfun[1.5]:
We know
Distribute[Integrate[y[s] - a s, {s, 0, 5}], Plus] ===
Integrate[-a s, {s, 0, 5}] + Integrate[y[s], {s, 0, 5}]
True
So we first can find pfun[1.5] using
eqns = {y''[t] + y[t] == 3 a Sin[y[t]], y[0] == y'[0] == 1};
pfun = ParametricNDSolveValue[eqns,
Integrate[y[s], {s, 0, 5}], {t, 0, 5}, {a},
Method -> {"ParametricSensitivity" -> "ForwardSensitivity"}];
(pfun[1.5] + Integrate[-a s, {s, 0, 5}]) /. a -> 1.5
-7.86673
and the first order sensitivity will be
(pfun'[1.5] + D[Integrate[-a s, {s, 0, 5}], a]) /. a -> 1.5
-7.87591
Crosschecking the first order sensitivity below!
fun1[aval_?NumericQ] :=NIntegrate[Block[{a = aval},
Evaluate@(y /. First@NDSolve[Evaluate@eqns, y, {t, 0, 5}])[t] -a t] , {t, 0, 5}];
Needs["NumericalCalculus`"];
ND[fun1[x], x, 1.5]
-7.87604
Pretty much as expected.
Question:
- It will be great to know if we can use
ParametricNDSolvefamily to find parameter dependency of integrated objective like the following: $$ G(p)=\int_a^{b} g(y(s),s,p) \,ds$$ where $g$ is a function of the dependent variable $y(s)$ of the underlying differential equation system and $p$ represents the parameter with respect to which the sensitivity $\frac{dG}{dp}$ is sought (i.eain the above example). - Also why
{"ParametricSensitivity" -> "AdjointSensitivity"}fails in the above example?
For some math reference check here.
BR
pfun[1.5]is unevaluated and so ispfun'[1.5]then one needs to be really audacious to expect even anything sensible for the higher derivatives. But M9 in this specific case returns values for the higher derivatives. That is not the kind of behavior one expects from a intelligent system. – PlatoManiac Aug 08 '13 at 13:34-7.86673forpfun[1.5]. I had a mistake in the previous comment. – PlatoManiac Aug 08 '13 at 14:39