Подтвердите модель Simulink Используя Symbolic Math Toolbox

В этом примере показано, как смоделировать прыгающий мяч, который является классической гибридной динамической системой. Эта модель включает и непрерывную динамику и дискретные переходы. Это использует Symbolic Math Toolbox, чтобы помочь объяснить часть теории позади решения ОДУ в Модели Simulink® Прыгающего мяча.

Предположения

  • Шар оживляется без угла

  • Нет никаких, перетаскивают

  • Высота во время t=0 составляет 10 м

  • Выданный с вверх скоростью 15 м/с

Деривация

Коэффициент восстановления задан как

Cr=vb-va/ua-ub

где v является скоростью объекта перед ударом, и u является скоростью после.

Мы разделяем дифференциальное уравнение второго порядка

d2hdt2=-g

в

dhdt=v дискретизированный как h(t+Δt)-h(t)Δt=v(t)

и

dvdt=-g дискретизированный как v(t+Δt)-v(t)Δt=-g

Мы будем использовать основное 1-е численное интегрирование порядка с помощью прямого Эйлера.

h(t+Δt)=h(t)+v(t)Δt

v(t+Δt)=v(t)-gΔt

Решите задачу аналитически

Используя Symbolic Math Toolbox, мы можем приблизиться к проблеме аналитически. Это позволяет нам решать определенные задачи более легко, такие как определение точно, когда мяч сначала попадает в землю (ниже).

Объявите наши символьные переменные.

syms g t H(t) h_0 v_0

Разделите дифференциальное уравнение второго порядка d2hdt2=-gв dhdt=v и dvdt=-g.

Dh = diff(H);
D2h = diff(H, 2) == g
D2h(t) = 

2t2 H(t)=g

Решите ОДУ с помощью dsolve:

eqn = dsolve(D2h, H(0) == h_0, Dh(0) == v_0)
eqn = 

gt22+v0t+h0

Параметрически исследуйте параболический профиль движения с помощью subs:

eqn = subs(eqn, [h_0, v_0, g], [10, 15, -9.81])
eqn = 

-981t2200+15t+10

Найдите время, в которое мяч попадает в землю путем решения для нуля:

assume(t > 0)
tHit = solve(eqn == 0)
tHit = 

20526109+500327

Визуализируйте решение

fplot(eqn,[0 10])
ylim([0 25])

Отформатируйте свою точную арифметику точности переменной использования результатов с vpa:

disp(['The ball with an initial height of 10m and velocity of 15m/s will hit the ground at ' char(vpa(tHit, 4)) ' seconds.'])
The ball with an initial height of 10m and velocity of 15m/s will hit the ground at 3.621 seconds.

Решите задачу численно

Параметры симуляции Setup

Свойства шара

c_bounce = .9;        % Bouncing's coefficient of restitution; perfect restitution would be 1

Свойства симуляции

gravity  = 9.8;       % Gravity's acceleration (m/s)
height_0 = 10;        % Initial height at time t=0 (m)
velocity_0=15;        % Initial velocity at time t=0 (m/s)

Объявление такта симуляции

dt = 0.05;            % Animation timestep (s)
t_final = 25;         % Simulate period (s)
t = 0:dt:t_final;     % Timespan
N = length(t);        % Number of iterations

Инициализируйте количества симуляции

h=[];                 % Height of the ball as a function of time (m)
v=[];                 % Velocity of the ball (m/sec) as a function of time (m/s)
h(1)=height_0;
v(1)=velocity_0;

Симулируйте прыгающий мяч (мы будем использовать основное 1-е численное интегрирование порядка с помощью прямого Эйлера):

for i=1:N-1
       
    v(i+1)=v(i)-gravity*dt;
    h(i+1)=h(i)+v(i)*dt;
    
    % When the ball bounces (the height is less than 0), 
    % reverse the velocity and recalculate the position.
    % Using the coefficient of restitution
    if h(i+1) < 0
        
       v(i)=-v(i)*c_bounce;
       v(i+1)=v(i)-gravity*dt;
       h(i+1)=0+v(i)*dt;

    end
    
end

Визуализируйте и подтвердите симуляцию

plot(t,h,'o')
hold on 
fplot(eqn,[0 10])
title('Height over time')
ylim([0 25])
hold off

plot(t,v)
title('Velocity over time')

Подтвердите численные данные с аналитикой

Сравните свои аналитические результаты с вашими числовыми результатами.

Как напоминание время удара было:

disp(['The ball with an initial height of 10m and velocity of 15m/s will hit the ground at ' char(vpa(tHit, 4)) ' seconds.'])
The ball with an initial height of 10m and velocity of 15m/s will hit the ground at 3.621 seconds.

От числовой симуляции мы можем найти самое близкое значение в симуляции когда h(ti)0

i = ceil(double(tHit/dt));
t([i-1 i i+1]) 
ans = 1×3

    3.5500    3.6000    3.6500

plot(t,h,'o')
hold on 
fplot(eqn,[0 10])
plot(t([i-1 i i+1 ]),h([i-1 i i+1 ]),'*R')
title('Height over time')
xlim([0 5])
ylim([0 25])
hold off