我正在使用伪谱方法来求解一个偏微分方程,转换后的常微分方程如下:
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);这里有人能帮我解决这个问题吗?非常感谢!
发布于 2015-04-18 05:53:58
如果您可以在导致错误的行前直接打印出矩阵尺寸,这将很有帮助。
错误本身可能是由kx与exp(...)的意外矩阵乘法造成的。插入用于逐个元素乘法的所有重要的点。
请注意,如果为uhat = fft(u),则ifft(uhat)为N*u,直到浮点错误。因此,您应该始终将ifft与按维度划分相结合。
这条线
rhs = g * fft(real(ifft(u2)));几乎肯定是错误的,因为u2是空间的函数,而不是频率的函数,并且此过程的输入和输出是频率的函数。我想你可能想用
rhs = g .* fft(u2);https://stackoverflow.com/questions/29708940
复制相似问题