0

我正在尝试为 的每个值设置不同的数值积分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或其他方式测试代码,则必须注释掉deltaxerror.append.

4

1 回答 1

3

因为N = 1你有dx = 80.并且x = numpy.arange(-40, -40, 80)它给你一个 size 数组0。因此,u也有大小0fft不喜欢。

于 2013-09-27T01:01:18.517 回答