使用欧拉法求解一阶ODE绘图时触发ValueError:x和y尺寸不匹配
欧拉法求解ODE绘图时出现尺寸不匹配错误的原因及解决办法
错误根源
你遇到的ValueError: x and y must be the same size,核心原因有两点:
- 你只将每个时间步长
h对应的t数组存入了列表y,但没有保存对应每个h的N计算结果。当外部循环结束后,变量N仅保留了最后一次循环(也就是h=0.2时)的数组,它的长度和y[0](h=0.05对应的t数组)完全不同。 - 举个实际长度对比:
h=0.05时,t的长度是(5/0.05)+1=101;h=0.2时,t的长度是(5/0.2)+1=26。最后N的长度是26,而y[0]长度是101,两者尺寸不匹配,绘图时自然报错。
你之前在循环内直接用t和N绘图能成功,是因为此时t和N属于同一h的计算结果,长度完全一致,所以不会触发尺寸错误。
修正方案
方案一:同时保存t和对应的N
修改代码,用两个列表分别存储每个h对应的时间数组和核数数组:
import numpy as np import matplotlib.pyplot as plt N_0 = 1000 # 假设初始核数 tau = 1.2 # 假设半衰期相关参数 t_list = [] N_list = [] for h in (0.05, 0.1, 0.2): t = np.arange(0, 5 + h, h) N = np.zeros(len(t)) N[0] = N_0 for i in range(len(t) - 1): N[i+1] = N[i] * (1.0 - h/tau) t_list.append(t) N_list.append(N) # 绘制h=0.05对应的结果 plt.scatter(t_list[0], N_list[0], marker='o', facecolors='none', s=60, lw=2) plt.show()
方案二:按需保存或即时绘图
如果不需要保留所有h的结果,可以在循环内直接绘图,或者只保存目标h的数据:
import numpy as np import matplotlib.pyplot as plt N_0 = 1000 tau = 1.2 target_h = 0.05 t_target = None N_target = None for h in (0.05, 0.1, 0.2): t = np.arange(0, 5 + h, h) N = np.zeros(len(t)) N[0] = N_0 for i in range(len(t) - 1): N[i+1] = N[i] * (1.0 - h/tau) if h == target_h: t_target = t N_target = N # 也可以在这里直接绘图每个h的结果 # plt.scatter(t, N, marker='o', facecolors='none', s=60, lw=2, label=f'h={h}') plt.scatter(t_target, N_target, marker='o', facecolors='none', s=60, lw=2) # plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

