using DifferentialEquations
using Plots
Logo, desde que $F$ e $G$ sejam duas vezes diferenciáveis, temos $u(t,x)$ também duas vezes diferenciáveis e satisfazendo a equação da onda.
As formas de $F$ e $G$ dependem das condições iniciais $u(0,x) = u_0(x)$ e $u_t = v_0(x)$:
Vamos considerar condições de contorno de Dirichlet homogêneas, $u(t,0)=u(t,L) = 0$.
Isso representa a situação em que os extremos da corda estão fixos na mesma altura.
Nesse caso, definimos a discretização do Laplaciano como no caso da equação do calor.
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)
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)
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
┌ Info: Saved animation to │ fn = /Users/rrosa/Documents/git_repositories/modelagem_matematica/_assets/attachments/img/anim_onda1D_a.gif └ @ Plots /Users/rrosa/.julia/packages/Plots/MzlNY/src/animation.jl:130