Matlab ODE求解器因步长较小而永远停留

时间:2017-03-27 04:27:21

标签: matlab ode

我对Matlab很新,这个ODE求解器,下面是我的代码:

的main.m

format short;

tspan=[0 5];
y0=[0.30;-0.30;0;-0;0];


[t,y]=ode23s(@(t,y) pend(t,y),tspan,y0);

figure(1)
%subplot(2,1,1); 
plot(t,y(:,1),t,y(:,2),'k--')
set(gcf,'Position',[100,500,450,180]);
xlabel('time [s]');
legend('q_1','q_2')
ylabel('leg angle [rad]');

figure(2)
%subplot(2,1,2); 
plot(t,y(:,5))
set(gcf,'Position',[100,500,450,180]);
xlabel('time [s]')
ylabel('locomotion [m]')

pend.m

%the following function contains the right hand side of the
%differential equation of the form
%M(t,y)*y'=F(t,y)
%i.e. it contains F(t,y).it is also stored in a separate filenamed, pend.m.
function yp= pend(t,y)
m = 5;                  %leg masses [kg]        suggested: 5
               %'shin' length [m]      suggested: 0.5
b = 0.5;                %'thigh' length [m]     suggested: 0.5

L = 2*b; 

q=y(1:2);
dq=y(3:4);
Ox=y(5);

rho=0;

k0=50; %Nm/rad

v = 0;
Hsw= L*cos(q(1));  % Height of leg1
Hst= L*cos(q(2));   % Height of leg2
H1 = L - Hsw; 
H2 = L - Hst; 

if dq(1)<0
    Fid1=1;
else Fid1=0;
end
if dq(2)<0
    Fid2=1;
else Fid2=0;
end    

F1 =  -15000*min(H1-0.03*L,0)*Fid1; %N
F2 =  -15000*min(H2-0.03*L,0)*Fid2;

Fc1 = F1*L*sin(q(1));
Fc2 = F2*L*sin(q(2));

Fc=[Fc1;Fc2];
M=[m*b^2 0;0 m*b^2];
Ko=k0*[1 -1; -1 1]+m*9.8*b*[1 0; 0 1];
D=M;

ddq=inv(M)*(-rho*D*dq-Ko*q+Fc);

dOx=0;
 if Fid1==1
    dOx=-L*dq(1)*cos(q(1))*sign(F1);
 end
 if Fid2==1
dOx=-L*dq(2)*cos(q(2))*sign(F2);
 end

 yp=[dq;ddq;dOx];

我在这里遇到的问题是时间跨度t随着极小的步长而增加,这些步骤随时间继续减小,例如20s内0.1~0.8,5min内0.8~0.9等等,这意味着它永远不会达到时间限制,因此卡在循环中。

我尝试过不同的求解器,比如ode45也试过给出不同的RelTol和AbsTol值来控制步长但是失败了。它确实对前几步有所不同,但随后再次变慢。

当我使用求解器ode15s时,会发出警告

  

&#34;在t = 9.246943e-01时失败。无法满足集成容差   不会将步长减小到允许的最小值以下   (1.776357e-15)在时间t。&#34;

并且仅将图形绘制到0.92秒。

欢迎任何有关解决此问题的建议或帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以按不同比例处理数量。

例如; 将时间( t )计算为“毫秒”而不是“秒”。这会给(或保留)额外的3个小数位,以允许最小步长的适当递增,Δt≥1.776357e-15。

注意:如果从速度 t 的量中基本上得出另一个物理量,如速度(“米/秒”),请确保比例/单位相等。在给出示例的情况下,计算中的速度单位必须为“米/毫秒”。

额外注释; 返回所需的最终值时,如有必要,请转换回适当的比例。

答案 1 :(得分:0)

具有自适应步长的ODE求解器期望平滑的ODE函数。四阶求解器期望ODE函数至少连续可微分4次。

您的ODE功能有跳跃和扭结。求解器将这些感知为非常大且混乱振荡的高导数值。为了补偿和恢复收敛顺序,步长减小,进一步增加计算的导数值,因为你的函数不是真正可微分的,直到步长增量小于最小有效浮点增量,触发你看到的错误。

使用"events"来完成那些非平滑模型更改时停止并重新启动集成过程。