Подтвердите модель 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])

Figure contains an axes object. The axes object contains an object of type functionline.

Отформатируйте свою точную арифметику точности переменной использования результатов с 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

Figure contains an axes object. The axes object with title Height over time contains 2 objects of type line, functionline.

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

Figure contains an axes object. The axes object with title Velocity over time contains an object of type line.

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

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

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

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

Figure contains an axes object. The axes object with title Height over time contains 3 objects of type line, functionline.