Working with a system of differential equations that cannot be solved explicitly
There are many ways which one could exploit. For example let's use calculate o1''[t]
eliminating o1'[t], o2'[t], o3'[t]
. We can use Eliminate
:
#1/.( Eliminate[ Join[ D[Halp, t], Halp], {#2, #3}] //ToRules)&[o1''[t], o2''[t], o3''[t]]
2 o1[t] o2[t]^2 + 2 o1[t] o2[t] o3[t] - 2 o2[t]^2 o3[t] + 2 o1[t] o3[t]^2 - 2 o2[t] o3[t]^2
Changing the order in the square bracket we can calculate o2''[t]
and o3''[t]
.
For the third order derivative of e.g. o1[t]
we can eliminate other dependent variables in many different ways, let's point out one of them:
#1 /.(
Eliminate[ Join[ D[Halp, {t, 2}], D[Halp, t], Halp], {##2}]
//ToRules) &[o1'''[t], o2'''[t], o3'''[t], o2''[t], o3''[t], o1''[t]]
2 o1[t]^2 o2[t]^2 + 4 o1[t] o2[t]^3 - 4 o1[t]^2 o2[t] o3[t] + 8 o1[t] o2[t]^2 o3[t] - 4 o2[t]^3 o3[t] + 2 o1[t]^2 o3[t]^2 + 8 o1[t] o2[t] o3[t]^2 - 10 o2[t]^2 o3[t]^2 + 4 o1[t] o3[t]^3 - 4 o2[t] o3[t]^3
In the above we eliminated all dependent variables starting from the second position in the square bracket (note very useful sign ##n
i.e. SlotSequence
) and calculated o1'''[t]
. Of course you can try to get rid of different dependent variables. In general this is a difficult issue to decide which dependent variables could be eliminated and how they could be represented by another variables. I suggest to take a closer look at GroebnerBasis
with the MonomialOrder -> EliminationOrder
option.
GroebnerBasis[ polys, vars, elims, MonomialOrder -> EliminationOrder]
If given equations are relatively simple you can't observe a common problem in differential elimination - so called intermediate expresssion swell. For interesting mathematical issues related to the problem I'd suggest to study e.g. a recent monograph Involution by Werner Seiler (Springer 2009). However I couldn't mention interesting packages in Mathematica
related to differential elimination (there are such packages e.g. in Maple).
I would simply define rules for derivatives of o1
, o2
and o3
and avoid the use of Eliminate
or GroebnerBasis
:
o1' = Function[t, o1[t]*o2[t]+o1[t]*o3[t]-o2[t]*o3[t]];
o2' = Function[t, o1[t]*o2[t]+o2[t]*o3[t]-o1[t]*o3[t]];
o3' = Function[t, o1[t]*o3[t]+o2[t]*o3[t]-o1[t]*o2[t]];
Derivative[n_?Positive][o1] := simplifyFunction @ Derivative[n-1][o1']
Derivative[n_?Positive][o2] := simplifyFunction @ Derivative[n-1][o2']
Derivative[n_?Positive][o3] := simplifyFunction @ Derivative[n-1][o3']
simplifyFunction[HoldPattern@Function[t_, body_]] := Function[t, Evaluate @ Simplify @ body]
Example:
o1'''[t]
o2'''[t]
o3'''[t]
2 o1[t]^2 (o2[t] - o3[t])^2 - 2 o2[t] o3[t] (2 o2[t]^2 + 5 o2[t] o3[t] + 2 o3[t]^2) + 4 o1[t] (o2[t]^3 + 2 o2[t]^2 o3[t] + 2 o2[t] o3[t]^2 + o3[t]^3)
2 (2 o1[t]^3 (o2[t] - o3[t]) - 2 o1[t] (o2[t] - o3[t])^2 o3[t] + o2[t] o3[t]^2 (o2[t] + 2 o3[t]) + o1[t]^2 (o2[t]^2 + 4 o2[t] o3[t] - 5 o3[t]^2))
2 (-2 o1[t]^3 (o2[t] - o3[t]) - 2 o1[t] o2[t] (o2[t] - o3[t])^2 + o2[t]^2 o3[t] (2 o2[t] + o3[t]) + o1[t]^2 (-5 o2[t]^2 + 4 o2[t] o3[t] + o3[t]^2))