我正在写一个python代码,实现欧拉方法,求解任意时间步长h值范围内的一阶常微分方程。
我想到的最简单的解决方案是声明一个Python列表来存储'outer for'循环结束时的结果:
y = []
for h in (0.05, 0.1, 0.2):
t = np.arange(0, 5 + h, h) ## Time-steps as np array
N = np.zeros(len(t)) ## Initialize number of U^{235} nuclei array.
N[0] = N_0
## Implementation of Euler's method, first-order case. One 'for' loop suffices.
for i in range(0, len(t) - 1):
N[i+1] = N[i] * (1.0 - h/tau)
y.append(t) ## Store results in python list. Each element is an array
## with the corresponding value of h
然后我试着把h = 0.05的结果绘制成x轴,这些结果存储在y[0]中:plt.scatter(y[0], N, marker='o', facecolors='none', s=60, lw=2)
但这会返回错误“ValueError:x和y的大小必须相同”
我不明白为什么我会得到大小错误。y[0]不是一维列表吗?所以我不能用列表作为绘图的轴?
我很困惑,因为它与变量t一起工作,因为它是一个np.数组:
t = np.arange(0, 5 + h, h) ## Time-steps as np array
N = np.zeros(len(t)) ## Initialize number of U^{235} nuclei array.
N[0] = N_0
## Implementation of Euler's method, first-order case. One 'for' loop suffices.
for i in range(0, len(t) - 1):
N[i+1] = N[i] * (1.0 - h/tau)
plt.scatter(t, N, marker='o', facecolors='none', s=60, lw=2)
1条答案
按热度按时间n6lpvg4x1#
您没有将各种
N
数组存储在列表中,因此您尝试绘制第一次迭代的t
(即y[0]
)和最后一次迭代的N
。如果将所有内容都存储在字典中,则可以将时间和原子核数存储为值,将时间增量
h
存储为键:当你使用numpy的时候,出于性能的考虑,你希望避免循环(比如你有1M的时间增量)。
变成这样: