Equação de Liouville-Bratu-Gelfand
Equação de Liouville-bratu-Gelfand
Na matemática, a Equação Liouville–Bratu–Gelfand ou Equação de Liouville é uma equação de Poisson não linear, nomeada em homenagem aos matemáticos Joseph Liouville, Gheorghe Bratu e Israel Gelfand, que é descrita da seguinte forma
Essa equação aparece em problemas de Avalanche térmica, como na teoria de Frank-Kamenetskii, e na astrofísica, por exemplo, na equação Emden–Chandrasekhar. Esta equação pode descrever a carga espacial de eletricidade em torno de um fio brilhante ou até mesmo uma nebulosa planetária.
A solução de Liouville
Em duas dimensões, com coordenadas cartesianas (x,y), Joseph Liouville propôs uma solução em 1853 como
onde , , e é uma função analítica arbitrária com . Em 1915, G.W. Walker[1] encontrou uma solução assumindo uma forma para . Se , então a solução de Walker é
onde é algum raio finito. Essa solução vai ao infinito para qualquer , mas vai ao infinito na origem , finito na origem para e vai a zero na origem para . Walker também propôs mais duas soluções em seu artigo de 1915.
Formas radialmente simétricas
Se o sistema a ser estudado for radialmente simétrico, então a equação em dimensões torna-se
onde é a distância a partir da origem. Com as condições de contorno
e para , uma solução real existe apenas para , onde é o parâmetro crítico chamado de parâmetro de Frank-Kamenetskii. O parâmetro crítico é para , para e para . Para , existem duas soluções e para existem infinitas soluções com as soluções oscilando em torno do ponto . Para , a solução é única e, nesses casos, o parâmetro crítico é dado por . A multiplicidade de soluções para foi descoberta por Israel Gelfand em 1963 e, posteriormente, em 1973, generalizada para todos os por Daniel D. Joseph e Thomas S. Lundgren.[2]
A solução para que é válida no intervalo é dada por
onde está relacionada a como
A solução para que é válida no intervalo é dada por
onde está relacionada a como
Método Crank-Nicolson
Para resolver a equação diferencial parcial de Liouville-Bratu-Gelfand foi utilizado o método de Crank-Nicolson. Sendo a média ponderada dos métodos explícito e implícito de FTCS (Forward Time Central Space) da forma:
onde .
Método Explícito FTCS
Para o método explícito a equação é discretizada da seguinte forma:
considerando resulta em:
Método Implícito FTCS
Para o método implícito a equação é discretizada da mesma forma, porém a derivada é "para trás", resultando em:
Substituindo ambos os métodos na equação do método de Crank-Nicolson obtemos:
Simulação em Júlia
Equação 2D
using LinearAlgebra
using SparseArrays
using Plots
using ColorSchemes
using FilePathsBase
# Parâmetros do problema
Lx = 2.0
Ly = 2.0
alpha = 3.51 # Parâmetro da equação
tol = 2350
# Função para inicializar a matriz de coeficientes
function initialize_matrix(Nx, Ny, dx, dy, alpha)
N = Nx * Ny
A = spzeros(N, N)
for j in 1:Ny
for i in 1:Nx
k = (j-1) * Nx + i
if i == 1 || i == Nx || j == 1 || j == Ny
A[k, k] = 1.0
else
A[k, k] = -2.0 / dx^2 - 2.0 / dy^2 - alpha
A[k, k-1] = 1.0 / dx^2
A[k, k+1] = 1.0 / dx^2
A[k, k-Nx] = 1.0 / dy^2
A[k, k+Nx] = 1.0 / dy^2
end
end
end
return A
end
# Função para inicializar o vetor de termos independentes
function initialize_rhs(Nx, Ny, dx, dy, alpha, u)
N = Nx * Ny
b = zeros(N)
for j in 1:Ny
for i in 1:Nx
k = (j-1) * Nx + i
if i == 1 || i == Nx || j == 1 || j == Ny
b[k] = 0.0 # Condições de contorno
else
b[k] = -u[j, i] / (2.0 * dx^2) - u[j, i] / (2.0 * dy^2) - alpha * exp(u[j, i])
end
end
end
return b
end
# Função para resolver a equação usando o método de Crank-Nicolson
function solve_equation(Nx, Ny, dx, dy, alpha, tol=tol, max_iter=1000)
A = initialize_matrix(Nx, Ny, dx, dy, alpha)
u = rand(Ny, Nx)
for iter in 1:max_iter
b = initialize_rhs(Nx, Ny, dx, dy, alpha, u)
u_new = A \ b
u_new = reshape(u_new, Ny, Nx)
if norm(u_new - u) < tol
println("Convergiu em $iter iterações.")
return u_new
end
u = u_new
end
println("Não convergiu após $max_iter iterações.")
return u
end
# Resolver a equação
l = collect(5:50)
m = 5 # Definindo m como o valor mínimo desejado para Nxl
Nxl = collect(Int(m):50)
Nyl = collect(5:50)
anim = @animate for z in 1:length(Nxl)
Nx = Nxl[z]
Ny = Nyl[z]
dx = Lx / (Nx - 1)
dy = Ly / (Ny - 1)
u = solve_equation(Nx, Ny, dx, dy, alpha)
# Plotar a solução
heatmap(u, title="Solução da Equação de Liouville-Bratu-Gelfand, tol=$tol", xlabel="x", ylabel="y", dpi=1000)
end
figuras_dir = mkpath("figuras2D")
gif(anim, figuras_dir*"/animacao.gif", fps=2)
Equação 3D
using LinearAlgebra
using SparseArrays
using Plots
#Plots.default(show=true)
#plotlyjs() # Use plotlyjs para gráficos interativos; você pode usar gr() se preferir
gr()
# Parâmetros do problema
Lx = 20
Ly = 20
Nx = 100
Ny = 100
dx = Lx / (Nx - 1)
dy = Ly / (Ny - 1)
alpha = 3.51 # Parâmetro da equação
tol=2350
# Função para inicializar a matriz de coeficientes
function initialize_matrix(Nx, Ny, dx, dy, alpha)
N = Nx * Ny
A = spzeros(N, N)
for j in 1:Ny
for i in 1:Nx
k = (j-1) * Nx + i
if i == 1 || i == Nx || j == 1 || j == Ny
A[k, k] = 1.0
else
A[k, k] = -2.0 / dx^2 - 2.0 / dy^2 - alpha
A[k, k-1] = 1.0 / dx^2
A[k, k+1] = 1.0 / dx^2
A[k, k-Nx] = 1.0 / dy^2
A[k, k+Nx] = 1.0 / dy^2
end
end
end
return A
end
# Função para inicializar o vetor de termos independentes
function initialize_rhs(Nx, Ny, dx, dy, alpha, u)
N = Nx * Ny
b = zeros(N)
for j in 1:Ny
for i in 1:Nx
k = (j-1) * Nx + i
if i == 1 || i == Nx || j == 1 || j == Ny
b[k] = 0.0 # Condições de contorno
else
b[k] = -u[j, i] / (2.0 * dx^2) - u[j, i] / (2.0 * dy^2) - alpha * exp(u[j, i])
end
end
end
return b
end
# Função para resolver a equação usando o método de Crank-Nicolson
function solve_equation(Nx, Ny, dx, dy, alpha, tol=tol, max_iter=5000)
#u = rand(Ny, Nx)
x = range(0, stop=Lx, length=Nx)
y = range(0, stop=Ly, length=Ny)
A = initialize_matrix(Nx, Ny, dx, dy, alpha)
for iter in 1:max_iter
u = rand(Ny, Nx)
b = initialize_rhs(Nx, Ny, dx, dy, alpha, u)
u_new = A \ b
u_new = reshape(u_new, Ny, Nx)
if norm(u_new - u) < tol
println("Convergiu em $iter iterações.")
return u_new
end
u = u_new
end
println("Não convergiu após $max_iter iterações.")
return u
end
# Resolver a equação
u = solve_equation(Nx, Ny, dx, dy, alpha)
# Criar os vetores de coordenadas x e y
x = range(0, stop=Lx, length=Nx)
y = range(0, stop=Ly, length=Ny)
# Plotar a solução em 3D
plot = surface(x, y, u, title="Solução da Equação de Liouville-Bratu-Gelfand, tol=$tol", xlabel="x", ylabel="y", zlabel="u", dpi=1000)
display(plot)
savefig(plot, "Liouville3d(Lx=$Lx,Ly=$Ly,N=$Nx).png")
#display(plot)
#l=plot(u,x,y,st=:surface,camera=(-30,30))
#savefig(l, "Liouville3d.png")
#readline()
Referências
- https://en.wikipedia.org/wiki/Liouville%E2%80%93Bratu%E2%80%93Gelfand_equation
- Scherer, CLÁUDIO. Métodos Computacionais da Física. 2010.
- ↑ Walker, George W. "Some problems illustrating the forms of nebulae." Proceedings of the Royal Society of London. Series A, Containing Papers of a Mathematical and Physical Character 91.631 (1915): 410-420.https://www.jstor.org/stable/pdf/93512.pdf?refreqid=excelsior%3Af4a4cc9656b8bbd9266f9d32587d02b1
- ↑ Joseph, D. D., e T. S. Lundgren. "Quasilinear Dirichlet problems driven by positive sources." Archive for Rational Mechanics and Analysis 49.4 (1973): 241-269.