MATLAB - 事件位置无法正常工作?

时间:2016-03-23 21:00:03

标签: matlab events ode

在求解ode的4变量系统时​​,事件定位功能无法找到简单事件。这是代码:

options1 = odeset('RelTol',1e-5,'AbsTol',1e-9,'Events',@evento1); 
[T_ode1,X_ode1,te]=ode15s(@Seno,[0 2],[0 0 0 0 0],options1);

function [y] = Seno(t,x)

%Parameters 
V=20;
R=1e6;
epsilon=8.87e-12;
d=4.5e-5;
k_sp=10;
gamma1=0.04;
gamma2=0.1;
m=66e-3;
A=0.1;
omega=80;
h=3.8e-6;
l=2e-3;
N=142;

%Variable redefinition
%x=[x,xpunto,q,y,ypunto] 
X=x(1);
Xp=x(2);
Q=x(3);
Y=x(4);
Yp=x(5);

%sistema eq differenziali
y(1)=Xp; %y1(1)=position1
y(2)=-(2*k_sp*X/m)-(gamma1*Xp/m)+((epsilon*2*d*h*N*l)*X*V^2/((d^2-X^2)^2))+A*sin(omega*t); %y1(2)=velocity1
y(3)=1/R*(V-Q*(d^2-X^2)/(epsilon*2*d*h*N*l)); %y1(3)=charge
y(4)=Yp; %position 2
y(5)=-gamma2*Yp; %velocity2
y=y';
end 

function [condition,ends,directions] = evento1(t,y)
a=2e-6;
c=2e-6;
b=1.5e-6;
condition= [(y(1)^2)-(a+c)^2, (y(4)^2)-(y(1)+b)^2, (y(4)^2)-(y(1)-b)^2];
ends = [1, 1, 1];  % Halt integration
directions = [1, -1, 1];   
end

将所有初始条件设置为0,如您所见,事件函数应该找到的第一个事件是当y(1)通过1.5e-6(y(4)为0时)的tird条件。不幸的是,ode会忽略该事件,并在满足第一个时停止解决方案。

我不明白为什么会这样!我尝试了调试模式,系统正确地通过1.5e-6但不认为它是一个事件(即它没有开始在事件附近的更多点评估解决方案)。

感谢您的时间,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您可以在模拟系统后绘制事件条件:

options1 = odeset('RelTol',1e-5,'AbsTol',1e-9,'Events',@evento1); 
[T_ode1,X_ode1,te] = ode15s(@Seno,[0 2],[0 0 0 0 0],options1);

a = 2e-6;
c = 2e-6;
b = 1.5e-6;
y = X_ode1;
condition = [y(:,1).^2-(a+c)^2 y(:,4).^2-(y(:,1)+b).^2 y(:,4).^2-(y(:,1)-b).^2];
figure;
plot(T_ode1,condition);
hold on;
plot(T_ode1([1 end]),[0 0],'k--',te,0,'k*');
legend('Condition 1','Condition 2','Condition 3','Location','W');
xlabel('Time');
ylabel('State');
ylim([-1.8e-11 2e-12]);

这会产生如下图:

event condition plot

如果放大图表,您会看到第三个条件(黄色)从不过零,因此从不触发事件。最终,第一个事件(蓝色)越过零并触发事件。调整积分公差似乎不会改变此行为(最好是第三个条件可能渐近触摸,但不会交叉,零)。如果您希望第三个条件触发事件,您需要更改参数,更改条件,更改初始条件或更改ODE。

我不确定您是否或为什么认为第三个条件应该过零,但如果系统在数值上是敏感的,那么您可能需要通过更精确地指定参数或人为地偏置过零点来补偿这一点。