Ваша первая проблема в определении f
:
[T,Y] = ode45(@modelo10, [0,20], [0,4,1]);
f = @(t) 2.*cos(y(:,1)) + y(:,2);
Обратите внимание, что в первой строке указана переменная Y
, но во второй вы используете y
. Это разные переменные. Это, вероятно, работает для вас, потому что у вас есть переменная y
, определенная в вашем рабочем пространстве, но она делает не то.
Далее ваш f
является функцией f(t)
, но он определен без использования ввода t
. Он всегда выводит одно и то же. fplot
ожидает функцию, которая выводит массив того же размера, что и его вход, это сообщение об ошибке, которое вы получаете.
Однако вам не нужно здесь определять функцию, вы можете напрямую вычислить все значения для f
и построить их, используя plot
:
[t,y] = ode45(@modelo10, [0,20], [0,4,1]);
f = 2.*cos(y(:,1)) + y(:,2);
plot(t,f)
Кроме того, я хочу порекомендовать вам не использовать global
. Вам это здесь не нужно, вы можете определить omega
в качестве входного аргумента для modelo10
:
function dy = modelo10(t,y,omega)
dy = zeros(3,1);
dy(1) = y(2) - y(3);
dy(2) = -3*y(2) - 5*sin(omega*y(1));
dy(3) = y(1)*y(2);
end
и затем позвоните ode45
следующим образом:
[t,y] = ode45(@(t,y)modelo10(t,y,omega), [0,20], [0,4,1]);
Здесь @(t,y)modelo10(t,y,omega)
определяет анонимную функцию, которая несет в себе значение omega
. Эта анонимная функция имеет два входных аргумента (t
и y
), как того требует ode45
.
Наконец, вы можете упростить свой код, определив modelo10
в одной строке:
function dy = modelo10(t,y,omega)
dy = [ y(2) - y(3); -3*y(2) - 5*sin(omega*y(1)); y(1)*y(2) ];
end
Теперь вы можете сделать:
modelo10 = @(t,y) [ y(2) - y(3); -3*y(2) - 5*sin(omega*y(1)); y(1)*y(2) ];
[t,y] = ode45(modelo10, [0,20], [0,4,1]);