Python绘图遇维度与形状不匹配错误,寻求解决方案
解决Matplotlib绘图时的维度不匹配错误
错误根源排查
仿真长度N的计算错误
原代码中N = int(Tstop-Tstart/Ts)的运算优先级有误,Tstart/Ts会先计算(结果为0),导致N=60,x1和x2的长度为62。而时间数组t是np.arange(0,60+0.2,0.1),长度为602,两者维度完全不匹配,这是报错的直接原因。变量名冲突
循环变量用了k,但之前已定义刚度系数k=2,循环时会覆盖该值,导致a21的计算逻辑在循环中出错(虽未直接引发本次报错,但会影响仿真结果)。状态方程输入项错误
原代码直接将F加到状态方程中,正确的离散化输入应为b1*F和b2*F——b1、b2是输入增益系数,直接加F会导致仿真结果偏离预期。
修正后的代码
import numpy as np import matplotlib.pyplot as plt c = 4 k_stiff = 2 # 重命名避免与循环变量冲突 m = 20 F = 5 Ts = 0.1 # 采样时间 Tstart = 0 Tstop = 60 # 修正N的计算:先算时间差再除以采样时间 N = int((Tstop - Tstart) / Ts) x1 = np.zeros(N + 1) # N个采样点对应N+1个状态值,无需额外+2 x2 = np.zeros(N + 1) x1[0] = 0 x2[0] = 0 a11 = 1 a12 = Ts a21 = -(Ts * k_stiff) / m a22 = 1 - (Ts * c) / m b1 = 0 b2 = Ts / m # 循环变量改用i,避免和刚度系数冲突 for i in range(N): # 修正输入项:F乘以对应增益b1/b2 x1[i+1] = a11 * x1[i] + a12 * x2[i] + b1 * F x2[i+1] = a21 * x1[i] + a22 * x2[i] + b2 * F # 时间数组长度与x1/x2匹配:从Tstart到Tstop,步长Ts,共N+1个点 t = np.arange(Tstart, Tstop + Ts, Ts) plt.plot(t, x1, label='x1') plt.plot(t, x2, label='x2') plt.legend() plt.xlabel('Time (s)') plt.ylabel('State Values') plt.show()
关键修改说明
- 给刚度系数重命名为
k_stiff,避免变量名冲突; - 修正
N的计算逻辑,确保状态数组与时间数组长度一致; - 调整状态方程输入项,符合离散化模型的正确形式;
- 精简数组初始化长度,让状态数组与时间点数量完全匹配;
- 添加图例和坐标轴标签,提升绘图可读性。
内容的提问来源于stack exchange,提问作者Cesarengineer
相关产品推荐
相关产品推荐

