Я экспериментирую с ode45 в Matlab. Я научился передавать параметры в функцию ode, но у меня все еще есть вопрос. Предположим, что я хочу вычислить траекторию (профиль скорости) автомобиля, и у меня есть функция, например. getAcceleration
, что дает мне ускорение автомобиля, а также правильную передачу: [acceleration, gear] = getAcceleration(speed,modelStructure)
, где modelStructure
представляет модель автомобиля.
Функция оды будет:
function [dy] = car(t,y,modelStructure)
dy = zeros(2,1);
dy(1) = y(2);
[dy(2),gear] = getAcceleration(y(1),modelStructure);
Затем я вызываю интегратор Ode45 таким образом:
tInit = 0;
tEnd = 5,
[t,y] = ode45(@car,[tInit tEnd], [speedInitial,accelerationInitial],options,modelStructure);
Проблема в том, как мне получить вектор, хранящий шестерни? Должен ли я иметь что-то вроде [t,y,gear]=ode45(....)
или gear
должен быть внутри вектора y
?
Я работал над своим кодом и, используя функцию событий, теперь могу получать изменения «передач» автомобиля (как события). Теперь у меня есть новая проблема, связанная с тем же кодом. Представьте, что когда я оцениваю вектор 'dy', я могу получить дополнительное значение Z, которое позволяет мне значительно ускорить вызов вычисления ускорения (getAcceleration):
function [dy] = car(t,y,modelStructure)
dy = zeros(2,1);
dy(1) = y(2);
[dy(2),Z(t)] = getAcceleration(y(1),modelStructure,Z(t-1));
и предположим, что я также могу вычислить Z в начальных условиях. Проблема в том, что я не могу вычислить производную Z.
Есть ли способ передать значение Z, бросив степпинг без его интеграции?
Спасибо, парни.