Método Lax-Wendroff: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 3: Linha 3:
<center><math>
<center><math>
u_i^{n+1}= u_{i}^n - \frac{r}{2}(u_{i+1}^n + u_{i-1}^n) + \frac{r^2}{2} (u_{i+1}^n - 2u_{i}^n + u_{i-1}^n)
u_i^{n+1}= u_{i}^n - \frac{r}{2}(u_{i+1}^n + u_{i-1}^n) + \frac{r^2}{2} (u_{i+1}^n - 2u_{i}^n + u_{i-1}^n)
</math></center>(14)
</math></center>


= Implementação do método =
= Implementação do método =
Linha 89: Linha 89:
</center>
</center>


<source lang =- "python">
<source lang = "python">


# Teste: Plota todas as curvas amplitude por posição de todos os tempos:
# Teste: Plota todas as curvas amplitude por posição de todos os tempos:

Edição atual tal como às 19h42min de 5 de fevereiro de 2024

Trata-se de um método de segunda ordem tanto no tempo quanto no espaço. Lax e Wendroff propuseram um método de discretização de segunda ordem para resolver equações hiperbólicas, o qual substituiu o método de Lax-Friedrichs.

Implementação do método

  • Condição inicial: ;
  • Condições de contorno para bordas cíclicas.
# Solução pelo método Lax-Wendroff para equação de advecção

def LaxWad(L, tf, v, Nx, Nt):
    """
    Parâmetros:
    - L: comprimento
    - tf: tempo final
    - v: velocidade de propagação
    - Nx: número de pontos na direção espacial
    - Nt: número de pontos na direção temporal

    Retorna:
    - Matriz com a solução da equação da onda
    """

    dx = L / (Nx - 1)
    dt = tf / (Nt - 1)
    r = v * dt / dx

    u = np.zeros((Nt, Nx+1))

    # Condição inicial: u(x,0) = f(x)
    x = np.linspace(0, L, Nx+1)
    u[0,:] = 1-np.cos(x) # Função que descreve a perturbação da onda

    # Condições de contorno borda infinita:
    xpos = np.zeros(Nx+1)
    xneg = np.zeros(Nx+1)

    for i in range(0,Nx+1):
      xpos[i] = i+1
      xneg[i] = i-1
    xpos[Nx] = 0
    xneg[0] =  Nx

    # Iteração no tempo
    for n in range(0, Nt - 1):
        for i in range(0, Nx+1):
            u[n+1,i] = u[n,i] + (r/2) * (u[n, int(xpos[i])] - u[n,int(xneg[i])]) + (r**2/2) * (u[n, int(xpos[i])] - 2*u[n,i] + u[n,int(xneg[i])])

    return u
# Parâmetros
L = 2*np.pi
tf =1
v = 1 # -1. muda direção de propagação
Nx = 100
Nt = 500

solv3 = LaxWad(L, tf, v, Nx, Nt)

listX = np.linspace(0, L, Nx+1)
listT = np.linspace(0, tf, Nt)

X, T = np.meshgrid(listX, listT)

plt.figure(figsize=(10, 6))
plt.pcolormesh(X, T, solv3, cmap='viridis', shading='auto')
plt.colorbar(label='Amplitude(u)')
plt.xlabel('Posição (x)')
plt.ylabel('Tempo (t)')
plt.title('Solução Lax-Wendroff da Equação da advecção (1D)', fontsize=16)
plt.show()
Solução pelo método Lax-Wendroff
# Teste: Plota todas as curvas amplitude por posição de todos os tempos:

for tt in range(len(listT-1)):
  amplitudes_tt = solv3[ tt,:]
  plt.plot(listX, amplitudes_tt)

plt.title('Amplitude em Função da Posição')
plt.xlabel('Posição (x)')
plt.ylabel('Amplitude (u)')
plt.legend()
plt.grid(True)
plt.show()
Solução pelo método Lax-Wendroff