用谱法求解强迫汉堡方程

时间:2019-06-01 15:53:22

标签: python fft spectral

我正在尝试通过频谱方法求解强迫Burger方程。在这里,力仅在大范围内才起作用(例如,仅20个傅立叶模式)。

在这里,力由以下方式提供:

  \begin{equation} 
  \label{eqn:1_1}
   F  =  \eta \, exp(i \,  \phi).
  \end{equation}

其中$ \ eta $是通过求解获得的:

  \begin{equation} 
   \label{eqn:1_2}
   \eta^{2} + b_{1} \,\eta + c_{1 } = 0.
   \end{equation}

   \begin{equation} 
   \label{eqn:1_3}
    b_{1} =  \dfrac{2}{\Delta t} \, Re\left(u(t) \, exp(-i \,  \phi)\right) .
   \end{equation}

   \begin{equation} 
    \label{eqn:1_4}
    c_{1} = - \dfrac{2 \epsilon}{\Delta t}.
    \end{equation}

所以,在傅立叶空间中

   \begin{equation} 
   \label{eqn:1_5}
    \dfrac{d \,\widehat{u}}{dt} + i k \left( \dfrac{\widehat{u^2}}{2} \right) =  \nu \, i^2 \, k^2\, \widehat{u} +  F(\widehat{u}).
    \end{equation}

按照@Taozi给出的方法:

https://math.stackexchange.com/questions/1732058/solving-viscous-burgers-using-spectral-method

我正在使用Python对解决方案进行数值计算。对于无力的Burger方程,我的代码正在运行。但是当我为强制调用函数时,由于强制总是为零,因此它不起作用。

我的代码是:

import numpy as np
from numpy import pi,sin,zeros,arange,real,exp, sqrt
import random
from numpy.fft import fft,ifft
import matplotlib.pyplot as plt

 # Grid in real plane
N = 128  # Number of fourier modes
L = 2*pi  #  Domain size
dx = L/N
x = np.linspace(0.0, L, N) #   x-gridpoints [1xN]


# Transform to spectral plane
M= zeros(N); M[0:N/2] = arange(0,N/2); M[N/2 + 1:] = arange(-N/2 +  1,0,1)
k = 2*pi*M/L  #% Wavenumbers [1xN].  



# Simulation parameters
t = 0.0
dt = 0.001
tMax = 3.1
nu = 0.01
i = np.complex(0.0, 1.0)
k1 = i*k
k2 = k1**2


# Initial condition

uinit = sin(x)
u0 = uinit




## for random force
def force(u, dt):
   for n in range(0, N/2):
      if k[n] <= 2.0:
        phi = random.random()
        b1= 2.0 * real(fft(u) * exp(-i * phi))/dt
        eps = 1.0
        c1=-2.0*eps/dt;

        eta = (-b1-sqrt(b1*b1-4*c1))/2
        F =   eta * exp(i * phi)
        # print (F)
    else:
        F = 0  

    #    print (F)        
return F








 # Time integration loop
  while t <= tMax:
     # Euler forward method
      uhat = fft(u0) - dt*k1*fft(0.5*u0**2) + dt*nu*k2*fft(u0)  + dt * force(u0, dt)
      u0 = ifft(uhat) # Perform inverse transform to recover solution in real   space

      t += dt





plt.plot(x, u0)     
plt.xlabel(r'$x$', fontsize=20)
plt.ylabel(r'$u$', rotation=0, fontsize=20, labelpad=20)         
plt.show()    

对于无力的Burger方程,我的代码正在工作。但是当我为强制调用函数时,由于强制总是为零,因此它不起作用。

请帮助我编码。我是光谱方法社区的新手。

0 个答案:

没有答案