reduceDAEIndex

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

Описание

пример

[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. Этот алгоритм сводит системы с более высоким индексом к системам с более низким индексом путем избирательного добавления дифференцированных форм исходных уравнений. Алгоритм Пантелидеса может недооценивать дифференциальный индекс новой системы, и, следовательно, может не снизить дифференциальный индекс до 1. В этом случае, reduceDAEIndex выдает предупреждение и, для синтаксиса с четырьмя выходными аргументами, возвращает значение oldIndex как NaN. reduceDAEToODE функция использует более надежное, но более медленное Гауссово исключение. Обратите внимание, что reduceDAEToODE требует, чтобы система ДАУ была полинейной.

Введенный в R2014b