我使用伪谱法求解PDE,转换后的ODE如下:
function rhs = vhat(~, vhat0, ~, delta_t,kx)
uhat = exp(1i * kx.^3 * delta_t) * vhat0;
u = real(ifft(uhat));
u2 = u.^2;
g = -0.5 * 1i * kx * exp(-1i * kx.^3 * delta_t);
rhs = g * fft(real(ifft(u2)));
我的主要代码是:
%----- Parameters for PDE -----
L = 20;
n = 2048;
delta_t = 0.001;
tmax = 0.5;
c1 = 1.5; % amplitude of 1st wave
x = linspace(-L/2, L/2, n+1);
x = x(1:n);
kx = (2*pi/L)*[0:n/2-1 -n/2:-1];
tspan = 0:delta_t:tmax;
%-----initial condition
z1 = sqrt(c1)/2. * (x-0.1*L);
soliton = 6*0.5 * c1 * sech(z1).^2;
uhat0 = fft(soliton);
vhat0 = uhat0;
[t,vhat] = ode45('vhat',tspan, vhat0, [], delta_t,kx);
for j=1:length(t)
w = real(ifft(vhat(j,:)*exp(1i * kx.^3 * j * delta_t)));
plot(x,w)
drawnow
pause(0.2)
end
运行此代码时,我收到如下错误:
Error using *
Inner matrix dimensions must agree.
Error in vhat (line 6)
g = -0.5 * 1i * kx * exp(-1i * kx.^3 * delta_t);
Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in kdvm (line 18)
[t,vhat] = ode45('vhat',tspan, vhat0, [], delta_t,kx);
这里的任何人都可以帮我解决这个问题吗?非常感谢!
答案 0 :(得分:0)
如果您可以在导致错误的行之前直接打印矩阵尺寸,将会很有帮助。
错误本身可能是由kx
与exp(...)
的意外矩阵乘法引起的。插入所有重要的点以进行逐元素乘法。
请注意,如果uhat = fft(u)
,则ifft(uhat)
最多为浮点错误N*u
。因此,您应始终将ifft
与维度的除法组合。
该行
rhs = g * fft(real(ifft(u2)));
几乎肯定是错误的,因为u2
是空间的函数,而不是频率的函数,并且此过程的输入和输出是频率的函数。我想你可能想用
rhs = g .* fft(u2);