有问题的代码在这里:
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 应该足够小,以至于需要数十万次迭代才能触发。
假设我必须使用欧拉方法。如果您对我为什么告诉您做出这样的假设感到好奇,我有一个带有状态相关噪声的随机微分方程。