#plot #octave #differential-equations #vibration #nonlinear-equation
#график #октава #дифференциальные уравнения #вибрация #нелинейное уравнение
Вопрос:
У меня есть система нелинейных дифференциальных уравнений для колебательной системы с 3 степенями свободы. система дифференциальных уравнений
Сначала я хочу построить y, y_L и y_R в зависимости от времени (для заданного значения для Omega), а затем я хочу построить домены (максимальные значения y, y_L и y_R) для различных значений Omega. К сожалению, я не силен в октаве. Я написал следующий код в Octave (на основе образца, предоставленного одним из пользователей), но он заканчивается этой ошибкой: «анонимные функциональные тела должны быть одиночными выражениями».
Я был бы признателен, если кто-нибудь сможет мне помочь.
Вот код:
Me = 4000;
me = 20;
c = 2000;
c1 = 700;
c2 = 700;
k = 20000;
k1 = 250000;
k2 = 20000;
a0 = 0.01;
om = 25;
mu1 = (c 2*c2)/(Me);
mu2 = (c2)/(Me);
mu3 = (c1 c2)/(me);
mu4 = (c2)/(me);
w12 = (2*k2)/(Me);
w22 = (k1 k2)/(me);
a1 = (k2)/(me);
a2 = (k)/(Me);
F0 = (k1*a0)/(Me);
couplode = @(t,y) [y(2); mu4*y(4) - mu3*y(2) - w22*y(1) a1*y(3) F0*cos(om*t); y(4); mu2*(y(2) y(6)) - mu1*y(4) - w12*y(3) 0.5*w12*(y(1) y(5)) a2((y(3)).^3; y(6); mu4*y(4) - mu3*y(6) - w22*y(5) a1*y(3) F0*cos(om*t)];
[t,y] = ode45(couplode, [0 0.49*pi], [1;1;1;1;1;1]*1E-8);
figure(1)
plot(t, y)
grid
str = {'$$ dot{y_L} $$', '$$ y_L $$', '$$ dot{y} $$', '$$ y $$', '$$ dot{y_R} $$', '$$ y_R $$'};
legend(str, 'Interpreter','latex', 'Location','NW')
Комментарии:
1. Вы пропустили определение
me
иMe
. Что вы получаете, если оцениваетеcouplode(t0,y0)
, получаете ли вы плоский вектор желаемого размера? Пробелы в определениях массива и матрицы могут давать забавные результаты.2. Извините, они были оставлены при копировании и вставке. Я отредактировал код. Что я должен добавить в код для оценки couplode(t0, y0)?
Ответ №1:
У вас есть странный термин, а в конце определения вектора
... a2((y(3)).^3
Вы, конечно, имели в виду
... a2*y(3).^3
Вы получаете лучшую наглядность и упрощаете отладку, разбивая ее на отдельные строки
couplode = @(t,y) [ y(2);
mu4*y(4)-mu3*y(2)-w22*y(1) a1*y(3) F0*cos(om*t);
y(4);
mu2*(y(2) y(6)) - mu1*y(4) - w12*y(3) 0.5*w12*(y(1) y(5)) a2*y(3).^3;
y(6);
mu4*y(4)-mu3*y(6)-w22*y(5) a1*y(3) F0*cos(om*t)];
По крайней мере, в этой форме пробелы или отсутствие пробелов не имеет значения. В общем случае в matlab / octave [a b -c]
совпадает с [a, b, -c]
, поэтому нужно быть осторожным, чтобы выражение не интерпретировалось как строка матрицы. Пробелы в обоих местах знака операции переключаются обратно на интерпретацию с одним выражением.