Equação de Liouville-Bratu-Gelfand: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
 
(9 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
== 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
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


<center><math> \nabla^2 \psi+\lambda e^\psi =0</math></center>
<center><math> \nabla^2 \psi+\lambda e^\psi =0</math></center>


Essa equação aparece em problemas de fuga 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.
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 ==
== A solução de Liouville ==
Linha 74: Linha 74:
<center><math> \psi_{j,i}^{n+1} = \psi_{j,i}^{n} + \frac{1}{2} \left( \frac{\Delta t}{{(\Delta x)}^2} \left( \psi_{i-1,j}^{n+1} + \psi_{i+1,j}^{n+1} + \psi_{i,j-1}^{n+1} + \psi_{i,j+1}^{n+1} - 4\psi_{i,j}^{n+1} \right) + \Delta t \lambda e^{\psi_{i,j}^{n+1}} + \frac{\Delta t}{{(\Delta x)}^2} \left( \psi_{i-1,j}^{n} + \psi_{i+1,j}^{n} + \psi_{i,j-1}^{n} + \psi_{i,j+1}^{n} - 4\psi_{i,j}^{n} \right) + \Delta t \lambda e^{\psi_{i,j}^{n}} \right) </math></center>
<center><math> \psi_{j,i}^{n+1} = \psi_{j,i}^{n} + \frac{1}{2} \left( \frac{\Delta t}{{(\Delta x)}^2} \left( \psi_{i-1,j}^{n+1} + \psi_{i+1,j}^{n+1} + \psi_{i,j-1}^{n+1} + \psi_{i,j+1}^{n+1} - 4\psi_{i,j}^{n+1} \right) + \Delta t \lambda e^{\psi_{i,j}^{n+1}} + \frac{\Delta t}{{(\Delta x)}^2} \left( \psi_{i-1,j}^{n} + \psi_{i+1,j}^{n} + \psi_{i,j-1}^{n} + \psi_{i,j+1}^{n} - 4\psi_{i,j}^{n} \right) + \Delta t \lambda e^{\psi_{i,j}^{n}} \right) </math></center>


== Método de Relaxação ==
== Simulação em Júlia ==
Como a equação de Liouville-Bratu-Gelfand não depende do tempo, é necessária uma aproximação para uma equação similar dependente do tempo para resolvê-la numericamente aplicando o método de FTCS (Foward Time Central Space). Fazendo então a solução dessa equação convergir ao estado estacionário diante de uma evolução temporal longa o suficiente (<math>t \rightarrow \infty</math>).


Utilizando uma equação da difusão genérica chegamos na seguinte forma:
===Equação 2D===
<br />
<source lang="julia">
using LinearAlgebra
using SparseArrays
using Plots
using ColorSchemes
using FilePathsBase


<center><math>\frac{\partial \psi}{dt} = \alpha \left( \frac{\partial^{2}\psi}{\partial x^2} + \frac{\partial^{2}\psi}{\partial y^2} + \lambda e^\psi\right)</math>.</center>
# Parâmetros do problema
Lx = 2.0
Ly = 2.0
alpha = 3.51  # Parâmetro da equação
tol = 2350


Onde <math>\alpha</math> é a constante de difusão. Assim é possível aplicar essa equação no método de Jacobi, método numérico de relaxação.
# 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)
 
</source><br />
 
===Equação 3D===
<br />
<source lang="julia">
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()
 
</source><br />


== Referências ==
== Referências ==

Edição atual tal como às 10h25min de 16 de julho de 2024

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

  1. https://en.wikipedia.org/wiki/Liouville%E2%80%93Bratu%E2%80%93Gelfand_equation
  2. Scherer, CLÁUDIO. Métodos Computacionais da Física. 2010.
  1. 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
  2. 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.