0

有问题的代码在这里:

function k = whileloop(odefun,args)
    ...
    while (sign(costheta) == originalsign)
        y=y(:) + odefun(0,y(:),vars,param)*(dt); % Line 4
        costheta = dot(y-normpt,normvec);
        k = k + 1;
    end
    ...
end

澄清一下,odefun 是 F1.m,我的一个 m 文件。我将它传递给包含这个 while 循环的函数。有点像whileloop(@F1,args)。上面代码块中的第 4 行是欧拉方法。

我使用while循环的原因是因为我想在向量“y”穿过由点定义的平面“normpt”和垂直于平面的向量“normvec”时触发。

是否对这段代码进行了简单的更改,可以显着加快速度?我是否应该尝试学习如何制作 mex 文件(以提高速度)?

编辑:

这是一个可以尝试测试的示例的匆忙尝试。我没有调试过这个。就是给你一个思路:

%Save the following 3 lines in an m-file named "F1.m"
function ydot = F1(placeholder1,y,placeholder2,placeholder3)
    ydot = y/10;
end

%Run the following:
dt = 1.5e-12 %I do not know about this. You will have to experiment.
y0 = [.1,.1,.1];
normpt = [3,3,3];
normvec = [1,1,1];
originalsign = sign(dot(y0-normpt,normvec));
costheta = originalsign;
y = y0;
k = 0;
while (sign(costheta) == originalsign)
    y=y(:) + F1(0,y(:),0,0)*(dt); % Line 4
    costheta = dot(y-normpt,normvec);
    k = k + 1;
end
disp(k);

dt 应该足够小,以至于需要数十万次迭代才能触发。

假设我必须使用欧拉方法。如果您对我为什么告诉您做出这样的假设感到好奇,我有一个带有状态相关噪声的随机微分方程。

4

1 回答 1

2

我将专注于您的实际 ODE 集成。您必须采取的步骤越少,循环运行的速度就越快。在您优化实际集成方法后,我只会担心符号检查的速度。

看起来您正在使用一阶显式欧拉方法。您是否尝试过高阶积分器或隐式方法?通常,您可以显着增加时间步长。

于 2012-06-26T17:40:39.013 回答