파동 방정식의 수치적 풀이: 유한차분법(FDM)
📂수치해석파동 방정식의 수치적 풀이: 유한차분법(FDM)
메서드
아래와 같은 1차원 파동 방정식이 주어졌다고 하자.
∂t2∂2u=c2∂x2∂2u,0≤x≤1,t≥0(1)
우리의 목적은 유한한 점으로 위의 솔루션을 근사하는 것이다. 시공간 도메인을 다음과 같이 쪼개자.
{(ℓΔx,nΔt):ℓ=0,1,…,d+1, n≥0} where Δx=d+11
u(ℓΔx,nΔt)의 근사를 uℓn이라 표기하자. 윗첨자 n이 거듭제곱이 아닌 시간의 인덱스라는 것에 주의하자. (1)의 우변과 좌변은 각각 다음과 같이 근사된다.
∂x2∂2u(x,t)=(Δx)21[u(x−Δx,t)−2u(x,t)+u(x+Δx,t)]+O((Δx)2)
∂t2∂2u(x,t)=(Δt)21[u(x,t−Δt)−2u(x,t)+u(x,t+Δt)]+O((Δt)2)
이제 μ=ΔxΔt라고 두자. 두 식을 (1)에 대입하여 정리하면 다음을 얻는다.
u(x,t−Δt)−2u(x,t)+u(x,t+Δt)≈μ2[u(x−Δx,t)−2u(x,t)+u(x+Δx,t)]
⟹u(x,t+Δt)≈2u(x,t)−u(x,t−Δt)+μ2[u(x−Δx,t)−2u(x,t)+u(x+Δx,t)]
⟹u(x,t+Δt)≈2(1−μ2)u(x,t)−u(x,t−Δt)+μ2[u(x−Δx,t)+u(x+Δx,t)]
⟹uℓn+1=μ2uℓ+1n+2(1−μ2)uℓn+μ2uℓ−1n−uℓn−1,ℓ=1,…,d, n=0,1,…(2)
여기서 공간간격과 시간간격의 비율 μ=ΔxΔt는 커런트 수Courant number라 불리는 중요한 상수이며, (2)의 수렴여부를 결정한다.
설명
위의 메서드는 μ≤1일 때 수렴한다.

2차원
2차원인 경우에 시공간을 다음과 같이 쪼갰다고 하자.
{(ih,jh,nΔt):i,j=0,1,…,d+1, n≥0} where h=d+11
그러면 근사식은 다음과 같다.
∂x2∂2u≈h2ui+1,jn−2ui,jn+ui−1,jn
∂y2∂2u≈h2ui,j+1n−2ui,jn+ui,j−1n
∂t2∂2u≈Δt2ui,jn+1−2ui,jn+ui,jn−1
⟹∂t2∂2u−(∂x2∂2u+∂y2∂2u)≈Δt2ui,jn+1−2ui,jn+ui,jn−1−h2ui+1,jn−2ui,jn+ui−1,jn−h2ui,j+1n−2ui,jn+ui,j−1n=0
⟹ui,jn+1=2(1−2μ2)ui,jn−ui,jn−1+μ2(ui+1,jn+ui−1,jn+ui,j+1n+ui,j−1n)
여기서 μ=hΔt이다.
코드
경계 조건을 0으로 두고 계산해보면 다음과 같은 결과를 얻는다.

using Plots
x = LinRange(-1, 1, 300)
Δx = x[2] - x[1]
t = LinRange(0, 4, 600)
Δt = t[2] - t[1]
μ = Δt / Δx
U = zeros(length(x), length(t))
U[:, 1] = exp.(-30 * x.^2)
U[:, 2] = exp.(-30 * x.^2)
for i ∈ 3:length(t)
U[2:end-1, i] = (μ^2)*U[3:end, i-1] + 2(1-μ^2)*U[2:end-1, i-1] + (μ^2)*U[1:end-2, i-1] - U[2:end-1, i-2]
end
heatmap(U)
anim = @animate for i ∈ 1:length(t)
plot(x, U[:, i], xlims=(-1, 1), ylims=(-2,2), legend=false)
end
gif(anim, fps=50)