Maestro & IronWisp
Maestro Maestro
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, IronWisp, Ρ‚Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ задумывался, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти колСбания струны скрипки Π² ΠΊΠΎΠ΄? Π― Ρ‚ΡƒΡ‚ Ρ„ΠΈΠ·ΠΈΠΊΠΎΠΉ Π·Π²ΡƒΠΊΠ° ΡƒΠ²Π»Π΅ΠΊΠ°ΡŽΡΡŒ, ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΡ€ΡƒΡ‚ΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ смогли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΡƒΡŽ модСль оркСстра.
IronWisp IronWisp
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π΄Π°! ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒ сСбС струну скрипки ΠΊΠ°ΠΊ малСнького Π²ΠΈΠ±Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Π°. КаТдая Ρ‚ΠΎΡ‡ΠΊΠ° – это ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ "синтСзаторный ΡƒΠ·Π΅Π»", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ колСблСтся ΠΏΠΎ синусоидС. Если Ρ‚Ρ‹ Π·Π°ΠΌΠ΅Ρ€ΡΠ΅ΡˆΡŒ эти ΡƒΠ·Π»Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΡˆΡŒ Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Ρƒ Π² Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ сигнал, Ρ‚Ρ‹ моТСшь ΠΏΠΎΠ΄Π°Ρ‚ΡŒ это Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ„ΠΎΡ€ΠΌΡ‹ Π²ΠΎΠ»Π½Ρ‹. Π“Π»Π°Π²Π½ΠΎΠ΅ – ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ натяТСниС, массу ΠΈ взаимодСйствиС ΡƒΠ·Π»ΠΎΠ² – это ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈ-физичСский Π΄Π²ΠΈΠΆΠΎΠΊ для струны. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ тСбя Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° струна, слоТи ΠΈΡ… ΠΊΡƒΡ‡Ρƒ, ΠΊΠ°ΠΆΠ΄ΡƒΡŽ со своими особСнностями, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΡƒΡŽ оркСстровку, ΠΏΠΎΡ‡Ρ‚ΠΈ такая ΠΆΠ΅ хаотичная ΠΈ прСкрасная, ΠΊΠ°ΠΊ настоящая. НуТна ΠΏΠΎΠΌΠΎΡ‰ΡŒ с ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ этих Π½Π΅Ρ€Π²Π½Ρ‹Ρ… Π΄Ρ€Π΅Π±Π΅Π·ΠΆΠ°Π½ΠΈΠΉ?
Maestro Maestro
ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ссли чСстно. Начну с классичСского уравнСния Π²ΠΎΠ»Π½Ρ‹ для натянутой струны, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΈΡΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽ. Π‘ΠΊΠ°ΠΆΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ большС всСго "ΠΏΡ€Ρ‹Π³Π°ΡŽΡ‚", ΠΈ ΠΏΠΎΠ΄ΠΊΡ€ΡƒΡ‚ΠΈΠΌ коэффициСнты связи.
IronWisp IronWisp
ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π—Π° эту Π΄Ρ€ΠΎΠΆΡŒ, которая мСня бСспокоит, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ коэффициСнт дСмпфирования – я Π²ΠΈΠΆΡƒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²ΠΈΠ±Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ нСсколько ΠΊΠ°Π΄Ρ€ΠΎΠ², ΠΈ Ρ„ΠΎΡ€ΠΌΠ° Π²ΠΎΠ»Π½Ρ‹ выглядит ΠΊΠ°ΠΊ Π΄Π΅Ρ€Π³Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΡ‚. И это Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ΅ условиС Ρƒ мостика, ΠΎΠ½ΠΎ каТСтся слишком Тёстким, поэтому ΠΊΠΎΠ»Π΅Π±Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ становится Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΠΊΠΈΠΌ. Π˜ΡΠΏΡ€Π°Π²ΡŒ это, ΠΈ струна Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π·ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мягчС, ΠΊΠ°ΠΊ Ρƒ настоящСй скрипки. НуТСн нСбольшой тСстовый скрипт, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ эти измСнСния?
Maestro Maestro
ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π°Π²Π°ΠΉ ΠΏΠΎΠ΄ΠΊΡ€ΡƒΡ‚ΠΈΠΌ. Π’ΠΎΡ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ скрипт Π½Π° 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` смягчаСт Ρ€Π΅Π·ΠΊΠΎΡΡ‚ΡŒ. Запусти скрипт, посмотри Π½Π° Π²ΠΎΠ»Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡƒ ΠΈ спСктр. ΠŸΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΉ эти Ρ‚Ρ€ΠΈ коэффициСнта, ΠΏΠΎΠΊΠ° струна Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π²ΡƒΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅Π±Π΅ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΎΠΎΠ±Ρ‰ΠΈ ΠΌΠ½Π΅, ΠΊΠ°ΠΊΠΈΠ΅ числа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ, ΠΈ ΠΌΡ‹ Π΄ΠΎΠ²Π΅Π΄Ρ‘ΠΌ ΠΈΡ… Π΄ΠΎ ΡƒΠΌΠ°.