我有用Python和Matlab实现的算法。它在Python中运行正常,但在Matlab中我在输出中得到了奇怪的假象(大部分时间,但不是总是)。见下图,人工制品是高峰。
我试图克服所有差异。我在Python中覆盖了与Matlab不同的所有函数(例如除法余数)。也许我想念一些东西,但我不这么认为。功能输出似乎与我想出的所有测试一致。
只有我没有“标准化”的部分是ODE求解器。在Matlab中,我使用ode45和定义的时间点数组。在Python中,我使用自己的ODE45,它工作得很好,没有人工制品。我也尝试过不同的Python ode求解器(来自scipy),它也很棒。
所以我的问题是 - 你知道为什么Matlab(很可能是ode45)有时会导致如此奇怪的错误吗?
matlab中的方程式:
function dxdt = derivsecgsyn(t,x,flag,rr,sfint,ti,ai,bi)
xi = cos(ti);
yi = sin(ti);
ta = atan2(x(2),x(1));
r0 = 1;
a0 = 1.0 - sqrt(x(1)^2 + x(2)^2)/r0;
ip = 1+floor(t*sfint);
w0 = 2*pi/rr(ip);
fresp = 0.25;
zbase = 0.005*sin(2*pi*fresp*t);
dx1dt = a0*x(1) - w0*x(2);
dx2dt = a0*x(2) + w0*x(1);
dti = rem(ta - ti, 2*pi);
dx3dt = - sum(ai.*dti.*exp(-0.5*(dti./bi).^2)) - 1.0*(x(3) - zbase);
dxdt = [dx1dt; dx2dt; dx3dt];