使用ode45时出错

时间:2015-04-17 20:39:48

标签: matlab ode

我使用伪谱法求解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);

这里的任何人都可以帮我解决这个问题吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您可以在导致错误的行之前直接打印矩阵尺寸,将会很有帮助。

错误本身可能是由kxexp(...)的意外矩阵乘法引起的。插入所有重要的点以进行逐元素乘法。


请注意,如果uhat = fft(u),则ifft(uhat)最多为浮点错误N*u。因此,您应始终将ifft与维度的除法组合。

该行

rhs  = g * fft(real(ifft(u2)));

几乎肯定是错误的,因为u2是空间的函数,而不是频率的函数,并且此过程的输入和输出是频率的函数。我想你可能想用

rhs = g .* fft(u2);