exponenta event banner

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

Этот рабочий процесс является альтернативным рабочим процессом для решения полулинейных дифференциальных алгебраических уравнений (DAE), используемых только в том случае, если reduceDAEIndex не удалось выполнить стандартный рабочий процесс с предупреждающим сообщением: The index of the reduced DAEs is larger than 1. [daetools::reduceDAEIndex]. Стандартный рабочий процесс см. в разделе Решение дифференциальных алгебраических уравнений (дисковых полок).

Перед началом других шагов выполните шаги 1 и 2 в разделе Решение дифференциальных алгебраических уравнений (DAE). Затем, на шаге 3, если reduceDAEIndex сбой, уменьшение дифференциального индекса с помощью reduceDAEToODE. Преимущество reduceDAEToODE заключается в том, что он надежно сокращает полулинейные дисковые полки до ОДУ (дисковые полки индекса 0). Однако эта функция выполняется медленнее и работает только на полулинейных системах дисковых полок. reduceDAEToODE может привести к сбою, если система не является полунеральной.

Чтобы решить проблему с системой дисковых полок, выполните следующие действия.

Шаг 1. Задание уравнений и переменных

Система уравнений дисковых полок:

md2xdt2 = T (t) x (t) rmd2ydt2 = T (t) y (t) r-mgx (t) 2 + y (t) 2 = r2

Укажите независимые переменные и переменные состояния с помощью 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);

Шаг 2. Уменьшение разностного порядка

Дифференциальный порядок системы дисковых полок является наивысшим дифференциальным порядком ее уравнений. Для решения дисковых полок с помощью MATLAB дифференциальный порядок должен быть уменьшен до 1. Здесь первое и второе уравнения имеют производные второго порядка x(t) и y(t). Таким образом, дифференциальный порядок равен 2.

Сокращение системы до системы первого заказа с помощью reduceDifferentialOrder. reduceDifferentialOrder функция заменяет производные новыми переменными, такими как Dxt(t) и Dyt(t). Правая часть выражений в eqns является 0.

[eqns,vars] = reduceDifferentialOrder(eqns,vars)
eqns = 

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

Шаг 3. Уменьшить дифференциальный индекс с помощью reduceDAEToODE

Для уменьшения дифференциального индекса дисковых полок, описанного eqns и vars, использовать reduceDAEToODE. Чтобы уменьшить индекс, reduceDAEToODE добавляет в систему новые переменные и уравнения. reduceDAEToODE также возвращает ограничения, которые являются условиями, помогающими найти начальные значения, чтобы гарантировать, что результирующие ODE равны начальным дисковым полкам.

[ODEs,constraints] = reduceDAEToODE(eqns,vars)
ODEs = 

(Dxt(t)-t x(t)Dyt(t)-t y(t)mt Dxt(t)-T(t)x(t)rmt Dyt(t)-T(t)y(t)-gmrr-4T(t)y(t)-2gmrt y(t)-2x(t)2+2y(t)2t T(t)-4T(t)x(t)t x(t)-4mrDxt(t)t Dxt(t)-4mrDyt(t)t Dyt(t))[Dxt(t) - diff(x(t), t); Dyt(t) - diff(y(t), t); m*diff(Dxt(t), t) - (T(t)*x(t))/r; m*diff(Dyt(t), t) - (T(t)*y(t) - g*m*r)/r; - (4*T(t)*y(t) - 2*g*m*r)*diff(y(t), t) - (2*x(t)^2 + 2*y(t)^2)*diff(T(t), t) - 4*T(t)*x(t)*diff(x(t), t) - 4*m*r*Dxt(t)*diff(Dxt(t), t) - 4*m*r*Dyt(t)*diff(Dyt(t), t)]

constraints = 

(-2mrDxt(t)2-2mrDyt(t)2-2T(t)x(t)2-2T(t)y(t)2+2gmry(t)r2-x(t)2-y(t)22Dxt(t)x(t)+2Dyt(t)y(t))[- 2*m*r*Dxt(t)^2 - 2*m*r*Dyt(t)^2 - 2*T(t)*x(t)^2 - 2*T(t)*y(t)^2 + 2*g*m*r*y(t); r^2 - x(t)^2 - y(t)^2; 2*Dxt(t)*x(t) + 2*Dyt(t)*y(t)]

Шаг 4. ODE в дескрипторы функций для ode15 и ode23t

Из выходных данных 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 = 

(-100000-1000000m00000m-4T(t)x(t)2gmr-4T(t)y(t)-2x(t)2-2y(t)2-4mrDxt(t)-4mrDyt(t))[-sym(1), sym(0), sym(0), sym(0), sym(0); sym(0), -sym(1), sym(0), sym(0), sym(0); sym(0), sym(0), sym(0), m, sym(0); sym(0), sym(0), sym(0), sym(0), m; -4*T(t)*x(t), 2*g*m*r - 4*T(t)*y(t), - 2*x(t)^2 - 2*y(t)^2, -4*m*r*Dxt(t), -4*m*r*Dyt(t)]

f = 

(-Dxt(t)-Dyt(t)T(t)x(t)rT(t)y(t)-gmrr0)[-Dxt(t); -Dyt(t); (T(t)*x(t))/r; (T(t)*y(t) - g*m*r)/r; sym(0)]

Уравнения в ODEs может содержать символические параметры, которые не указаны в векторе переменных vars. Поиск этих параметров с помощью setdiff на выходе symvar от ODEs и vars.

pODEs = symvar(ODEs);
pvars = symvar(vars);
extraParams = setdiff(pODEs, pvars)
extraParams = (gmr)[g, m, r]

Дополнительные параметры, которые необходимо указать, это масса 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);

Шаг 5. Начальные условия для ode15s и ode23t

Для решателей требуются начальные значения для всех переменных в дескрипторе функции. Поиск начальных значений, удовлетворяющих уравнениям, с помощью MATLAB ®decic функция. decic принимает догадки (которые могут не удовлетворять уравнениям) для начальных условий и пытается найти удовлетворительные начальные условия, используя эти догадки. decic может привести к сбою, в этом случае необходимо вручную ввести непротиворечивые начальные значения для проблемы.

Сначала проверьте переменные в vars.

vars
vars = 

(x(t)y(t)T(t)Dxt(t)Dyt(t))[x(t); y(t); T(t); Dxt(t); Dyt(t)]

Здесь, 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);

Шаг 6. Решение системы ОДУ с помощью ode15s или ode23t

Решение проблемы интеграции системы в течение периода времени 0t0.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

Figure contains an axes. The axes contains 3 objects of type line. These objects represent x(t), y(t), T(t).

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

Набор 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

Figure contains an axes. The axes contains 3 objects of type line. These objects represent x(t), y(t), T(t).

См. также

| | | | | | | | | |

Связанные темы