reduceDAEIndex

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

Синтаксис

[newEqs,newVars] = reduceDAEIndex(eqs,vars)
[newEqs,newVars,R] = reduceDAEIndex(eqs,vars)
[newEqs,newVars,R,oldIndex] = reduceDAEIndex(eqs,vars)

Описание

пример

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

reduceDAEIndex сохраняет исходные уравнения и переменные и вводит новые переменные и уравнения. После преобразования reduceDAEIndex проверяет дифференциальный индекс новой системы путем вызова isLowIndexDAE. Если индекс newEqs равняется 2 или выше, то reduceDAEIndex выдает предупреждение.

пример

[newEqs,newVars,R] = reduceDAEIndex(eqs,vars) возвращает матричный R, который выражает новые переменные в newVars как производные исходных переменных vars.

пример

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

Примеры

Уменьшайте дифференциальный индекс системы ДАУ

Проверяйте, имеет ли следующая система ДАУ минимум (0 или 1) или высокий (>1) дифференциальный индекс. Если индекс выше, чем 1, то используйте reduceDAEIndex, чтобы уменьшать его.

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

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

свернуть все

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

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

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

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

свернуть все

Система ДАУ первого порядка дифференциального индекса 1, возвращенного как вектор-столбец символьных выражений.

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

Отношения между новыми и исходными переменными, возвращенными как символьная матрица с двумя столбцами. Первый столбец содержит новые переменные. Второй столбец содержит их определения как производные исходных переменных vars.

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

Алгоритмы

Реализация reduceDAEIndex использует алгоритм Pantelides. Этот алгоритм уменьшает системы более высокого индекса до систем более низкого индекса путем выборочного добавления дифференцируемых форм исходных уравнений. Алгоритм Pantelides может недооценить дифференциальный индекс новой системы, и поэтому, может не уменьшать дифференциальный индекс до 1. В этом случае reduceDAEIndex выдает предупреждение и, для синтаксиса с четырьмя выходными аргументами, возвращает значение oldIndex как NaN. Использование функции reduceDAEToODE более надежное, но более медленное Исключение Гаусса. Обратите внимание на то, что reduceDAEToODE требует, чтобы система ДАУ была полулинейна.

Введенный в R2014b