首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ode45时出错

使用ode45时出错
EN

Stack Overflow用户
提问于 2015-04-18 04:39:48
回答 1查看 425关注 0票数 1

我正在使用伪谱方法来求解一个偏微分方程,转换后的常微分方程如下:

代码语言:javascript
复制
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)));

我的主要代码是:

代码语言:javascript
复制
%----- 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 

在运行这段代码时,我得到了如下错误:

代码语言:javascript
复制
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);

这里有人能帮我解决这个问题吗?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2015-04-18 05:53:58

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

错误本身可能是由kxexp(...)的意外矩阵乘法造成的。插入用于逐个元素乘法的所有重要的点。

请注意,如果为uhat = fft(u),则ifft(uhat)N*u,直到浮点错误。因此,您应该始终将ifft与按维度划分相结合。

这条线

代码语言:javascript
复制
rhs  = g * fft(real(ifft(u2)));

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

代码语言:javascript
复制
rhs = g .* fft(u2);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29708940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档