手动实现RK4求解小车倒立摆IVP的数据格式问题排查
手动RK4求解小车倒立摆ODE形状不匹配问题修复方案
solve_ivp对model函数的返回值格式容错性更高,而手动RK4求解器要求model函数返回长度为4的一维数组/列表,对应4个状态量的导数,你当前遇到的形状广播错误,核心原因是model函数在计算过程中引入了多余维度,最终返回了3维的(4,4,4)数组,不符合RK4求解器的输入要求。
具体修复步骤如下:
- 检查
model函数的入参格式
手动RK4调用model时,传参顺序需和solve_ivp要求的(t, x, *args)完全一致,不要额外对状态向量x做维度包装(比如不要把一维的x手动套一层[]变成二维数组)。 - 清理
model内部的多余维度
所有矩阵运算结束后,通过.flatten()或者.squeeze()压缩掉多余维度,最终返回值必须是一维结构,修正后的model参考结构:def model(t, x, params): # x为长度4的一维数组:[小车位置, 小车速度, 摆角, 摆角速度] x1, x2, x3, x4 = x # 微分方程计算逻辑 dx1 = x2 dx2 = # 小车加速度标量计算结果 dx3 = x4 dx4 = # 摆角加速度标量计算结果 # 直接返回一维数组,不要嵌套列表或增加多余维度 return np.array([dx1, dx2, dx3, dx4]) - 提前验证
model输出维度
单独调用model做测试,传入长度为4的随机一维数组,打印返回值的.shape属性,确认输出为(4,)而非多维度结构。
如果确认
model输出维度正常,可检查RK4迭代逻辑,避免对model返回值做重复堆叠,正确的RK4单步迭代参考:def rk4_step(model, t, x, dt, params): k1 = dt * model(t, x, params) k2 = dt * model(t + dt/2, x + k1/2, params) k3 = dt * model(t + dt/2, x + k2/2, params) k4 = dt * model(t + dt, x + k3, params) return x + (k1 + 2*k2 + 2*k3 + k4)/6确保所有中间计算变量的维度和状态量
x一致,均为长度4的一维数组。
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

