View in NBViewer Open in binder Download notebook View source


12.3. Equação do calor unidimensional

\[ u_t = \kappa u_{xx} \]
using DifferentialEquations
using Plots

Equação do calor

\[ K(t,x) = \frac{1}{\sqrt{4\kappa\pi t}} e^{x^2/(4\kappa t)}. \] \[ u(t,x) = \int_{-\infty}^\infty K(t,x-\xi)u_0(\xi)\;d\xi = \frac{1}{\sqrt{4\kappa\pi t}} \int_{-\infty}^\infty e^{(x-\xi)^2/(4\kappa t)}u_0(\xi)\;d\xi. \]

Simulação

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_calor!(dudt, u, p, t)
    ν, h2 = p
    ddu = Δ(u, h2, Val(:dir))
    dudt .= ν * ddu
    return nothing
end
dudt_calor! (generic function with 1 method)
κ = 0.5 # coeficiente de difusão térmica
L = 2π # comprimento do intervalo [0,L]
N = 60 # 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
p = [κ, h^2] # parâmetros
Tf = 12 # tempo final
τ = 0.1 # intervalos de tempo
tspan = (0.0,Tf) # intervalo de tempo
prob = ODEProblem(dudt_calor!, u₀, tspan, p, saveat = τ)
nothing
plot(x, u₀, title="Condição inicial", titlefont=10, xlabel="x", ylabel="u")
sol = solve(prob, Tsit5())
sol.retcode
:Success
anim = @animate for (t,u) in zip(sol.t, sol.u)
    plot(x, u, ylims=(-0.1, 1.1), label="t=$(round(t,digits=2))",
        title="Evolução equação do calor unidimensional (κ=$κ)", titlefont=10,
        xlabel="x", ylabel="u")
end
gif(anim, "../../../_assets/attachments/img/anim_calor1D_a.gif", fps = 20)
nothing

heat1d

Outra simulação

κ = 2.0
p = [κ, h^2] # parâmetros
prob = ODEProblem(dudt_calor!, u₀, tspan, p, saveat = τ)
sol = solve(prob, Tsit5())
sol.retcode
:Success
anim = @animate for (t,u) in zip(sol.t, sol.u)
    plot(x, u, ylims=(-0.1, 1.1), label="t=$(round(t,digits=2))",
        title="Evolução equação do calor unidimensional (κ=$κ)", titlefont=10,
        xlabel="x", ylabel="u")
end
gif(anim, "../../../_assets/attachments/img/anim_calor1D_b.gif", fps = 20)
nothing

heat1dB

Exercicios:

  1. Simular a equação de difusão com condições de contorno Neumann.