К непосредственному вопросу о построении производных вы можете получить скорости, непосредственно вызвав функцию ODE для решения,
u = odeint(subsystem4,u0,t)
udot = subsystem4(u.T,t)
и получите отдельные массивы скоростей через
vcxdot,vcydot,psidot,wzdot = udot
В этом случае функция включает в себя ветвление, которое не очень удобно для ее векторизованных вызовов. Существуют способы векторизации ветвления, но самый простой обходной путь - это обход вручную точек решения, который медленнее, чем работающая векторизованная реализация. Это снова будет прокручивать список кортежей, таких как odeint
, поэтому результат должен быть транспонирован как кортеж списков для «легкого» присвоения переменным одного массива.
udot = [ subsystem4(uk, tk) for uk, tk in zip(u,t) ];
vcxdot,vcydot,psidot,wzdot = np.asarray(udot).T
Может показаться, что это несколько удваивает вычисление, но не совсем, поскольку точки решения обычно интерполируются из точек внутреннего шага решателя. Оценка функции ODE во время интеграции обычно происходит в точках, отличных от точек решения.
Для других переменных извлеките вычисление положения и скоростей в функции, чтобы иметь постоянную и композицию только в одном месте:
def xy_pos(t): return 3 + 0.3*np.cos(t), 0.5 + 0.3*np.sin(t)
def xy_vel(t): return -0.3*np.sin(t), 0.3*np.cos(t)
def xy_acc(t): return -0.3*np.cos(t), -0.3*np.sin(t)
или аналогичный, который вы затем можете использовать как внутри функции ODE, так и при подготовке графиков.
Скорее всего, Simulink соберет все уравнения всех блоков и сформирует их в одну большую систему ODE, которая затем решается для всего состояния сразу. Вам нужно будет реализовать нечто подобное. Один большой вектор состояния, и каждая подсистема знает свою часть состояния, соотв. производный вектор, чтобы получить его конкретные переменные состояния и записать производные в. Затем для вычисления производных можно использовать значения, передаваемые между подсистемами.
То, что вы пытаетесь сделать, решая подсистемы отдельно, работает только для соотв. скорее всего, приведет к методу интеграции 1-го порядка. Все методы более высокого порядка должны иметь возможность одновременно сдвигать состояние в некотором направлении, рассчитанном на предыдущих этапах метода, и оценивать всю систему там.