Этот пример показывает, как решить дифференциальные алгебраические уравнения (ДАУ) высокого дифференциального индекса с помощью Symbolic Math Toolbox™.
Инженеры часто определяют поведение своих физических объектов (механических систем, электрических устройств и так далее) смесью дифференциальных уравнений и алгебраических уравнений. MATLAB ® предоставляет специальные числовые решатели, такие как ode15i и ode15s, способные интегрировать такие ДАУ - при условии, что их «дифференциальный индекс» не превышает 1.
Этот пример показывает рабочий процесс от настройки модели как системы дифференциальных уравнений с алгебраическими ограничениями до численной симуляции. Используются следующие функции Symbolic Math Toolbox.
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)
