Matlab: ode15i решает ошибку с размерами, я не вижу, где - PullRequest
0 голосов
/ 16 марта 2019

КОД

% Why?

tstart = 0;
tfinal = 1;
tspan = [tstart tfinal];
options = odeset('Events',@myEventsFcn);

% Initial conditions
y0 = [0,-0.6,0,0,0,0];
yp0 = [0,0,0,0,0,0];
% decic funtion calculates consistent ICs
[y0,yp0] = decic(@StateI,t0,y0,[0 1 0 0 0 0],yp0,[0 0 0 0 0 0]);

% Arrays for plots
tout = tstart;
sout = y0(1:1);
bout = y0(2:2);
zout = y0(3:3);
svout = y0(4:4);
bvout = y0(5:5);
zvout = y0(6:6);

% ode15i solves system of implicit ODEs
[t,y,te,ye,ie] = ode15i(@StateI,tspan,y0,yp0,options);

% system of implicit ODEs defined as StateI function
function res = StateI(t,y,yp)
% Constants
mS = 3*10^(-4); % [kg]
JS = 5*10^(-9); % [kgm]
mB = 4.5*10^(-3); % [kg]
g = 9.81; % [m/s^2]
JB = 7*10^(-7); % [kgm]
lS = 10^(-2); % [m]
lG = 1.5*10^(-2); % [m]
cp = 5.6*10^(-3); % [N/rad]

res = [(mS+mB)*yp(6) + mB*lS*yp(4) + mB*lG*yp(5) + (mS+mB)*g;
    mB*lS*yp(6) + (JS+mB*lS^2)*yp(4) + mB*lS*lG*yp(5) - cp*(y(2)-y(1)) +     mB*lS*g;
    mB*lG*yp(6) + mB*lS*lG*yp(4) + (JB+mB*lG^2)*yp(5) - cp*(y(1)-y(2)) +     mB*lG*g;
    y(4)-yp(1);
    y(5)-yp(2);
    y(6)-yp(3)];
end

% my events defined in myEventsFcn
function [value,isterminal,direction] = myEventsFcn(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(5);
Z1II = (cp*(y(2)+(rS-r0)/hS)-rS*Z2-mB*lS*lG*yp(5)-mB*lS*g)/hS;

value = [y(1)+(rS-r0)/hS, y(1)-(rS-r0)/hS, Z1II, y(2)-(lS+lG-lB-    r0)/hB];
isterminal = [1, 1, 1, 1];
direction = [-1, 1, -1, 1];
end

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

Matrix dimensions must agree.

Error in odezero (line 46)
    indzc = find((sign(vL) ~= sign(vR)) & (direction .* (vR - vL) >= 0));

Error in ode15i (line 506)
    [te,ye,ie,valt,stop] = odezero(@ntrp15i,@events_aux,events_args,valt,...

Error in silly (line 24)
[t,y,te,ye,ie] = ode15i(@StateI,tspan,y0,yp0,options);

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

С наилучшими пожеланиями

1 Ответ

2 голосов
/ 16 марта 2019

Ваш код отлично работает на моей версии MATLAB (2018b).Проверьте свою версию.

...