我正在尝试为 的每个值设置不同的数值积分N
。我所有依赖的变量N
都正确返回(我打印了结果以确保在没有 NaN 或全零的情况下一切正常)。但是,我不断收到以下错误:
ValueError: Invalid number of FFT data points (0) specified.
但是u
向量有数据点。
import numpy as np
L = 80.0
dt = 0.0002
tmax = 10
nmax = int(np.floor(tmax / dt))
deltax = []
error = []
for N in [1., 2., 4., 8., 16., 32., 64., 128., 256., 512.]:
dx = L / N
deltax.append(dx)
x = np.arange(-L / 2.0, L / 2.0 - dx, dx)
k = np.hstack((np.arange(0, N / 2.0 - 1.0),
np.arange(-N / 2.0, 0))).T * 2.0 * np.pi / L
k1 = 1j * k
k3 = (1j * k) ** 3
u = 2 * (2 / (np.exp(x + 20.0) + np.exp(-x - 20.0))) ** 2
udata = u
tdata = 0.0
# integration
for nn in range(1, nmax + 1):
du1 = (-np.fft.ifft(k3 * np.fft.fft(u)) -
3 * np.fft.ifft(k1 * np.fft.fft(u ** 2)))
v = u + 0.5 * du1 * dt
du2 = (-np.fft.ifft(k3 * np.fft.fft(v)) -
3 * np.fft.ifft(k1 * np.fft.fft(v ** 2)))
v = u + 0.5 * du2 * dt
du3 = (-np.fft.ifft(k3 * np.fft.fft(v)) -
3 * np.fft.ifft(k1 * np.fft.fft(v ** 2)))
v = u + du3 * dt
du4 = (-np.fft.ifft(k3 * np.fft.fft(v)) -
3 * np.fft.ifft(k1 * np.fft.fft(v ** 2)))
u = u + (du1 + 2.0 * du2 + 2.0 * du3 + du4) * dt / 6.0
error.append(max(abs(u[:,-1] - 2. *
(2. / (np.exp(x - 20) + np.exp(-x - 60))))))
if np.mod(nn, np.ceil(nmax / 20.0)) == 0:
udata = np.vstack((udata, u))
tdata = np.vstack((tdata, nn * dt))
所以所有的向量都被填充了,但我不知道问题是什么。如果我设置N
为一个数字并删除该for
循环,一切正常,但当我添加循环时,一切都会崩溃。不幸的是,我无法弄清楚。
如果您通过设置N = 64
或其他方式测试代码,则必须注释掉deltax
和error.append
.