Saya mencoba membuat animasi gambar interferensi seperti ini:

enter image description here

Perbedaannya adalah bahwa gambar di atas menunjukkan angka interferensi dari waktu ke waktu, sehingga titik interferensi konstruktif dan destruktif tetap. Sebaliknya, saya mencoba membuat animasi di mana saya mengubah frekuensi dari dua sumber, menjaga mereka tetap di ruang.
Ini kode saya:

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

enter image description here

Masalahnya adalah pola aneh muncul seperti di frame terakhir:

enter image description here

Pola-pola itu bukan fisik (tidak konsisten dengan hukum fisika), jadi pasti ada kesalahan dalam kode saya. Saya tidak dapat menemukan di mana, tetapi saya pikir masalahnya ada pada fungsi matplotlib contour: Saya menduga ini memperkenalkan semacam alias...

2
user13794156 11 Juli 2020, 22:40

1 menjawab

Jawaban Terbaik

Masalahnya adalah dalam definisi Anda tentang C1 dan C2: Anda menerapkan fungsi sinusoidal ke jumlah kuadrat jarak x dan y, tanpa menerapkan akar kuadrat. Kamu harus menggunakan:

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

Tidak ada masalah dengan metode plot contour, namun, saya sarankan Anda untuk menggantinya dengan contourf atau, lebih baik lagi, imshow. Alasannya adalah contour plot garis di mana bidang Anda memiliki nilai yang sama, menjaga sisa plot kosong. Sebaliknya, contourf atau imshow mengisi ruang kosong dengan peta warna yang Anda pilih, sehingga Anda dapat menampilkan bidang Anda dengan cara yang lebih baik dan menghindari spasi putih yang ambigu.
Lihat kode ini untuk referensi:

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

enter image description here

Karena puncak dan lembah medan Anda adalah titik interferensi konstruktif, sedangkan di titik destruktif medannya nol, saya memilih peta warna hitam - putih - hitam, Anda tidak dapat membedakan puncak dari lembah tetapi lebih mudah untuk membedakan titik interferensi konstruktif dari destruktif .

2
Andrea Blengino 11 Juli 2020, 19:59