exponenta event banner

Анализ и манипулирование дифференциальными алгебраическими уравнениями

В этом примере показано, как решить дифференциальные алгебраические уравнения (DAE) высокого дифференциального индекса с помощью символьных математических Toolbox™.

Инженеры часто задают поведение своих физических объектов (механических систем, электрических устройств и так далее) смесью дифференциальных уравнений и алгебраических уравнений. MATLAB ® предоставляет специальные числовые решатели, такие какode15i и ode15s, способные интегрировать такие дисковые полки - при условии, что их «дифференциальный индекс» не превышает 1.

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

  • daeFunction

  • findDecoupledBlocks

  • incidenceMatrix

  • isOfLowDAEIndex

  • reduceDifferentialOrder

  • massMatrixForm

  • reduceDAEIndex

  • reduceDAEToODE

  • reduceRedundancies

  • sym/decic

Определение параметров модели

Рассмотрим 2-D физический маятник, состоящий из массы m присоединено к началу координат строкой постоянной длины r. Только гравитационное ускорение g = 9.81 m/s^2 действует на массу. Модель состоит из дифференциального уравнения второго порядка для положения (x(t), y(t)) массы с неизвестной силой F(t) внутри струны, служащей для удержания массы на окружности. Усилие направлено вдоль струны.

syms x(t) y(t) F(t) m g r
eqs = [m*diff(x(t), t, t) == F(t)/r*x(t);
       m*diff(y(t), t, t) == F(t)/r*y(t) - m*g;
       x(t)^2 + y(t)^2 == r^2]
eqs = 

(m2t2 x(t)=F(t)x(t)rm2t2 y(t)=F(t)y(t)r-gmx(t)2+y(t)2=r2)[m*diff(x(t), t, 2) == (F(t)*x(t))/r; m*diff(y(t), t, 2) == (F(t)*y(t))/r - g*m; x(t)^2 + y(t)^2 == r^2]

vars = [x(t), y(t), F(t)]
vars = (x(t)y(t)F(t))[x(t), y(t), F(t)]

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

[eqs, vars, newVars] = reduceDifferentialOrder(eqs, vars)
eqs = 

(mt Dxt(t)-F(t)x(t)rgm+mt Dyt(t)-F(t)y(t)r-r2+x(t)2+y(t)2Dxt(t)-t x(t)Dyt(t)-t y(t))[m*diff(Dxt(t), t) - (F(t)*x(t))/r; g*m + m*diff(Dyt(t), t) - (F(t)*y(t))/r; - 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))[x(t); y(t); F(t); Dxt(t); Dyt(t)]

newVars = 

(Dxt(t)t x(t)Dyt(t)t y(t))[Dxt(t), diff(x(t), t); Dyt(t), diff(y(t), t)]

Попробуйте решить проблему с системой High-Index DAE

Перед использованием числового решателя MATLAB, например ode15i, необходимо выполнить следующие действия.

  1. Преобразуйте систему дисковых полок в дескриптор функции MATLAB.

  2. Выберите числовые значения для символьных параметров системы.

  3. Установите непротиворечивые начальные условия.

Чтобы преобразовать систему дисковых полок в дескриптор функции MATLAB, используйте daeFunction.

F = daeFunction(eqs, vars, [m, g, r])
F = function_handle with value:
    @(t,in2,in3,in4)[in3(4,:).*in4(:,1)-(in2(3,:).*in2(1,:))./in4(:,3);in3(5,:).*in4(:,1)+in4(:,1).*in4(:,2)-(in2(3,:).*in2(2,:))./in4(:,3);-in4(:,3).^2+in2(1,:).^2+in2(2,:).^2;in2(4,:)-in3(1,:);in2(5,:)-in3(2,:)]

Присвойте числовые значения символьным параметрам системы: m = 1kg, g = 9.18m/s^2, и r = 1m.

f = @(t, y, yp)  F(t, y, yp, [1, 9.81, 1])
f = function_handle with value:
    @(t,y,yp)F(t,y,yp,[1,9.81,1])

Дескриптор функции f является подходящим входом для числового решателя ode15i. Следующим шагом является вычисление согласованных начальных условий. Использовать odeset для установки числовых допусков. Затем используйте MATLAB decic функция для вычисления согласованных начальных условий y0, yp0 для позиций и производных в момент времени t0 = 0.

opt = odeset('RelTol', 10.0^(-4), 'AbsTol' , 10.0^(-4));
t0 = 0;
[y0,yp0] = decic(f, t0, [0.98;-0.21; zeros(3,1)], [], zeros(5,1), [], opt)
y0 = 5×1

    0.9777
   -0.2100
         0
         0
         0

yp0 = 5×1

         0
         0
         0
         0
   -9.8100

Проверьте исходные условия:

f(t0, y0, yp0)
ans = 5×1
10-16 ×

         0
         0
   -0.3469
         0
         0

Теперь вы можете использовать ode15i чтобы попытаться решить систему. При звонке ode15i, интеграция немедленно прекращается и выдает следующие предупреждения.

Warning: Matrix is singular, close to singular or badly scaled.

Results may be inaccurate. RCOND = NaN.

Warning: Failure at t=0.000000e+00.

Unable to meet integration tolerances without reducing the step

size below the smallest value allowed (0.000000e+00) at time t.

Для этого примера: ode15i выдает эти предупреждения несколько раз. Для удобства чтения отключите предупреждения с помощью warning('off','all') перед вызовом ode15i а затем снова включить их.

tfinal = 0.5;
s = warning('off','all');
ode15i(f, [t0, tfinal], y0, yp0, opt);

Figure contains an axes. The axes contains 10 objects of type line.

warning(s)

Анализ и настройка системы дисковых полок

Проверьте дифференциальный индекс системы дисковой полки.

isLowIndexDAE(eqs, vars)
ans = logical
   0

Этот результат объясняет, почему ode15i не может решить эту систему. Эта функция требует, чтобы входная система дисковых полок имела дифференциальный индекс 0 или 1. Уменьшите дифференциальный индекс, расширив модель до эквивалентной более крупной системы дисковых полок, включающей некоторые скрытые алгебраические ограничения.

[eqs, vars, newVars, index] = reduceDAEIndex(eqs, vars)
eqs = 

(mDxtt(t)-F(t)x(t)rgm+mDytt(t)-F(t)y(t)r-r2+x(t)2+y(t)2Dxt(t)-Dxt1(t)Dyt(t)-Dyt1(t)2Dxt1(t)x(t)+2Dyt1(t)y(t)2y(t)t Dyt1(t)+2Dxt1(t)2+2Dyt1(t)2+2Dxt1t(t)x(t)Dxtt(t)-Dxt1t(t)Dytt(t)-t Dyt1(t)Dyt1(t)-t y(t))[m*Dxtt(t) - (F(t)*x(t))/r; g*m + m*Dytt(t) - (F(t)*y(t))/r; - 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*y(t)*diff(Dyt1(t), t) + 2*Dxt1(t)^2 + 2*Dyt1(t)^2 + 2*Dxt1t(t)*x(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))[x(t); y(t); F(t); Dxt(t); Dyt(t); Dytt(t); Dxtt(t); Dxt1(t); Dyt1(t); Dxt1t(t)]

newVars = 

(Dytt(t)t Dyt(t)Dxtt(t)t Dxt(t)Dxt1(t)t x(t)Dyt1(t)t y(t)Dxt1t(t)2t2 x(t))[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, 2)]

index = 3

Четвертый вывод показывает, что дифференциальный индекс исходной модели равен трем. Упростите новую систему.

[eqs, vars, S] = reduceRedundancies(eqs, vars)
eqs = 

(-F(t)x(t)-mrDxtt(t)rgmr-F(t)y(t)+mrDytt(t)r-r2+x(t)2+y(t)22Dxt(t)x(t)+2Dyt(t)y(t)2Dxt(t)2+2Dyt(t)2+2Dxtt(t)x(t)+2Dytt(t)y(t)Dytt(t)-t Dyt(t)Dyt(t)-t y(t))[-(F(t)*x(t) - m*r*Dxtt(t))/r; (g*m*r - F(t)*y(t) + m*r*Dytt(t))/r; - r^2 + x(t)^2 + y(t)^2; 2*Dxt(t)*x(t) + 2*Dyt(t)*y(t); 2*Dxt(t)^2 + 2*Dyt(t)^2 + 2*Dxtt(t)*x(t) + 2*Dytt(t)*y(t); 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); y(t); F(t); Dxt(t); Dyt(t); Dytt(t); Dxtt(t)]

S = struct with fields:
      solvedEquations: [3x1 sym]
    constantVariables: [0x2 sym]
    replacedVariables: [3x2 sym]
       otherEquations: [0x1 sym]

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

isLowIndexDAE(eqs, vars)
ans = logical
   1

Решение системы дисковых полок с низким индексом

Создайте дескриптор функции MATLAB, который заменяет символьные параметры числовыми значениями.

F = daeFunction(eqs, vars, [m, g, r]) 
F = function_handle with value:
    @(t,in2,in3,in4)[-(in2(3,:).*in2(1,:)-in2(7,:).*in4(:,1).*in4(:,3))./in4(:,3);(-in2(3,:).*in2(2,:)+in2(6,:).*in4(:,1).*in4(:,3)+in4(:,1).*in4(:,2).*in4(:,3))./in4(:,3);-in4(:,3).^2+in2(1,:).^2+in2(2,:).^2;in2(4,:).*in2(1,:).*2.0+in2(5,:).*in2(2,:).*2.0;in2(7,:).*in2(1,:).*2.0+in2(6,:).*in2(2,:).*2.0+in2(4,:).^2.*2.0+in2(5,:).^2.*2.0;in2(6,:)-in3(5,:);in2(5,:)-in3(2,:)]

f = @(t, y, yp)  F(t, y, yp, [1, 9.81, 1])
f = function_handle with value:
    @(t,y,yp)F(t,y,yp,[1,9.81,1])

Вычислить согласованные начальные условия для индекса, уменьшенного MATLAB decic функция. Здесь, opt - структура опций, задающая числовые допуски. Вы уже рассчитали его с помощью odeset.

[y0,yp0] = decic(f, t0, [0.98;-0.21; zeros(5,1)], [], zeros(7,1), [], opt)
y0 = 7×1

    0.9779
   -0.2093
   -2.0528
   -0.0000
         0
   -9.3804
   -2.0074

yp0 = 7×1

         0
         0
         0
         0
   -9.3804
         0
         0

Решите систему и постройте график решения.

ode15i(f, [t0, tfinal], y0, yp0, opt)

Figure contains an axes. The axes contains 14 objects of type line.