Python Matplotlib干涉图奇怪图案

Python Matplotlib干涉图奇怪图案,python,python-3.x,matplotlib,animation,physics,Python,Python 3.x,Matplotlib,Animation,Physics,我正在尝试制作这样的动画: 不同之处在于,上图显示了随时间变化的干涉图,因此构造干涉点和相消干涉点保持不变。相反,我试图制作一个动画,在动画中我改变两个源的频率,使它们在空间中保持固定。 这是我的密码: import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation source = 0.5 sources = [-source, source] axlim =

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

不同之处在于,上图显示了随时间变化的干涉图,因此构造干涉点和相消干涉点保持不变。相反,我试图制作一个动画,在动画中我改变两个源的频率,使它们在空间中保持固定。
这是我的密码:

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
函数中:我怀疑它引入了一种混叠…

问题出在您对
C1
C2
的定义中:您将正弦函数应用于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
plot方法没有问题,但是,我建议您用
contourf
或更好的
imshow
替换它。原因是
等高线
在字段具有相同值的位置绘制线,使其余部分保持为空。相反,
tourtf
imshow
用您选择的颜色贴图填充空白,这样您可以更好地显示字段,避免不明确的空白。
参考此代码:

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()


由于场的波峰和波谷都是相成干涉点,而在相消干涉点中,场为空,因此我选择了黑白-黑色的彩色贴图,无法区分波峰和波谷,但更容易区分相成干涉点和相消干涉点。

这些是莫尔图案。建议您使用插值=汉宁来最小化。对不起,我看到您使用的是轮廓。这仍然是一个问题:你没有足够的dpi来解析矩阵中的最高频率。我会计算出你需要多少点来代表你的轴,然后让你的模拟在每个维度上小于一半,这样每个像素都会过采样。使N小得多。