Преобразуйте систему полулинейных дифференциальных алгебраических уравнений первого порядка к эквивалентной системе дифференциального индекса 0
преобразует систему высокого индекса полулинейных алгебраических уравнений newEqs = reduceDAEToODE(eqs,vars)eqs первого порядка к эквивалентной системе обыкновенных дифференциальных уравнений, newEqs. Дифференциальным индексом новой системы является 0, то есть, якобиан newEqs относительно производных переменных в vars является обратимым.
[ возвращает вектор из уравнений ограничений.newEqs,constraintEqs]
= reduceDAEToODE(eqs,vars)
Преобразуйте систему дифференциальных алгебраических уравнений (ДАУ) к системе неявных обыкновенных дифференциальных уравнений (ОДУ).
Создайте следующую систему двух дифференциальных алгебраических уравнений. Здесь, символьные функции x(t)yt , и z(t) представляйте переменные состояния системы. Задайте уравнения и переменные как два символьных вектора: уравнения как вектор из символьных уравнений и переменные как вектор из символьных вызовов функции.
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)];Использование reduceDAEToODE переписать систему так, чтобы дифференциальным индексом был 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)Проверяйте, имеет ли следующая система ДАУ минимум (0 или 1) или высоко (>1Дифференциальный индекс. Если индекс выше, чем 1, сначала попытайтесь уменьшать индекс при помощи reduceDAEIndex и затем при помощи reduceDAEToODE.
Создайте систему дифференциальных алгебраических уравнений. Здесь, функции x1(t), x2(t), и x3(t) представляйте переменные состояния системы. Система также содержит функции q1(t), q2(t), и q3(t). Эти функции не представляют переменные состояния. Задайте уравнения и переменные как два символьных вектора: уравнения как вектор из символьных уравнений и переменные как вектор из символьных вызовов функции.
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)];Использование isLowIndexDAE проверять дифференциальный индекс системы. Для этой системы, isLowIndexDAE возвращает 0 ложь). Это означает, что дифференциальным индексом системы является 2 или выше.
isLowIndexDAE(eqs, vars)
ans =
logical
0Использование reduceDAEIndex как ваша первая попытка переписать систему так, чтобы дифференциальным индексом был 1. Для этой системы, reduceDAEIndex выдает предупреждение, потому что оно не может уменьшать дифференциальный индекс системы к 0 или 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)Если reduceDAEIndex не может уменьшать полулинейную систему так, чтобы индексом был 0 или 1, попытайтесь использовать reduceDAEToODE. Эта функция может быть намного медленнее, поэтому она не рекомендуется как предпочтительный вариант. Используйте синтаксис с двумя выходными аргументами, чтобы также возвратить уравнения ограничений.
[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)Используйте синтаксис с тремя выходными аргументами, чтобы возвратить новые уравнения, уравнения ограничений и дифференциальный индекс исходной системы, 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Реализация reduceDAEToODE основан на Исключении Гаусса. Этот алгоритм более надежен, чем алгоритм Pantelides, используемый reduceDAEIndex, но это может быть намного медленнее.
daeFunction | decic | findDecoupledBlocks | incidenceMatrix | isLowIndexDAE | massMatrixForm | odeFunction | reduceDAEIndex | reduceDifferentialOrder | reduceRedundancies