我一直在研究一种最近给我带来麻烦的数字模型。我正在尝试解决某个位置存在影响的系统的时间序列。显然,Matlab的事件查找器正是针对这种情况,但是它失败了,因为它偶尔会在没有触发的情况下超过事件阈值。
我的系统是一个摆锤,墙壁在-30度。应该很简单;解决,直到摆锤击中-30,停止,反向速度等。但是,正如你在我的图片中看到的那样,它偶尔会在-30左右摆动并且不会停止积分。该代码主要是球反弹示例的复制粘贴工作,微分方程已更改,但不知何故,它无法正常工作。有问题的时间序列的照片在这里:
我的代码在这里:https://gist.github.com/f892a764ca10027a3b89
function matlab_timeser
k1 = .557;
tstart = 0;
tfinal = 1200;
refine = 100;
y0 = [-3.0*pi/180.0; 6.0*pi/180.0];
options = odeset('Events',@events,'Refine',refine);
tout = tstart;
yout = y0.'; % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
teout = [];
yeout = [];
ieout = [];
while max(tout) < tfinal
[t,y,te,ye,ie] = ode113(@f,[tstart tfinal],y0,options);
% Accumulate output.
nt = length(t);
tout = [tout; t(2:nt)];
yout = [yout; y(2:nt,:)];
teout = [teout; te]; % Events at tstart are never reported.
yeout = [yeout; ye];
ieout = [ieout; ie];
% Set the new initial conditions, with k attenuation.
y0(1) = -30 * pi/180;
y0(2) = -k1*y(nt,2);
% A good guess of a valid first time step is the length of
% the last valid time step, so use it for faster computation.
options = odeset(options,'InitialStep',t(nt)-t(nt-refine),'MaxStep',t(nt)-t(1));
tstart = t(nt);
% plot(tout,yout(:,1)*180/pi)
% hold on
% plot([0 t(nt)],[-30 -30],'r')
% hold off
% pause()
end
plot(tout,yout(:,1)*180/pi)
hold on
plot([0 t(nt)],[-30 -30],'r')
end
function dydt = f(t, y)
wf = 0.8008 * 2 * pi;
param = [6e-4 6.087 2.1e-3 0.236 0.557];
coul1 = param(1);
w1 = param(2);
z1 = param(3);
AL = param(4);
dydt = [y(2); AL*(wf)^2*sin(wf*t)*cos(y(1))-(w1)^2*sin(y(1))-2.0*z1*w1*y(2)-coul1*((y(2)^2)+(w1)^2*cos(y(1)))*sign(y(2))];
end
function [value,isterminal,direction] = events(t,y)
value = y(1) + 30*pi/180; % Detect height = -30
isterminal = 1; % Stop the integration
direction = 0; % any direction
end
我尝试了一些不同的颂歌解决方案,虽然他们的结果略有不同,但他们似乎都在这里和那里错过了各种活动。
如果有人对事件偶尔未能注意到事件的原因有任何见解,我会很感激!谢谢!