我正在尝试通过频谱方法求解强迫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方程,我的代码正在工作。但是当我为强制调用函数时,由于强制总是为零,因此它不起作用。
请帮助我编码。我是光谱方法社区的新手。