Этот рабочий процесс является альтернативным рабочим процессом к решению полулинейных дифференциальных алгебраических уравнений (ДАУ), используемые только если reduceDAEIndex
отказавший в стандартном рабочем процессе с предупреждающим сообщением: The index of the reduced DAEs is larger than 1. [daetools::reduceDAEIndex]
. Для стандартного рабочего процесса смотрите, Решают Дифференциальные Алгебраические уравнения (ДАУ).
Полные шаги 1 и 2 в Решают Дифференциальные Алгебраические уравнения (ДАУ) прежде, чем начать другие шаги. Затем на шаге 3, если reduceDAEIndex
сбои, уменьшайте дифференциальный индекс с помощью reduceDAEToODE
. Преимущество reduceDAEToODE
это, это надежно уменьшает полулинейные ДАУ до ОДУ (ДАУ индекса 0
). Однако эта функция медленнее и работает только над полулинейными системами ДАУ. reduceDAEToODE
может перестать работать, если система не полулинейна.
Чтобы решить вашу систему ДАУ, завершите эти шаги.
Система уравнений ДАУ:
Задайте независимые переменные и переменные состояния при помощи syms
.
syms x(t) y(t) T(t) m r g
Задайте уравнения при помощи == оператор.
eqn1 = m*diff(x(t), 2) == T(t)/r*x(t); eqn2 = m*diff(y(t), 2) == T(t)/r*y(t) - m*g; eqn3 = x(t)^2 + y(t)^2 == r^2; eqns = [eqn1 eqn2 eqn3];
Поместите переменные состояния в вектор-столбец. Сохраните количество исходных переменных для ссылки.
vars = [x(t); y(t); T(t)]; origVars = length(vars);
Дифференциальный порядок системы ДАУ является самым высоким дифференциальным порядком своих уравнений. Чтобы решить ДАУ с помощью MATLAB, дифференциальный порядок должен уменьшаться до 1
. Здесь, первые и вторые уравнения имеют производные второго порядка x(t)
и y(t)
. Таким образом дифференциальным порядком является 2
.
Уменьшайте систему до системы первого порядка при помощи reduceDifferentialOrder
. reduceDifferentialOrder
функционируйте производные замен с новыми переменными, такими как Dxt(t)
и Dyt(t)
. Правая сторона выражений в eqns
0
.
[eqns,vars] = reduceDifferentialOrder(eqns,vars)
eqns =
vars =
reduceDAEToODE
Уменьшать дифференциальный индекс ДАУ, описанных eqns
и vars
, используйте reduceDAEToODE
. Уменьшать индекс, reduceDAEToODE
добавляют новые переменные и уравнения к системе. reduceDAEToODE
также возвращает ограничения, которые являются условиями, что справка находит, что начальные значения гарантируют, что получившиеся ОДУ равны начальным ДАУ.
[ODEs,constraints] = reduceDAEToODE(eqns,vars)
ODEs =
constraints =
От выхода reduceDAEToODE
, у вас есть вектор из уравнений в ODEs
и вектор из переменных в vars
. Использовать ode15s
или ode23t
, вам нужны два указателя на функцию: одно представление большой матрицы системы ОДУ и другого представления вектора, содержащего правые стороны уравнений большой матрицы. Эти указатели на функцию являются эквивалентным представлением большой матрицы системы ОДУ где M (t, y (t)) y’ (t) = f (t, y (t)).
Найдите эти указатели на функцию при помощи massMatrixForm
получить большую матрицу massM
(M в уравнении) и правые стороны f
.
[massM,f] = massMatrixForm(ODEs,vars)
massM =
f =
Уравнения в ODEs
может содержать символьные параметры, которые не заданы в векторе из переменных vars
. Найдите эти параметры при помощи setdiff
на выходе symvar
от ODEs
и vars
.
pODEs = symvar(ODEs); pvars = symvar(vars); extraParams = setdiff(pODEs, pvars)
extraParams =
Дополнительными параметрами, которые необходимо задать, является массовый m
, радиус r
, и ускорение свободного падения g
.
Преобразуйте massM
и f
к указателям на функцию с помощью odeFunction
. Задайте дополнительные символьные параметры как дополнительные входные параметры к odeFunction
.
massM = odeFunction(massM, vars, m, r, g); f = odeFunction(f, vars, m, r, g);
Остальная часть рабочего процесса является чисто числовой. Установите значения параметров и замените значениями параметров в DAEs
и constraints
.
m = 1; r = 1; g = 9.81; ODEsNumeric = subs(ODEs); constraintsNumeric = subs(constraints);
Создайте указатель на функцию, подходящий для входа к ode15s
или ode23s
.
M = @(t,Y) massM(t,Y,m,r,g); F = @(t,Y) f(t,Y,m,r,g);
ode15s
и ode23t
Решатели требуют начальных значений для всех переменных в указателе на функцию. Найдите начальные значения, которые удовлетворяют уравнениям при помощи MATLAB® decic
функция. decic
принимает предположения (который не может удовлетворить уравнениям) для начальных условий, и пытается найти удовлетворительные начальные условия с помощью тех предположений. decic
может перестать работать, в этом случае необходимо вручную предоставить сопоставимые начальные значения для проблемы.
Во-первых, проверяйте переменные в vars
.
vars
vars =
Здесь, Dxt(t)
первая производная x(t)
, и так далее. В 5
существует 5 переменных-
1
вектор. Поэтому предположениями для начальных значений переменных и их производных должен также быть 5
- 1
векторы.
Примите, что начальное угловое смещение маятника составляет 30 ° или pi/6
, и источник координат в точке приостановки маятника. Учитывая, что мы использовали радиус r
из 1
, начальное горизонтальное положение x(t)
r*sin(pi/6)
. Начальное вертикальное положение y(t)
-r*cos(pi/6)
. Задайте эти начальные значения переменных в векторном y0est
.
Произвольно установите начальные значения остающихся переменных и их производных к 0
. Это не хорошие предположения. Однако они достаточны для этой проблемы. В вашей проблеме, если decic
ошибки, затем обеспечьте лучшие предположения и обратитесь к decic
страница.
y0est = [r*sin(pi/6); -r*cos(pi/6); 0; 0; 0]; yp0est = zeros(5,1);
Создайте набор опции, который содержит большую матрицу M
из системы и задает числовые допуски к числовому поиску.
opt = odeset('Mass', M, 'RelTol', 10.0^(-7), 'AbsTol' , 10.0^(-7));
Найдите начальные значения сопоставимыми с системой ОДУ и с алгебраическими ограничениями при помощи decic
. Параметр [1,0,0,0,1]
в этом вызове функции фиксирует первое и последний элемент в y0est
, так, чтобы decic
не изменяет их во время числового поиска. Здесь, эта фиксация необходима, чтобы гарантировать decic
находит удовлетворительные начальные условия.
[y0, yp0] = decic(ODEsNumeric, vars, constraintsNumeric, 0,...
y0est, [1,0,0,0,1], yp0est, opt)
y0 = 5×1
0.5000
-0.8660
-8.4957
0
0
yp0 = 5×1
0
0
0
-4.2479
-2.4525
Теперь создайте набор опции, который содержит большую матрицу M
из системы и векторного yp0
из сопоставимых начальных значений для производных. Вы будете использовать этот набор опции при решении системы.
opt = odeset(opt, 'InitialSlope', yp0);
ode15s
или ode23t
Решите систему, объединяющуюся по отрезку времени 0
≤ t
≤ 0.5 . Добавьте линии сетки и легенду к графику. Используйте
ode23s
заменяя ode15s
с ode23s
.
[tSol,ySol] = ode15s(F, [0, 0.5], y0, opt); plot(tSol,ySol(:,1:origVars),'-o') for k = 1:origVars S{k} = char(vars(k)); end legend(S, 'Location', 'Best') grid on
Решите систему для различных значений параметров путем устанавливания нового значения и регенерации указателя на функцию и начальных условий.
Установите r
к 2
и повторите шаги.
r = 2; ODEsNumeric = subs(ODEs); constraintsNumeric = subs(constraints); M = @(t,Y) massM(t,Y,m,r,g); F = @(t,Y) f(t,Y,m,r,g); y0est = [r*sin(pi/6); -r*cos(pi/6); 0; 0; 0]; opt = odeset('Mass', M, 'RelTol', 10.0^(-7), 'AbsTol' , 10.0^(-7)); [y0, yp0] = decic(ODEsNumeric, vars, constraintsNumeric, 0,... y0est, [1,0,0,0,1], yp0est, opt); opt = odeset(opt, 'InitialSlope', yp0);
Решите систему для нового значения параметров.
[tSol,ySol] = ode15s(F, [0, 0.5], y0, opt); plot(tSol,ySol(:,1:origVars),'-o') for k = 1:origVars S{k} = char(vars(k)); end legend(S, 'Location', 'Best') grid on
daeFunction
| decic
| findDecoupledBlocks
| incidenceMatrix
| isLowIndexDAE
| massMatrixForm
| odeFunction
| reduceDAEIndex
| reduceDAEToODE
| reduceDifferentialOrder
| reduceRedundancies