【问题标题】:Matplotlib interference figure strange patternMatplotlib 干涉图奇怪图案
【发布时间】:2020-07-11 19:40:39
【问题描述】:

我正在尝试制作像这样的interference figure 动画:

不同之处在于上图显示了一段时间内的干涉图,因此相长干涉和相消干涉点保持不变。相反,我正在尝试制作一个动画,在其中更改两个源的频率,将它们固定在空间中。
这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

source = 0.5
sources = [-source, source]
axlim = max(sources)*2 + 1
N = 1000

x = np.linspace(-axlim, axlim, N)
y = np.linspace(-axlim, axlim, N)
X, Y = np.meshgrid(x, y)

fig = plt.figure()

def update(f):
    plt.gca().cla()
    C1 = np.sin(2*np.pi*f*((X - sources[0])**2 + Y**2))
    C2 = np.sin(2*np.pi*f*((X - sources[1])**2 + Y**2))
    Z = C1 + C2

    plt.contour(X, Y, Z)

    plt.plot(sources, [0, 0], 'ro')
    plt.gca().set_aspect('equal')
    plt.axis('off')

ani = FuncAnimation(fig = fig, func = update, frames = 11, interval = 100)

plt.show()

问题是奇怪的模式出现在最后几帧中:

那些模式不是物理的(它们不符合物理定律),所以我的代码一定有错误。我不知道在哪里,但我认为问题出在 matplotlib contour 函数中:我怀疑它引入了一种别名......

【问题讨论】:

  • 那些是波纹图案。建议你使用interpolation=hanning来最小化。
  • 很抱歉,我看到您正在使用轮廓。这仍然是同样的问题:您没有足够的 dpi 来解析矩阵中的最高频率。我会弄清楚你需要多少个点来表示你的轴,然后让你的模拟在每个维度上都小于一半,这样每个像素都会被过采样。即使 N 相当小。

标签: python python-3.x matplotlib animation physics


【解决方案1】:

问题在于您对C1C2 的定义:您将正弦函数应用于x 和y 距离的平方和,而不应用平方根。你应该使用:

C1 = np.sin(2*np.pi*f*np.sqrt((X - sources[0])**2 + Y**2))
C2 = np.sin(2*np.pi*f*np.sqrt((X - sources[1])**2 + Y**2))

contour 绘图方法没有问题,但是,我建议您将其替换为 contourf,或者更好的是 imshow。原因是 contour 绘图线,您的字段具有相同的值,使绘图的其余部分保持空白。相反,contourfimshow 用您选择的颜色图填充空白区域,这样您就可以更好地显示您的字段并避免模棱两可的空白。
请参阅此代码以供参考:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.animation import FuncAnimation

source = 0.5
sources = [-source, source]
axlim = max(sources)*2 + 1
N = 1000

x = np.linspace(-axlim, axlim, N)
y = np.linspace(-axlim, axlim, N)
X, Y = np.meshgrid(x, y)

norm = plt.Normalize(-2, 2)
cmap = LinearSegmentedColormap.from_list('', ['black', 'white', 'black'])
fig, ax = plt.subplots()

def update(f):
    ax.cla()
    C1 = np.sin(2*np.pi*f*np.sqrt((X - sources[0])**2 + Y**2))
    C2 = np.sin(2*np.pi*f*np.sqrt((X - sources[1])**2 + Y**2))
    Z = C1 + C2

    ax.imshow(Z,
              cmap = cmap,
              norm = norm)
    ax.plot(N/2*(1 + source/axlim), N/2, 'ro')
    ax.plot(N/2*(1 - source/axlim), N/2, 'ro')

    ax.set_title(f'f = {f} Hz')
    ax.set_aspect('equal')
    ax.axis('off')

ani = FuncAnimation(fig = fig, func = update, frames = 11, interval = 100)

plt.show()

由于您的场的峰和谷都是建设性干涉点,而在破坏性点中,场是空的,我选择了黑白颜色图,您无法区分峰和谷,但更容易区分建设性和破坏性干涉点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2020-06-09
    相关资源
    最近更新 更多