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))

したがって、すべてのベクトルが入力されていますが、何が問題なのかわかりません。1 つの数値に設定Nしてそのループを削除するとfor、すべて正常に機能しますが、ループを追加するとすべてが壊れます。残念ながら、私はそれを理解することはできません。

設定などでコードをテストする場合はN = 64、 と をコメントアウトする必要がdeltaxありerror.appendます。

4

1 に答える 1

3

N = 1あなたが持っているのでdx = 80.、sizex = numpy.arange(-40, -40, 80)の配列が得られます0。その結果、好きではないuサイズ0もあります。fft

于 2013-09-27T01:01:18.517 に答える