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), 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