Matlab事件查找器偶尔会丢失事件

时间:2014-09-04 13:20:58

标签: matlab

我一直在研究一种最近给我带来麻烦的数字模型。我正在尝试解决某个位置存在影响的系统的时间序列。显然,Matlab的事件查找器正是针对这种情况,但是它失败了,因为它偶尔会在没有触发的情况下超过事件阈值。

我的系统是一个摆锤,墙壁在-30度。应该很简单;解决,直到摆锤击中-30,停止,反向速度等。但是,正如你在我的图片中看到的那样,它偶尔会在-30左右摆动并且不会停止积分。该代码主要是球反弹示例的复制粘贴工作,微分方程已更改,但不知何故,它无法正常工作。有问题的时间序列的照片在这里:

http://i.stack.imgur.com/Ws1cg.jpg

我的代码在这里: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

我尝试了一些不同的颂歌解决方案,虽然他们的结果略有不同,但他们似乎都在这里和那里错过了各种活动。

如果有人对事件偶尔未能注意到事件的原因有任何见解,我会很感激!谢谢!

0 个答案:

没有答案