Преобразуйте систему дифференциальных алгебраических уравнений первого порядка к эквивалентной системе дифференциального индекса 1
[
преобразует систему высокого индекса дифференциальных алгебраических уравнений первого порядка newEqs
,newVars
]
= reduceDAEIndex(eqs
,vars
)eqs
к эквивалентной системе newEqs
из дифференциального индекса 1.
reduceDAEIndex
сохраняет исходные уравнения и переменные и вводит новые переменные и уравнения. После преобразования, reduceDAEIndex
проверяет дифференциальный индекс новой системы путем вызова isLowIndexDAE
. Если индекс newEqs
2 или выше, затем reduceDAEIndex
выдает предупреждение.
Проверяйте, имеет ли следующая система ДАУ минимум (0
или 1
) или высоко (>1
Дифференциальный индекс. Если индекс выше, чем 1
, затем используйте reduceDAEIndex
уменьшать его.
Создайте следующую систему двух дифференциальных алгебраических уравнений. Здесь, символьные функции x(t)
yt
, и z(t)
представляйте переменные состояния системы. Задайте уравнения и переменные как два символьных вектора: уравнения как вектор символьных уравнений и переменные как вектор символьных вызовов функции.
syms x(t) y(t) z(t) f(t) eqs = [diff(x) == x + z, diff(y) == f(t), x == y]; vars = [x(t), y(t), z(t)];
Используйте isLowIndexDAE
проверять дифференциальный индекс системы. Для этой системы, isLowIndexDAE
возвращает 0
ложь
). Это означает, что дифференциальным индексом системы является 2
или выше.
isLowIndexDAE(eqs, vars)
ans = logical 0
Используйте reduceDAEIndex
переписать систему так, чтобы дифференциальным индексом был 1
. Новая система имеет одну дополнительную переменную состояния, Dyt(t)
.
[newEqs, newVars] = reduceDAEIndex(eqs, vars)
newEqs = diff(x(t), t) - z(t) - x(t) Dyt(t) - f(t) x(t) - y(t) diff(x(t), t) - Dyt(t) newVars = x(t) y(t) z(t) Dyt(t)
Проверяйте, ниже ли дифференциальный порядок новой системы, чем 2
.
isLowIndexDAE(newEqs, newVars)
ans = logical 1
Уменьшайте дифференциальный индекс системы, которая содержит два дифференциальных алгебраических уравнения второго порядка. Поскольку уравнения являются уравнениями второго порядка, сначала используйте reduceDifferentialOrder
переписать систему к системе ДАУ первого порядка.
Создайте следующую систему двух ДАУ второго порядка. Здесь, x(t)
yt
, и F(t)
переменные состояния системы. Задайте уравнения и переменные как два символьных вектора: уравнения как вектор символьных уравнений и переменные как вектор символьных вызовов функции.
syms t x(t) y(t) F(t) r g eqs = [diff(x(t), t, t) == -F(t)*x(t),... diff(y(t), t, t) == -F(t)*y(t) - g,... x(t)^2 + y(t)^2 == r^2 ]; vars = [x(t), y(t), F(t)];
Перепишите эту систему так, чтобы все уравнения стали дифференциальными уравнениями первого порядка. reduceDifferentialOrder
функционируйте заменяет ДАУ второго порядка по двум выражениям первого порядка путем представления новых переменных Dxt(t)
и Dyt(t)
. Это также заменяет уравнения первого порядка символьными выражениями.
[eqs, vars] = reduceDifferentialOrder(eqs, vars)
eqs = diff(Dxt(t), t) + F(t)*x(t) diff(Dyt(t), t) + g + F(t)*y(t) - r^2 + x(t)^2 + y(t)^2 Dxt(t) - diff(x(t), t) Dyt(t) - diff(y(t), t) vars = x(t) y(t) F(t) Dxt(t) Dyt(t)
Используйте reduceDAEIndex
переписать систему так, чтобы дифференциальным индексом был 1
.
[eqs, vars, R, originalIndex] = reduceDAEIndex(eqs, vars)
eqs = Dxtt(t) + F(t)*x(t) g + Dytt(t) + F(t)*y(t) - r^2 + x(t)^2 + y(t)^2 Dxt(t) - Dxt1(t) Dyt(t) - Dyt1(t) 2*Dxt1(t)*x(t) + 2*Dyt1(t)*y(t) 2*Dxt1t(t)*x(t) + 2*Dxt1(t)^2 + 2*Dyt1(t)^2 + 2*y(t)*diff(Dyt1(t), t) Dxtt(t) - Dxt1t(t) Dytt(t) - diff(Dyt1(t), t) Dyt1(t) - diff(y(t), t) vars = x(t) y(t) F(t) Dxt(t) Dyt(t) Dytt(t) Dxtt(t) Dxt1(t) Dyt1(t) Dxt1t(t) R = [ Dytt(t), diff(Dyt(t), t)] [ Dxtt(t), diff(Dxt(t), t)] [ Dxt1(t), diff(x(t), t)] [ Dyt1(t), diff(y(t), t)] [ Dxt1t(t), diff(x(t), t, t)] originalIndex = 3
Используйте reduceRedundancies
сокращать систему.
[eqs, vars] = reduceRedundancies(eqs, vars)
eqs = Dxtt(t) + F(t)*x(t) g + Dytt(t) + F(t)*y(t) - r^2 + x(t)^2 + y(t)^2 2*Dxt(t)*x(t) + 2*Dyt(t)*y(t) 2*Dxtt(t)*x(t) + 2*Dytt(t)*y(t) + 2*Dxt(t)^2 + 2*Dyt(t)^2 Dytt(t) - diff(Dyt(t), t) Dyt(t) - diff(y(t), t) vars = x(t) y(t) F(t) Dxt(t) Dyt(t) Dytt(t) Dxtt(t)
Реализация reduceDAEIndex
использует алгоритм Pantelides. Этот алгоритм уменьшает системы более высокого индекса до систем более низкого индекса путем выборочного добавления дифференцируемых форм исходных уравнений. Алгоритм Pantelides может недооценить дифференциальный индекс новой системы, и поэтому, может не уменьшать дифференциальный индекс до 1
. В этом случае, reduceDAEIndex
выдает предупреждение и, для синтаксиса с четырьмя выходными аргументами, возвращает значение oldIndex
как NaN
. reduceDAEToODE
функционируйте использование более надежное, но более медленное Исключение Гаусса. Обратите внимание на то, что reduceDAEToODE
требует, чтобы система ДАУ была полулинейна.
daeFunction
| decic
| findDecoupledBlocks
| incidenceMatrix
| isLowIndexDAE
| massMatrixForm
| odeFunction
| reduceDAEToODE
| reduceDifferentialOrder
| reduceRedundancies