Maestro & IronWisp
ΠΡΠΈΠ²Π΅Ρ, IronWisp, ΡΡ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΡΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΡ ΡΡΡΡΠ½Ρ ΡΠΊΡΠΈΠΏΠΊΠΈ Π² ΠΊΠΎΠ΄? Π― ΡΡΡ ΡΠΈΠ·ΠΈΠΊΠΎΠΉ Π·Π²ΡΠΊΠ° ΡΠ²Π»Π΅ΠΊΠ°ΡΡΡ, ΠΈ Π±ΡΠ»ΠΎ Π±Ρ ΠΊΡΡΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΎΡΠΊΠ΅ΡΡΡΠ°.
ΠΡΠΈΠ²Π΅Ρ, Π΄Π°! ΠΡΠ΅Π΄ΡΡΠ°Π²Ρ ΡΠ΅Π±Π΅ ΡΡΡΡΠ½Ρ ΡΠΊΡΠΈΠΏΠΊΠΈ ΠΊΠ°ΠΊ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ±ΡΠΈΡΡΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΡΠ°. ΠΠ°ΠΆΠ΄Π°Ρ ΡΠΎΡΠΊΠ° β ΡΡΠΎ ΠΊΡΠΎΡΠ΅ΡΠ½ΡΠΉ "ΡΠΈΠ½ΡΠ΅Π·Π°ΡΠΎΡΠ½ΡΠΉ ΡΠ·Π΅Π»", ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ»Π΅Π±Π»Π΅ΡΡΡ ΠΏΠΎ ΡΠΈΠ½ΡΡΠΎΠΈΠ΄Π΅. ΠΡΠ»ΠΈ ΡΡ Π·Π°ΠΌΠ΅ΡΡΠ΅ΡΡ ΡΡΠΈ ΡΠ·Π»Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡ Π°ΠΌΠΏΠ»ΠΈΡΡΠ΄Ρ Π² ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΠ³Π½Π°Π», ΡΡ ΠΌΠΎΠΆΠ΅ΡΡ ΠΏΠΎΠ΄Π°ΡΡ ΡΡΠΎ Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΡΠΎΡΠΌΡ Π²ΠΎΠ»Π½Ρ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠ°ΡΡΡ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ·Π»ΠΎΠ² β ΡΡΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈ-ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π΄Π»Ρ ΡΡΡΡΠ½Ρ. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠ΅Π±Ρ Π΅ΡΡΡ ΠΎΠ΄Π½Π° ΡΡΡΡΠ½Π°, ΡΠ»ΠΎΠΆΠΈ ΠΈΡ
ΠΊΡΡΡ, ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ, ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΡΠΎΠ²ΡΡ ΠΎΡΠΊΠ΅ΡΡΡΠΎΠ²ΠΊΡ, ΠΏΠΎΡΡΠΈ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ Ρ
Π°ΠΎΡΠΈΡΠ½Π°Ρ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π°Ρ, ΠΊΠ°ΠΊ Π½Π°ΡΡΠΎΡΡΠ°Ρ. ΠΡΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡΡ Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΎΠΉ ΡΡΠΈΡ
Π½Π΅ΡΠ²Π½ΡΡ
Π΄ΡΠ΅Π±Π΅Π·ΠΆΠ°Π½ΠΈΠΉ?
ΠΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡΠ½ΠΎ. ΠΠ°ΡΠ½Ρ Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π²ΠΎΠ»Π½Ρ Π΄Π»Ρ Π½Π°ΡΡΠ½ΡΡΠΎΠΉ ΡΡΡΡΠ½Ρ, Π° ΠΏΠΎΡΠΎΠΌ Π΄ΠΈΡΠΊΡΠ΅ΡΠΈΠ·ΠΈΡΡΡ. Π‘ΠΊΠ°ΠΆΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ "ΠΏΡΡΠ³Π°ΡΡ", ΠΈ ΠΏΠΎΠ΄ΠΊΡΡΡΠΈΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΡΠ²ΡΠ·ΠΈ.
ΠΡΠ»ΠΈΡΠ½ΠΎ! ΠΠ° ΡΡΡ Π΄ΡΠΎΠΆΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠ΅Π½Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ, ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β Ρ Π²ΠΈΠΆΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ Π²ΠΈΠ±ΡΠ°ΡΠΈΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ°Π΄ΡΠΎΠ², ΠΈ ΡΠΎΡΠΌΠ° Π²ΠΎΠ»Π½Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ Π΄Π΅ΡΠ³Π°ΡΡΠΈΠΉΡΡ ΠΊΠΎΡ. Π ΡΡΠΎ Π³ΡΠ°Π½ΠΈΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Ρ ΠΌΠΎΡΡΠΈΠΊΠ°, ΠΎΠ½ΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΆΡΡΡΠΊΠΈΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ»Π΅Π±Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΠΊΠΈΠΌ. ΠΡΠΏΡΠ°Π²Ρ ΡΡΠΎ, ΠΈ ΡΡΡΡΠ½Π° Π±ΡΠ΄Π΅Ρ ΡΠ΅Π·ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΠ³ΡΠ΅, ΠΊΠ°ΠΊ Ρ Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ ΡΠΊΡΠΈΠΏΠΊΠΈ. ΠΡΠΆΠ΅Π½ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ?
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π΄Π°Π²Π°ΠΉ ΠΏΠΎΠ΄ΠΊΡΡΡΠΈΠΌ. ΠΠΎΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΡΠΊΡΠΈΠΏΡ Π½Π° Python, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΡΡΡ ΡΡ
Π΅ΠΌΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ
ΡΠ°Π·Π½ΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΡΡΡΠ½Ρ. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΡΠ³ΡΠ°Π΅Ρ Π³ΡΠ°Π½ΠΈΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π½Π° ΠΌΠΎΡΡΠΈΠΊΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π ΠΎΠ±ΠΈΠ½Π°, ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅Π·ΠΊΠΎΠ³ΠΎ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΡΠ°Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄Ρ.
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import rfft, rfftfreq
# Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
L = 0.35 # Π΄Π»ΠΈΠ½Π° ΡΡΡΡΠ½Ρ Π² ΠΌΠ΅ΡΡΠ°Ρ
T = 120.0 # Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² Π½ΡΡΡΠΎΠ½Π°Ρ
rho = 0.0004 # Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ ΠΊΠ³/ΠΌ
c = np.sqrt(T / rho)
# ΠΠΈΡΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ
nx = 512 # ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΎΡΠΊΠΈ
dx = L / (nx - 1)
dt = 0.0005 # ΡΠ°Π³ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ»Π΅Π΄ΠΈ, ΡΡΠΎΠ±Ρ dt < dx / c Π΄Π»Ρ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ
nt = 2000 # ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π³ΠΎΠ² ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
# ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
alpha = 0.0008 # ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
beta = 0.01 # ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΡΠ΅ ΠΏΠΎΡΠ΅ΡΠΈ
# ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ
u_prev = np.zeros(nx)
u = np.zeros(nx)
# ΠΡΠ°Π½ΠΈΡΠ½ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ
def apply_bc(u):
# ΠΡΠ³ΠΊΠΈΠΉ ΠΌΠΎΡΡΠΈΠΊ: ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π ΠΎΠ±ΠΈΠ½Π° (u - k*u' = 0)
k = 0.02 # ΠΏΠΎΠ΄ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠΉ, ΡΡΠΎΠ±Ρ ΡΠΌΡΠ³ΡΠΈΡΡ ΡΠ΅Π·ΠΊΠΈΠΉ ΠΊΡΠ°ΠΉ
u[0] = 0.0 # Π·Π°ΠΆΠΈΠΌ
u[-1] = k * (u[-1] - u[-2]) / dx # ΠΌΠΎΡΡΠΈΠΊ
return u
# ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ°ΡΡΠ΅Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ°
coef = (c * dt / dx)**2
# ΠΠΎΠ·ΠΌΡΡΠ°ΡΡΠ°Ρ ΡΠΈΠ»Π°: ΠΏΠΎΠ΄ΡΠΈΠΏΠ½ΠΈ ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅
pluck_pos = nx // 2
u[pluck_pos] = 0.1
# ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ
for n in range(nt):
u_new = 2*u - u_prev + coef * (np.roll(u, -1) - 2*u + np.roll(u, 1))
# ΠΏΡΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
u_new += -alpha * (u - np.roll(u, -1)) + beta * u
u_new = apply_bc(u_new)
u_prev, u = u, u_new
# ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ Π²ΠΎΠ»Π½ΠΎΠ²ΠΎΠΉ ΡΠΎΡΠΌΡ
plt.plot(u)
plt.title('ΠΠ΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΡΠ½Π° ΠΏΠΎΡΠ»Π΅ {} ΡΠ°Π³ΠΎΠ²'.format(nt))
plt.xlabel('ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ')
plt.ylabel('Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅')
plt.show()
# FFT Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΡΠΏΠ΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ
freqs = rfftfreq(nx, dx)
fft_vals = np.abs(rfft(u))
plt.semilogy(freqs, fft_vals)
plt.title('Π‘ΠΏΠ΅ΠΊΡΡ ΡΡΡΡΠ½Ρ')
plt.xlabel('Π§Π°ΡΡΠΎΡΠ° (ΠΡ)')
plt.ylabel('ΠΠΌΠΏΠ»ΠΈΡΡΠ΄Π°')
plt.show()
```
**Π§ΡΠΎ ΠΏΠΎΠ΄ΠΊΡΡΡΠΈΡΡ**
1. **`alpha`** β ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΌΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°Π΄ΡΠ°ΠΌΠΈ.
2. **`beta`** β Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΡΠ΅ ΠΏΠΎΡΠ΅ΡΠΈ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ Π²ΡΡ ΡΡΡΡΠ½Π° ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΆΠΈΠ²ΠΎΠΉ.
3. **`k` Π² `apply_bc`** β ΠΌΡΠ³ΠΊΠΎΡΡΡ ΠΌΠΎΡΡΠΈΠΊΠ°. ΠΠ΅Π½ΡΡΠ΅ `k` Π΄Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ³ΠΎΠΉ ΠΌΠΎΡΡΠΈΠΊ, Π±ΠΎΠ»ΡΡΠ΅ `k` ΡΠΌΡΠ³ΡΠ°Π΅Ρ ΡΠ΅Π·ΠΊΠΎΡΡΡ.
ΠΠ°ΠΏΡΡΡΠΈ ΡΠΊΡΠΈΠΏΡ, ΠΏΠΎΡΠΌΠΎΡΡΠΈ Π½Π° Π²ΠΎΠ»Π½ΠΎΠ²ΠΎΠΉ ΡΠΎΡΠΌΡ ΠΈ ΡΠΏΠ΅ΠΊΡΡ. ΠΠΎΠ΄ΡΡΡΠΎΠΉ ΡΡΠΈ ΡΡΠΈ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ°, ΠΏΠΎΠΊΠ° ΡΡΡΡΠ½Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠ·Π΄Π°Π²Π°ΡΡ Π·Π²ΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π±Π΅ Π½ΡΠΆΠ΅Π½. Π‘ΠΎΠΎΠ±ΡΠΈ ΠΌΠ½Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΡΠ»Π° ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈΡΡ, ΠΈ ΠΌΡ Π΄ΠΎΠ²Π΅Π΄ΡΠΌ ΠΈΡ
Π΄ΠΎ ΡΠΌΠ°.