Equação de Kuramoto–Sivashinsky: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
Linha 56: | Linha 56: | ||
Ao partir de uma condição inicial senoidal, a equação se mantém estável por longos períodos de tempo, o que atrasa a chegada de seu comportamento mais característico: a formação de faixas. Esse comportamento é mais perceptível ao se analisar o mapa temporal da solução, deixando clara a tendência da equação de concentrar mínimos e máximos próximos, gerando picos e vales que se relacionam de forma complexa. No entanto, é fácil perceber que o comportamento simulado não é caótico e sim quase periódico. Isso está atrelado a um fator muito importante para o estudo da equação, o tamanho da periodicidade simulada, ou seja, seu domínio (L). | Ao partir de uma condição inicial senoidal, a equação se mantém estável por longos períodos de tempo, o que atrasa a chegada de seu comportamento mais característico: a formação de faixas. Esse comportamento é mais perceptível ao se analisar o mapa temporal da solução, deixando clara a tendência da equação de concentrar mínimos e máximos próximos, gerando picos e vales que se relacionam de forma complexa. No entanto, é fácil perceber que o comportamento simulado não é caótico e sim quase periódico. Isso está atrelado a um fator muito importante para o estudo da equação, o tamanho da periodicidade simulada, ou seja, seu domínio (L). | ||
== Implementação do Código em Python == | |||
<source lang="python"> | |||
#Importação de bibliotecas | |||
from scipy.fft import fft, ifft, fftshift | |||
from scipy import integrate | |||
import numpy as np | |||
import matplotlib.pyplot as plt | |||
from PIL import Image | |||
import glob | |||
import IPython.display | |||
#Parâmetros Gerais | |||
L = 3 | |||
N = L*100 | |||
t_max = 90000 | |||
dx = L/N | |||
dt = 10 | |||
X = np.arange(0,L,dx) | |||
K = 4*np.pi/L * np.arange(-L/2,L/2,dx) | |||
K = fftshift(K) | |||
#Forma diferencial da Equação KS | |||
def KS(t,F,K=K): | |||
fourier = fft(F) | |||
return ifft(K**2 * fourier) - ifft(K**4 * fourier) - F/2 * ifft(K * 1j* fourier) | |||
#Forma integral da Equação KS | |||
def IKS(t,F,K=K): | |||
fourier = fft(F) | |||
return ifft(K**2 * fourier) - ifft(K**4 * fourier) - (ifft(K * 1j* fourier))**2 | |||
#Declaração das condições iniciais | |||
F = np.zeros(N) + 0j | |||
F0 = np.sin(2*np.pi*X/L)**2 + 0j | |||
G = F.copy() | |||
t = 0 | |||
plot = 1 | |||
V = np.zeros((t_max,N)) + 0j | |||
T = np.arange(t,t_max) *dt | |||
#Solução por RK45 | |||
sol=integrate.RK45(KS,0,F0,t_max,dt,first_step=dt) | |||
#Evolução temporal | |||
while t < t_max: | |||
#Criação de um frame do gif em uma pasta grafs pré-existentes | |||
if t%1000==0: | |||
fig = plt.figure(figsize=(5,5)) | |||
plt.plot(X,sol.y.real,label='tempo:{}'.format(t*dt)) | |||
plt.xlabel('X') | |||
plt.ylabel('v(x,t)') | |||
plt.legend(loc='upper right') | |||
plt.ylim(-5,5) | |||
fig.savefig('./grafs/%c.PNG'% (plot)) | |||
plt.close() | |||
plot+=1 | |||
V[t] = sol.y | |||
sol.step() | |||
t +=1 | |||
# Criação do GIF | |||
frames = (Image.open(f) for f in sorted(glob.glob("./grafs/*.PNG"))) | |||
frame_one = next(frames) | |||
frame_one.save("animado.gif", format="GIF", append_images=frames, save_all=True, duration=150, loop=0) | |||
#Criação mapa de cores real | |||
fig = plt.figure(figsize=(5,5)) | |||
graf = plt.pcolormesh(X,T,V.real,cmap="inferno",vmin=-5,vmax=5) | |||
plt.xlabel('x') | |||
plt.ylabel('t') | |||
cbar = fig.colorbar(graf) | |||
cbar.ax.set_title('v(x,t)') | |||
plt.savefig("mapa_temporal.png") | |||
</source> |
Edição das 21h28min de 16 de dezembro de 2023
Nesta página apresentamos uma simulação de Dinâmica Molecular utilizando o potencial de Lennard-Jones como potencial de interação entre as partículas.
Equação
A equação de Kuramoto-Sivashinsky (KS) foi inicialmente proposta por Yoshiki Kuramoto e Gregory Sivashinsky para a modelagem das instabilidades da frente de uma chama laminar.
No entanto, a forma diferencial da equação foi descoberta independentemente na área de dinâmica de fluidos, onde ficou mais conhecida para a modelagem de filmes finos.
A equação apresenta comportamentos caóticos ao ser estudada em geometrias anelares, ou seja, condições de contorno periódicas; por isso esse será o caso estudado aqui.
Métodos de Solução
Diferenças Finitas (FTCS)
O método mais simples foi aplicado a fim de entender o comportamento da equação. Tentativas de linearização resultaram em uma equação de comportamento muito distinto do descrito na literatura; e portanto, não é de nosso interesse estudá-la. É importante relembrar que a aplicação do método FTCS não é recomendado no caso de não linearidades pois o método tem baixa precisão e pode acumular erros.
Como esperado, a solução numérica teve sua estabilidade atrelada à suas condições iniciais; ou seja, a solução é instável (exceto em casos bem específicos, onde ela se comporta de forma análoga à equação da difusão).
Método Espectral (FFT)
Utilizando o método fft em conjunto com as propriedades da transformada de fourier, pode-se resolver a EDP utilizando a forma de derivada espectral. Esse método possui alta precisão e é capaz de incorporar o comportamento ondulatório de soluções, algo característico da equação de Kuramoto-Sivashinsky.
A derivada espectral é caracterizada pela transformada de fourier de uma derivada, o que facilita a resolução de equações diferenciais parciais:
Essa propriedade permite que a resolução da parte espacial da equação de Kuramoto-Sivashinsky diferencial seja dada por
onde . A parte temporal também pode ser resolvida da mesma forma, mas o método de Runge-Kutta (RK45) foi aplicado em seu lugar por sua maior simplicidade e velocidade de processamento.
Soluções
Através do método espectral foi possível estudar o comportamento da Equação de Kuramoto-Sivashinsky em sua forma diferencial. Para uma melhor interpretação das soluções, os dados são dispostos em dois modelos de gráfico: um gif em que a passagem de tempo é representada pela mudança de frames, e um gráfico com escala de cores; onde os eixos representam o tempo e o espaço.
Ao partir de uma condição inicial senoidal, a equação se mantém estável por longos períodos de tempo, o que atrasa a chegada de seu comportamento mais característico: a formação de faixas. Esse comportamento é mais perceptível ao se analisar o mapa temporal da solução, deixando clara a tendência da equação de concentrar mínimos e máximos próximos, gerando picos e vales que se relacionam de forma complexa. No entanto, é fácil perceber que o comportamento simulado não é caótico e sim quase periódico. Isso está atrelado a um fator muito importante para o estudo da equação, o tamanho da periodicidade simulada, ou seja, seu domínio (L).
Implementação do Código em Python
#Importação de bibliotecas
from scipy.fft import fft, ifft, fftshift
from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import glob
import IPython.display
#Parâmetros Gerais
L = 3
N = L*100
t_max = 90000
dx = L/N
dt = 10
X = np.arange(0,L,dx)
K = 4*np.pi/L * np.arange(-L/2,L/2,dx)
K = fftshift(K)
#Forma diferencial da Equação KS
def KS(t,F,K=K):
fourier = fft(F)
return ifft(K**2 * fourier) - ifft(K**4 * fourier) - F/2 * ifft(K * 1j* fourier)
#Forma integral da Equação KS
def IKS(t,F,K=K):
fourier = fft(F)
return ifft(K**2 * fourier) - ifft(K**4 * fourier) - (ifft(K * 1j* fourier))**2
#Declaração das condições iniciais
F = np.zeros(N) + 0j
F0 = np.sin(2*np.pi*X/L)**2 + 0j
G = F.copy()
t = 0
plot = 1
V = np.zeros((t_max,N)) + 0j
T = np.arange(t,t_max) *dt
#Solução por RK45
sol=integrate.RK45(KS,0,F0,t_max,dt,first_step=dt)
#Evolução temporal
while t < t_max:
#Criação de um frame do gif em uma pasta grafs pré-existentes
if t%1000==0:
fig = plt.figure(figsize=(5,5))
plt.plot(X,sol.y.real,label='tempo:{}'.format(t*dt))
plt.xlabel('X')
plt.ylabel('v(x,t)')
plt.legend(loc='upper right')
plt.ylim(-5,5)
fig.savefig('./grafs/%c.PNG'% (plot))
plt.close()
plot+=1
V[t] = sol.y
sol.step()
t +=1
# Criação do GIF
frames = (Image.open(f) for f in sorted(glob.glob("./grafs/*.PNG")))
frame_one = next(frames)
frame_one.save("animado.gif", format="GIF", append_images=frames, save_all=True, duration=150, loop=0)
#Criação mapa de cores real
fig = plt.figure(figsize=(5,5))
graf = plt.pcolormesh(X,T,V.real,cmap="inferno",vmin=-5,vmax=5)
plt.xlabel('x')
plt.ylabel('t')
cbar = fig.colorbar(graf)
cbar.ax.set_title('v(x,t)')
plt.savefig("mapa_temporal.png")