Python调用solve_ivp模拟LTI系统时matmul维度错误如何解决
报错原因
核心问题是scipy.integrate.solve_ivp对传入的动力学函数参数顺序有强制要求:时间参数在前,状态参数在后,你当前定义的dynamics(x, t)顺序刚好相反:
solve_ivp调用动力学函数时,会先传入当前计算的时间标量,再传入状态向量- 你写的参数顺序会导致函数内的
x实际拿到的是0维时间标量,执行A@x矩阵乘法时维度不匹配,触发报错。
修复方案
只要调换动力学函数的参数顺序即可,修改后完整可运行代码如下:
import numpy as np from scipy import integrate import matplotlib.pyplot as plt # System Parameters l = 1 # Pendulum length g = 9.81 # gravity # Initial Conditions x0 = np.array([np.pi/2, 0]) # Simulation parameters tStart = 0 tEnd = 4 t_span = [tStart, tEnd] t = np.linspace(tStart,tEnd,10) # Simulation time # System matrices A = np.array([[0, 1],[-g/l, 0]]) # 仅修改参数顺序为 t 在前,x 在后 def dynamics(t, x): xdot = -A@x return xdot # 可选添加t_eval参数,指定输出结果对应你定义的t数组时间点 y = integrate.solve_ivp(dynamics, t_span, x0, t_eval=t)
补充说明:如果你之前用过
scipy.integrate.odeint,它的动力学函数参数要求是(x, t),和solve_ivp刚好相反,是很容易踩的坑。
内容的提问来源于stack exchange,提问作者fukurai
相关产品推荐
相关产品推荐

