🎯要點
🎯快速傅立葉變換算法周期域解橢圓曲線波 | 🎯算法數值解孤波脈沖和結果動畫 | 🎯三種語言孤子解淺水表面波方程 | 🎯漸近分解算法孤子波 | 🎯自適應步長算法孤子波 | 🎯流體自動造波器電機控制,檢測孤子波碰撞 | 🎯算法計算復現無碰撞孤子波 | 🎯能量守恒定律線性隱式算法解孤波 | 🎯兩種語言有限差分算法解孤波
📜孤子波用例:Python火焰鋒動力學和淺水表面波浪偏微分方程
📜有限差分用例:Python微磁學磁傾斜和西塔規則算法
📜標量場用例:Python光束三維二維標量場和算法
🍇Python鋼棒熱微分
熱方程簡潔地描述了熱擴散和傳遞的極其復雜的世界,它是一個偏微分方程,而非常微分方程,所以在求解它時,只要知道它涉及一個具有多個變量的函數的導數,而不是只有一個變量的函數。
? u ? t = k ? 2 u ? x 2 \frac{\partial u}{\partial t}=k \frac{\partial^2 u}{\partial x^2} ?t?u?=k?x2?2u?
考慮一根初始冷的 ( 0 ° C ) \left(0^{\circ} C \right) (0°C) 金屬棒,長度為 L L L,具有傳遞熱量 k k k 的能力。如果我們連續加熱該金屬棒的兩端,例如 20 0 ° C 200^{\circ} C 200°C,那么隨著時間的推移,熱量將在金屬棒上擴散并達到平衡。熱方程告訴我們熱量如何隨時間傳播,其解為我們提供了一個函數 u ( t , x ) u(t, x) u(t,x),該函數可以在任何給定時間 t t t 給出沿著桿 x x x 的任何點的溫度。
然而,與大多數微分方程一樣,熱方程的精確解析解極難獲得,因此對于大多數應用而言,最佳解方法是我們盡可能最好的求近似值。獲得這些近似值的方法有很多,但我們今天要重點討論的是迄今為止最簡單且應用最廣泛的方法,即有限差分法。
假設一個未知函數 f ( x ) f(x) f(x) 的值是我們知道的,這種情況在現實世界中與收集外部數據的任何情況下經常出現。如果我們想求 f ( x ) f(x) f(x) 在 n n n 點的導數,那么,我們需要找到一條與 f ( n ) f(n) f(n)? 相切的線,并找到它的斜率,如下所示:
如果我們不知道函數 f ( x ) f(x) f(x),則我們不可能求其導數并找到切線的斜率。而有限差分法旨在解決這個問題,它使用 n n n 的相鄰值來近似估計實際切線。如果我們查看 n n n 之前的一個點和 n n n 之后的一個點,并且知道它們的值,我們可以通過在 n n n 和它的一個相鄰點之間畫一條線來開始估計切線。例如,我們可以嘗試在 n n n 和 n + 1 n+1 n+1? 之間畫一條線。
n n n 和 n + 1 n+1 n+1 之間的估計切線與目標切線相對相似,但讓我們看看是否可以通過使用 n n n 和 n ? 1 n-1 n?1 來更接近。
現在我們知道如何獲得估計的切線,我們現在可以使用前面提到的斜率公式來獲得它的斜率,從而獲得函數在該點的導數。
斜率方程:
y 2 ? y 1 x 2 ? x 1 \frac{y_2-y_1}{x_2-x_1} x2??x1?y2??y1??
我們知道 y y y 值就是 f ( n + 1 ) f(n+1) f(n+1) 和 f ( n ) f(n) f(n)?,因此代入我們所知道的斜率公式就變成:
f ( n + 1 ) ? f ( n ) x 2 ? x 1 \frac{f(n+1)-f(n)}{x_2-x_1} x2??x1?f(n+1)?f(n)?
x x x 值遵循類似的套路,因為對 x 2 x_2 x2? 插入 n + 1 n+1 n+1,對 x 1 x_1 x1? 插入 n n n? 會導致:
f ( n + 1 ) ? f ( n ) 1 \frac{f(n+1)-f(n)}{1} 1f(n+1)?f(n)?
實際上,我們的 n n n 值很少會精確地間隔為 1,更一般的形式將使它們間隔為任意值 d x dx dx?,從而導致我們的有限差分導數的最終公式為:
d f d x ≈ f ( x + d x ) ? f ( x ) d x \frac{d f}{d x} \approx \frac{f(x+d x)-f(x)}{d x} dxdf?≈dxf(x+dx)?f(x)?
現在回到熱方程,我們可以用方程的左邊代替它的有限差分版本,考慮到有限微分是相對于 t t t 發生的事實,而空間變量 x x x 保持不變。
u ( t + d t , x ) ? u ( t , x ) d t ≈ k ? 2 u ? x 2 \frac{u(t+d t, x)-u(t, x)}{d t} \approx k \frac{\partial^2 u}{\partial x^2} dtu(t+dt,x)?u(t,x)?≈k?x2?2u?
在本模擬中,我們將模擬一根長度為 2 米的初始冷金屬棒,兩端持續加熱至 200?C,假設該棒為鋼,熱常數 k k k? 為 0.466。我們將運行 10 秒的模擬,看看會發生什么。
import numpy
from matplotlib import pyplot
常量:
length = 10
k = .466
temp_at_left_end = 200
temp_at_right_end = 200
total_time = 10
dx = .1
x_vec = numpy.linspace(0, length, int(length/dx))
dt = .0001
t_vec = numpy.linspace(0, total_time, int(total_time/dt))
u = numpy.zeros([len(t_vec), len(x_vec)])
由于我們的棒將在兩端持續加熱,因此我們希望棒的左側和右側始終分別為 temp_at_left_end 和 temp_at_right_end。從數學上講,這可以表示為 u(t, 0) = 200 和 u(t, length) = 200(對于所有時間 t),代碼如下:
u[:, 0] = temp_at_left_end
u[:, -1] = temp_at_right_end
您可以看到兩端的溫度很高,而其他地方的溫度均為 0,因此,我們準備解決這個問題!我們要做的就是迭代沿棒的所有點和所有時間點,將它們代入我們之前推導的方程中。
for t in range(1, len(t_vec)-1):for x in range(1, len(x_vec)-1):u[t+1, x] = k * (dt / dx**2) * (u[t, x+1] - 2*u[t, x] + u[t, x-1]) + u[t, x]
要可視化它,只需在循環內部調用 pyplot.plot() 即可獲得動畫繪圖,或在循環外部調用 pyplot.plot() 獲得靜態繪圖。