python “值错误:x和y必须相同大小”绘制时

abithluo  于 2023-03-11  发布在  Python
关注(0)|答案(1)|浏览(190)

我正在写一个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)
n6lpvg4x

n6lpvg4x1#

您没有将各种N数组存储在列表中,因此您尝试绘制第一次迭代的t(即y[0])和最后一次迭代的N
如果将所有内容都存储在字典中,则可以将时间和原子核数存储为值,将时间增量h存储为键:

# Imports.
import matplotlib.pyplot as plt
import numpy as  np

# Constants.
N_0 = 1000
TAU = 5
TIME_INCREMENTS = (0.05, 0.1, 0.2)

data = {}
for h in TIME_INCREMENTS :
    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)    
    data[h] = (t, N)
  
fig, ax = plt.subplots()
for key, values in data.items():
    ax.scatter(*values, marker='o', s=60, lw=2, label=f"h = {key:.2f}")
ax.legend()

当你使用numpy的时候,出于性能的考虑,你希望避免循环(比如你有1M的时间增量)。

N = np.zeros(len(t))
N[0] = N_0
for i in range(0, len(t) - 1):
    N[i+1] = N[i] * (1.0 - h/TAU)

变成这样:

N = N_0 * (1.0 - h/TAU)**np.arange(len(t))

相关问题