В этом примере показано, как решить дифференциальные алгебраические уравнения (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 =
vars = [x(t), y(t), F(t)]
vars =
Перепишите эту систему дисковых полок в систему дифференциальных алгебраических уравнений первого порядка.
[eqs, vars, newVars] = reduceDifferentialOrder(eqs, vars)
eqs =
vars =
newVars =
Перед использованием числового решателя MATLAB, например ode15i, необходимо выполнить следующие действия.
Преобразуйте систему дисковых полок в дескриптор функции MATLAB.
Выберите числовые значения для символьных параметров системы.
Установите непротиворечивые начальные условия.
Чтобы преобразовать систему дисковых полок в дескриптор функции 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);

warning(s)
Проверьте дифференциальный индекс системы дисковой полки.
isLowIndexDAE(eqs, vars)
ans = logical
0
Этот результат объясняет, почему ode15i не может решить эту систему. Эта функция требует, чтобы входная система дисковых полок имела дифференциальный индекс 0 или 1. Уменьшите дифференциальный индекс, расширив модель до эквивалентной более крупной системы дисковых полок, включающей некоторые скрытые алгебраические ограничения.
[eqs, vars, newVars, index] = reduceDAEIndex(eqs, vars)
eqs =
vars =
newVars =
index = 3
Четвертый вывод показывает, что дифференциальный индекс исходной модели равен трем. Упростите новую систему.
[eqs, vars, S] = reduceRedundancies(eqs, vars)
eqs =
vars =
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)
