exponenta event banner

reduceDAEToODE

Преобразовать систему полулинейных дифференциальных алгебраических уравнений первого порядка в эквивалентную систему дифференциального индекса 0

Описание

пример

newEqs = reduceDAEToODE(eqs,vars) преобразует высокоиндексную систему полулинейных алгебраических уравнений первого порядка eqs эквивалентной системе обыкновенных дифференциальных уравнений, newEqs. Дифференциальный индекс новой системы: 0, то есть якобианец из newEqs в отношении производных переменных в vars является обратимым.

пример

[newEqs,constraintEqs] = reduceDAEToODE(eqs,vars) возвращает вектор уравнений ограничений.

пример

[newEqs,constraintEqs,oldIndex] = reduceDAEToODE(eqs,vars) возвращает дифференциальный индекс oldIndex исходной системы полулинейных дисковых полостей, eqs.

Примеры

Преобразование системы дисковой полки в неявную систему ОДУ

Преобразование системы дифференциальных алгебраических уравнений (DAE) в систему неявных обыкновенных дифференциальных уравнений (ODE).

Создайте следующую систему двух дифференциальных алгебраических уравнений. Здесь символические функции x(t), y(t), и 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 (false). Это означает, что дифференциальный индекс системы 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

Входные аргументы

свернуть все

Система полулинейных дисковых полостей первого порядка, заданная как вектор символических уравнений или выражений.

Переменные состояния, определяемые как вектор символьных функций или вызовов функций, например x(t).

Пример: [x(t),y(t)] или [x(t);y(t)]

Выходные аргументы

свернуть все

Система неявных обыкновенных дифференциальных уравнений, возвращаемая как столбчатый вектор символических выражений. Дифференциальный индекс этой системы: 0.

Уравнения ограничений, обнаруженные во время сокращения системы, возвращаются в виде вектора столбца символьных выражений. Эти выражения зависят от переменных vars, но не на их производных. Ограничения представляют собой консервативные величины дифференциальных уравнений в newEqs, что означает, что производная по времени каждого ограничения исчезает по модулю уравнений в newEqs.

Эти уравнения можно использовать для определения непротиворечивых начальных условий для системы дисковых полок.

Дифференциальный индекс исходной системы дисковых полок eqs, возвращается в виде целого числа.

Алгоритмы

Осуществление reduceDAEToODE основан на гауссовской ликвидации. Этот алгоритм более надёжен, чем алгоритм Пантелидеса, используемый reduceDAEIndex, но это может быть гораздо медленнее.

Представлен в R2014b