Convert system of first-order semilinear differential algebraic equations to equivalent system of differential index 0
converts
a high-index system of first-order semilinear algebraic equations newEqs
= reduceDAEToODE(eqs
,vars
)eqs
to
an equivalent system of ordinary differential equations, newEqs
.
The differential index of the new system is 0
,
that is, the Jacobian of newEqs
with respect to
the derivatives of the variables in vars
is invertible.
[
returns
a vector of constraint equations.newEqs
,constraintEqs
]
= reduceDAEToODE(eqs
,vars
)
Convert a system of differential algebraic equations (DAEs) to a system of implicit ordinary differential equations (ODEs).
Create the following system of two differential algebraic equations.
Here, the symbolic functions x(t)
, y(t)
,
and z(t)
represent the state variables of the system.
Specify the equations and variables as two symbolic vectors: equations
as a vector of symbolic equations, and variables as a vector of symbolic
function calls.
syms x(t) y(t) z(t) eqs = [diff(x,t)+x*diff(y,t) == y,... x*diff(x, t)+x^2*diff(y) == sin(x),... x^2 + y^2 == t*z]; vars = [x(t), y(t), z(t)];
Use reduceDAEToODE
to rewrite the system
so that the differential index is 0
.
newEqs = reduceDAEToODE(eqs, vars)
newEqs = x(t)*diff(y(t), t) - y(t) + diff(x(t), t) diff(x(t), t)*(cos(x(t)) - y(t)) - x(t)*diff(y(t), t) z(t) - 2*x(t)*diff(x(t), t) - 2*y(t)*diff(y(t), t) + t*diff(z(t), t)
Check if the following DAE system has a low
(0
or 1
) or high (>1
)
differential index. If the index is higher than 1
,
first try to reduce the index by using reduceDAEIndex
and
then by using reduceDAEToODE
.
Create the system of differential algebraic equations. Here,
the functions x1(t)
, x2(t)
,
and x3(t)
represent the state variables of the
system. The system also contains the functions q1(t)
, q2(t)
,
and q3(t)
. These functions do not represent state
variables. Specify the equations and variables as two symbolic vectors:
equations as a vector of symbolic equations, and variables as a vector
of symbolic function calls.
syms x1(t) x2(t) x3(t) q1(t) q2(t) q3(t) eqs = [diff(x2) == q1 - x1, diff(x3) == q2 - 2*x2 - t*(q1-x1), q3 - t*x2 - x3]; vars = [x1(t), x2(t), x3(t)];
Use isLowIndexDAE
to check the differential
index of the system. For this system, isLowIndexDAE
returns 0
(false
).
This means that the differential index of the system is 2
or
higher.
isLowIndexDAE(eqs, vars)
ans = logical 0
Use reduceDAEIndex
as your first attempt
to rewrite the system so that the differential index is 1
.
For this system, reduceDAEIndex
issues a warning
because it cannot reduce the differential index of the system to 0
or 1
.
[newEqs, newVars] = reduceDAEIndex(eqs, vars)
Warning: Index of reduced DAEs is larger than 1. newEqs = x1(t) - q1(t) + diff(x2(t), t) Dx3t(t) - q2(t) + 2*x2(t) + t*(q1(t) - x1(t)) q3(t) - x3(t) - t*x2(t) diff(q3(t), t) - x2(t) - t*diff(x2(t), t) - Dx3t(t) newVars = x1(t) x2(t) x3(t) Dx3t(t)
If reduceDAEIndex
cannot reduce the semilinear
system so that the index is 0
or 1
,
try using reduceDAEToODE
. This function can be
much slower, therefore it is not recommended as a first choice. Use
the syntax with two output arguments to also return the constraint
equations.
[newEqs, constraintEqs] = reduceDAEToODE(eqs, vars)
newEqs = x1(t) - q1(t) + diff(x2(t), t) 2*x2(t) - q2(t) + t*q1(t) - t*x1(t) + diff(x3(t), t) diff(x1(t), t) - diff(q1(t), t) + diff(q2(t), t, t) - diff(q3(t), t, t, t) constraintEqs = x1(t) - q1(t) + diff(q2(t), t) - diff(q3(t), t, t) x3(t) - q3(t) + t*x2(t) x2(t) - q2(t) + diff(q3(t), t)
Use the syntax with three output arguments to return the new
equations, constraint equations, and the differential index of the
original system, eqs
.
[newEqs, constraintEqs, oldIndex] = reduceDAEToODE(eqs, vars)
newEqs = x1(t) - q1(t) + diff(x2(t), t) 2*x2(t) - q2(t) + t*q1(t) - t*x1(t) + diff(x3(t), t) diff(x1(t), t) - diff(q1(t), t) + diff(q2(t), t, t) - diff(q3(t), t, t, t) constraintEqs = x1(t) - q1(t) + diff(q2(t), t) - diff(q3(t), t, t) x3(t) - q3(t) + t*x2(t) x2(t) - q2(t) + diff(q3(t), t) oldIndex = 3
The implementation of reduceDAEToODE
is
based on Gaussian elimination. This algorithm is more reliable than
the Pantelides algorithm used by reduceDAEIndex
,
but it can be much slower.
daeFunction
| decic
| findDecoupledBlocks
| incidenceMatrix
| isLowIndexDAE
| massMatrixForm
| odeFunction
| reduceDAEIndex
| reduceDifferentialOrder
| reduceRedundancies