View in NBViewer Open in binder Download notebook View source


12.4. Equação da onda unidimensional

\[ u_{tt} = c^2 u_{xx}. \]
using DifferentialEquations
using Plots

Solução analítica

\[ u(t,x) = F(x-ct) + G(x+ct). \] \[ u_t = (-c)F'(x-ct) + cG'(x+ct), \qquad u_{tt} = c^2(F''(x-ct) + G''(x+ct)) \] \[ u_x = F'(x-ct) + G'(x+ct), \qquad u_{xx} = F''(x-ct) + G''(x+ct). \] \[ F(x) + G(x) = u_0(x), \quad -cF'(x) + cG'(x) = v_0(x). \]

Transformação para um sistema de equações de primeira ordem

\[ \begin{cases} u_t = v, \\ v_t = c^2u_{xx}. \end{cases} \] \[ U = \left(\begin{matrix} u \\ v \end{matrix}\right) \] \[ U_t = AU \] \[ A = \left[ \begin{matrix} 0 & I \\ c^2\partial_{x}^2 & 0 \end{matrix} \right] \] \[ \frac{\partial}{\partial t} \left(\begin{matrix} u \\ v \end{matrix}\right) = \left[ \begin{matrix} 0 & I \\ c^2\partial_{x}^2 & 0 \end{matrix} \right] \left(\begin{matrix} u \\ v \end{matrix}\right) \]

Simulação numérica

function δ²(u, h2, ::Val{:dir})
    ddu = zero(u)
    for j = 2:length(u)-1
        ddu[j] = (u[j+1] - 2u[j] + u[j-1])/h2
    end
    return ddu
end
δ² (generic function with 1 method)

Representação numérica do sistema

\[ U = [u \;\; v] = \left[\begin{matrix} u_1 & v_1 \\ \vdots & \vdots \\ u_N & v_N \end{matrix}\right] \] \[ u = U[:,1], \quad v = U[:,2] \]

Lei de evolução

function dUdt_onda!(dUdt, U, p, t)
    c2, h2 = p
    u = U[:,1]
    v = U[:,2]
    dUdt[:,1] .= v
    dUdt[:,2] .= c2 * δ²(u, h2, Val(:dir))
    return nothing
end
dUdt_onda! (generic function with 1 method)

Definindo parâmetros e resolvendo o sistema

c = 0.5 # 
L = 2π # comprimento do intervalo [0,L]
N = 80 # número de pontos da malha
h = L/(N-1) # comprimento de cada partição na malha
x = range(0.0, L, length=N) # discretização do intervalo [0,L] com N pontos, incluindo os extremos
u₀ = exp.(-(x.-L/2).^2) .- exp(-L^2/4) # condição inicial
v₀ = -2*(x.-L/2) .* exp.(-(x.-L/2).^2) # condição inicial w₀ = ∂ₓv₀
U₀ = [u₀ v₀]
p = [c^2, h^2] # parâmetros
Tf = 2*L/c # tempo final
τ = 0.1 # intervalos de tempo
tspan = (0.0,Tf) # intervalo de tempo
prob = ODEProblem(dUdt_onda!, U₀, tspan, p, saveat = τ)
nothing
sol = solve(prob, Tsit5())
sol.retcode
:Success
anim = @animate for (t,U) in zip(sol.t, sol.u)
    plot(x, U[:,1], ylims=(-2.0, 2.0), label="t=$(round(t,digits=2))",
        title="Evolução equação da onda unidimensional (c=$c)", titlefont=10)
end
gif(anim, "../../../_assets/attachments/img/anim_onda1D_a.gif", fps = 20)
nothing

wave1d