reduceDAEToODE

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

Описание

пример

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

пример

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

пример

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

Примеры

Преобразуйте систему ДАУ в неявную систему ОДУ

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

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

Входные параметры

свернуть все

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

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

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

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

свернуть все

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

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

Можно использовать эти уравнения, чтобы определить сопоставимые начальные условия для системы ДАУ.

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

Алгоритмы

Реализация reduceDAEToODE основан на Исключении Гаусса. Этот алгоритм более надежен, чем алгоритм Pantelides, используемый reduceDAEIndex, но это может быть намного медленнее.

Введенный в R2014b