Ошибка в ode15i из-за размеров, что это значит? - PullRequest
0 голосов
/ 19 марта 2019

КОД

t0 = 0;
tfinal = 1;
tspan = [t0 tfinal];

optionsII = odeset('Events',@myEventsFcnII);

y0 = [-0.5972 6.2068];
yp0 = 10000*[0.0006 1.0178];


[t,y,te,ye,ie] = ode15i(@(t,y,yp) StateII(t,y,yp),tspan,y0,yp0,optionsII);

function res = StateII(t,y,yp)
% Constants
mB = 4.5*10^(-3); % [kg]
g = 9.81; % [m/s^2]
JB = 7*10^(-7); % [kgm]
rS = 3.1*10^(-3); % [m]
r0 = 2.5*10^(-3); % [m]
hS = 2*10^(-2); % [m]
lG = 1.5*10^(-2); % [m]
cp = 5.6*10^(-3); % [N/rad]

% y = (b,bv)

A = JB+mB*lG^2;
B = cp*(-(rS-r0)/hS)-mB*lG*g; % State II

res = [yp(1)-y(2);
       yp(2)-1/A*(B-cp*y(1))];
end

function [value,isterminal,direction] = myEventsFcnII(t,y,yp)
% Constants
mS = 3*10^(-4); % [kg]
mB = 4.5*10^(-3); % [kg]
g = 9.81; % [m/s^2]
rS = 3.1*10^(-3); % [m]
lS = 10^(-2); % [m]
r0 = 2.5*10^(-3); % [m]
hS = 2*10^(-2); % [m]
lG = 1.5*10^(-2); % [m]
lB = 2.01*10^(-2); % [m]
hB = 2*10^(-2); % [m]
cp = 5.6*10^(-3); % [N/rad]

Z2 = -(mS+mB)*g-mB*lG*yp(2);
Z1II = (cp*(y(1)+(rS-r0)/hS)-rS*Z2-mB*lS*lG*yp(2)-mB*lS*g)/hS;

value = [Z1II];
isterminal = [1];
direction = [-1];
end

СООБЩЕНИЕ ОБ ОШИБКЕ

Unable to perform assignment because the size of the left side is 2-by-1 and the size of the right side is 2-by-2.

Error in ode15i (line 241)
meshsol(:,2) = y0 - h*yp0;

Error in sally (line 11)
[t,y,te,ye,ie] = ode15i(@(t,y,yp) StateII(t,y,yp),tspan,y0,yp0,optionsII);

Моя версия Matlab - 2018a.Я не понимаю, в чем проблема, размеры моих векторов y0 и yp0 одинаковы, поэтому ode15i не должен выдавать ошибку об этом.ode45 работал раньше, но мне нужно решить эту систему, используя ode15i, потому что у меня есть функция события, зависящая от скорости.Как мне это решить?Где проблема в моем коде?

1 Ответ

0 голосов
/ 22 марта 2019

Я работаю с Matlab 2016a, поэтому не могу окончательно подтвердить, что это сработает.Если я использую ваш код, я получаю сообщение об ошибке.Если я изменю определения y0 и yp0 на векторы столбцов вместо векторов строк, то я не получу ошибку.Как так:

y0 = [-0.5972 6.2068]';
yp0 = 10000*[0.0006 1.0178]';
...