using DifferentialEquations
using Plots
Observe que, para cada $t>0$, a função $x\mapsto K(t,x)$ é uma Gaussiana, com desvio padrão aumentando com $t$, ou seja, a solução se espalha, correspondendo a uma difusão na distribuição de $u$.
A solução com condição inicial $u(0,x) = u_0(x)$ é dada pela convolução
Vamos simular numericamente a evolução em um intervalo $I=[0,L]$, com condições de contorno de Dirichlet homogêneas, i.e. $u(0)=u(L)=0$.
Na interpretação de $u$ como temperatura, e assumindo uma escala em graus Celsius, isso corresponde a mantermos a temperatura nos extremos a zero grau.
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
┌ Info: Saved animation to │ fn = /Users/rrosa/Documents/git_repositories/modelagem_matematica/_assets/attachments/img/anim_calor1D_a.gif └ @ Plots /Users/rrosa/.julia/packages/Plots/MzlNY/src/animation.jl:130
κ = 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
┌ Info: Saved animation to │ fn = /Users/rrosa/Documents/git_repositories/modelagem_matematica/_assets/attachments/img/anim_calor1D_b.gif └ @ Plots /Users/rrosa/.julia/packages/Plots/MzlNY/src/animation.jl:130