の各値に対して異なる数値積分を設定しようとしています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
ます。