You are on page 1of 9

Приложение на MATLAB в инженерните изследвания – част II

6.7. Уравнения на Лагранж за система с две степени на


свобода
Диференциалните уравнения на движение на механична система с
две степени на свобода е рационално да се съставят с помощта на
уравненията на Лагранж

d ⎛ ∂L ⎞ ∂L
⎜⎜ ⎟⎟ − = Q1неп
dt ⎝ ∂q&1 ⎠ ∂q1
d ⎛ ∂L ⎞ ∂L
⎜⎜ ⎟⎟ − = Q2 неп
dt ⎝ ∂q& 2 ⎠ ∂q 2

където:
L = L(t , q1 , q2 , q&1 , q& 2 ) - Лагранжиан на системата;
Q1неп , Q2 неп - обобщени непотенциални сили;
q1 , q2 - обобщени координати;
q&1 , q& 2 - обобщени скорости.
Следва пълния текст на програмата LAGRE2
function lagre2
% *******************************************************************
% П р о г р а м а LAGRE2
% *******************************************************************
%
% ПРЕДНАЗНАЧЕНИЕ:
% Извежда диференциалните уравнения на движение на механична сис-
% тема с две степени на свобода посредством уравненията на Лагранж
% d/dt(dL/dqt1) - dL/dq1 = QN1(t,q1,q2,qt1,qt2);
% d/dt(dL/dqt2) - dL/dq2 = QN2(t,q1,q2,qt1,qt2);
% Решава уравненията числено и чертае графиките на координатите,
% скоростите и фазовите траектории.
%
% ВХОДНИ ДАННИ:
% L - израз на Лагранжиана L = L(t, q1, q2, qt1, qt2);
% QN1 - обобщена непотенциална сила QN1 = QN1(t,q1,q2,qt1,qt2);
% QN2 - обобщена непотенциална сила QN2 = QN2(t,q1,q2,qt1,qt2);
% qj0 - вектор с началните стойности на координатите;
% qtj0 - вектор с началните стойности на скоростите;
% Tend - горна граница на интегриране ;
% eps - желана точност на пресмятанията ;
% np - брой на параметрите .
% P{1}, P{2}, ..., P{np} - имена на параметрите (масив от клетки);

- 140 -
Глава 6. Динамика на механични системи

% ЗАБЕЛЕЖКИ:
% 1. Координатите се обозначават със символите 'q1', 'q2'
% а скоростите - с 'qt1', 'qt2';
% 2. Физическите имена на параметрите се присвояват на клетките на
% масива P, например: P{1}='m', P{2}='c',...;
% 3. Всички данни могат да се въвеждат от файл или в диалогов режим.
%
% ПРИМЕРЕН ФАЙЛ С ДАННИ:
% % Задача: Елиптично махало
% L = ['1/2*(m1+m2)*qt1^2 + 1/2*m2*l^2*qt2^2 + ',...
% 'm2*l*qt1*qt2*cos(q2) - 1/2*c*q1^2 + ',...
% '9.81*m2*l*cos(q2)']; % Лагранжиан
% QN{1} = '-alfa*qt1'; % Обобщени непотенциални
% QN{2} = '-k*qt2'; % сили
% qj0 = [0.02, 0]; % Начални координати
% qtj0 = [0.1, 0]; % Начални скорости
% Tend = 20; % Горна граница на интегриране
% eps = 1.e-8; % Точност на пресмятанията
% np = 6; % Брой на параметрите
% P{1} = 'm1'; % Присвояване имена на
% P{2} = 'm2'; % физическите параметри
% P{3} = 'l';
% P{4} = 'c';
% P{5} = 'alfa';
% P{6} = 'k';

% ---------------------------------------------------------
% ВЪВЕЖДАНЕ ДАННИТЕ НА ЗАДАЧАТА
% =========================================================

clear
disp(' ');
disp(' Как ще въвеждате данните ? ');
disp(' 1. От файл с данни; ');
disp(' 2. В диалогов режим. ');
ans = input(' Номера на вашия избор: ' );
flag = 0;
if ans == 1
while 1
disp(' ');
indat = input(' Въведете името на файла с данни:', 's');
if exist([cd,'\',indat]) % Търси само в текущата директория
eval(indat);
flag = 1; break % Успешен опит
else % Неуспешен опит
disp(' ');
disp([' Файлът ',indat,' не съществува!'])
disp(' Вие трябва:')
disp(' 1. Да въведете друго име на файл, или')
disp(' 2. Да въвеждате данните в диалогов режим !')
ans2 = input(' Вашия избор моля: ');
if ans2 == 2, break , end
end
end
end
- 141 -
Приложение на MATLAB в инженерните изследвания – част II

if flag == 0
% Въвеждане на данните в диалогов режим
L = input(' Изразът на Лагранжиана L : ','s' );
QN1 = input(' Обобщена непотенциална сила QN1 : ','s' );
QN2 = input(' Обобщена непотенциална сила QN2 : ','s' );
qj0 = input(' Начални стойности на координатите [q10, q20]: ' );
qtj0 = input(' Начални стойности на скоростите [qt10, qt20] : ');
Tend = input(' Горна граница на интегриране Tend : ' );
eps = input(' Желана точност на пресмятанията eps : ' );
np = input(' Брой на параметрите np : ' );
% Присвояване имена на параметрите
if np > 0
disp(' ');
disp(' Въведете имената на параметрите:')
for i = 1:np
ii = num2str(i);
P{i} = input([' Име на параметъра P',ii,': '],'s');
end
end
end

% ---------------------------------------------------------
% ИЗВЕЖДАНЕ НА ДИФЕРЕНЦИАЛНИТЕ УРАВНЕНИЯ
% =========================================================

syms t q1 qt1 qtt1 q2 qt2 qtt2


Lqt1 = diff(L,qt1);
deq1 = diff(Lqt1,q1)*qt1 + diff(Lqt1,qt1)*qtt1 + ...
diff(Lqt1,q2)*qt2 + diff(Lqt1,qt2)*qtt2 + ...
diff(Lqt1,t) - diff(L,q1) - QN1;
Lqt2 = diff(L,qt2);
deq2 = diff(Lqt2,q1)*qt1 + diff(Lqt2,qt1)*qtt1 + ...
diff(Lqt2,q2)*qt2 + diff(Lqt2,qt2)*qtt2 + ...
diff(Lqt2,t) - diff(L,q2) - QN2;
deq1 = simple(deq1);
deq2 = simple(deq2);
disp(' ');
disp(' ************************************************* ')
disp(' Д и ф е р е н ц и а л н и у р а в н е н и я ')
disp(' ************************************************* ')
disp(' ');
disp([' DEq1: ' ,char(deq1), ' = 0']);
disp(' ');
disp([' DEq2: ' ,char(deq2), ' = 0']);

% ---------------------------------------------------------
% ЧИСЛЕНО РЕШЕНИЕ
% =========================================================

% Въвеждане името на файл-функцията


disp(' ');
fname = input(' Въведете име на файл-функцията: ','s');
flag1 = 'Y';

- 142 -
Глава 6. Динамика на механични системи

if exist([cd,'\',fname]) % Търси само в текущата директория!


disp(' ');
disp([' Файл-функция с име ',fname,' вече съществува!'])
flag1 = input(' Да се премахне ли ? (Y/N): ', 's');
end
% ---------------------------------------------------------
% ГЕНЕРИРАНЕ НА ФАЙЛ-ФУНКЦИЯТА
% ---------------------------------------------------------
if ( flag1 == 'Y' | flag1 == 'y' )
% Въвеждане на новите променливи y1, y2, y3, y4
deq1 = subs(deq1, {q1,q2,qt1,qt2},{'y(1)','y(2)','y(3)','y(4)'});
deq2 = subs(deq2, {q1,q2,qt1,qt2},{'y(1)','y(2)','y(3)','y(4)'});
% Определяне на инерционните коефициенти и десните части на ДУ
a11 = maple('coeff',deq1,qtt1);
a12 = maple('coeff',deq1,qtt2);
a22 = maple('coeff',deq2,qtt2);
b1 = -subs(deq1,{qtt1,qtt2},{'0','0'});
b2 = -subs(deq2,{qtt1,qtt2},{'0','0'});
% Отваряне на файл за запис на файл-функцията
[Fid,mes] = fopen([fname,'.m'],'wt');
% Генериране на стринга със физическите параметри: m, c ...
strpar = '';
for j = 1:np
strpar = [strpar,',',P{j}];
end
disp(' ');
titl = input(' Название на задачата: ','s');
% Печат на заглавния ред на файл-функцията
fprintf(Fid,['function yt = ',fname,'(t,y',strpar,')\n']);
fprintf(Fid,['%% ',titl,'\n']);
% Определяне на инерционната матрица A и вектора b
fprintf(Fid,'%% Инерционна матрица A \n');
fprintf(Fid,[' A(1,1) = ', char(a11),';\n']);
fprintf(Fid,[' A(1,2) = ', char(a12),';\n']);
fprintf(Fid,[' A(2,1) = ', char(a12),';\n']);
fprintf(Fid,[' A(2,2) = ', char(a22),';\n']);
fprintf(Fid,'%% Десни части на ДУ \n' );
fprintf(Fid,[' b(1) = ', char(b1),';\n']);
fprintf(Fid,[' b(2) = ', char(b2),';\n']);
% Печат на първите производни
fprintf(Fid,'%% Първи производни\n');
fprintf(Fid,' a = A\\b'';\n');
fprintf(Fid,' yt(1) = y(3); \n');
fprintf(Fid,' yt(2) = y(4); \n');
fprintf(Fid,' yt(3) = a(1); \n');
fprintf(Fid,' yt(4) = a(2); \n');
fprintf(Fid,' yt = yt''; \n');
fprintf(Fid,['%% *** Край на файл-функцията ',fname,' ***']);
fclose(Fid);
edit(fname); % Отваряне на току-що създадения файл
end % за разглеждане и евентуални корекции

- 143 -
Приложение на MATLAB в инженерните изследвания – част II

% ---------------------------------------------------------
% ИНТЕГРИРАНЕ И ВИЗУАЛИЗАЦИЯ НА РЕЗУЛТАТИТЕ
% ---------------------------------------------------------

flag2 = 0;
% Първоначално въвеждане стойностите на параметрите и генериране
% на стринга 'P{1}, P{2}, ..., P{np}', който трябва да се подаде
% на файл-функцията като списък от действителни аргументи
if np > 0
PP = P; % Съхраняване физичните имена на параметрите в PP
parameters = ' ';
disp(' ');
disp(' Въвеждане числените стойности на параметрите: ')
for i = 1:np
i = num2str(i);
eval(['P{',i,'}=input(['' '',P{',i,'},'' = '']);']);
parameters = [parameters,',P{',i,'}'];
end
else
parameters = [];
end
while 1
if flag2 == 1
disp(' ');
eps = input(' Точност на пресмятанията eps: ' );
Tend = input(' Горна граница на интегриране Tend: ');
qj0 = input(' Начални координати [q10,q20]: ' );
qtj0 = input(' Начални скорости [qt10,qt20]: ' );
if np > 0
P = PP; % Възстановяване имената на параметрите !
disp(' ');
disp(' Въвеждане числените стойности на параметрите: ')
for i = 1:np
i = num2str(i);
eval(['P{',i,'}=input(['' '',P{',i,'},'' = '']);']);
end
end
end
y0 = [qj0 qtj0]; % начални условия
options = odeset('AbsTol',eps,'RelTol',100*eps);
% Избор на подходящ Solver
disp(' ');
disp(' Изберете подходящия Solver: ');
disp(' ------------------------------- ');
disp(' A. Нетвърди диференциални уравнения ');
disp(' 1. ode45 - средна точност; ');
disp(' 2. ode23 - ниска точност; ');
disp(' 3. ode113 - от ниска до висока. ');
disp(' ');
disp(' B. Твърди диференциални уравнения ');
disp(' 1. ode15s - от ниска до висока; ');
disp(' 2. ode23s - ниска точност; ');
disp(' 3. ode23t - средна точност; ');
disp(' 4. ode23tb - ниска точност. ');
disp(' ');
solver = input(' Името на избрания Solver: ','s');

- 144 -
Глава 6. Динамика на механични системи

% Интегриране на диференциалното уравнение


eval(['[t,y] = feval(solver,eval([''@'',fname]),',...
'[0 Tend],y0,options',parameters,');']);
% Начертаване на графиките
tmin = min(t); tmax = max(t);
for i = 1:2
j = num2str(i);
y1min = min(y(:,i));
y1max = max(y(:,i));
y2min = min(y(:,i+2));
y2max = max(y(:,i+2));
dy1 = y1max - y1min;
dy2 = y2max - y2min;
xmin = y1min - 0.1*dy1;
xmax = y1max + 0.1*dy1;
ymin = y2min - 0.1*dy2;
ymax = y2max + 0.1*dy2;
% Обобщена координата qi
figure % 1
comet(t,y(:,i))
plot(t,y(:,i),[tmin tmax],[0 0],'k'), grid on
axis([tmin, tmax, xmin, xmax]);
set(gca,'FontName','Arial Cyr','FontSize',12);
title(['Закон на движение {\itq}',j,' = {\itq}',j,'({\itt})'])
xlabel('{\itt}'); ylabel(['{\itq}',j]); pause
% Обобщена скорост qti
figure % 2
comet(t,y(:,2+i))
plot(t,y(:,2+i),[tmin tmax],[0 0],'k'), grid on
axis([tmin, tmax, ymin, ymax]);
set(gca,'FontName','Arial Cyr','FontSize',12);
title(['Обобщена скорост {\it qt}',j,' = {\it qt}',j,'({\itt})'])
xlabel('{\itt}'); ylabel(['{\it qt}',j]); pause
% Координата и скорост
figure % 3
subplot(2,1,1), plot(t,y(:,i),[tmin tmax],[0 0],'k'),grid on
axis([tmin, tmax, xmin, xmax]);
set(gca,'FontName','Arial Cyr','FontSize',12);
title(['Закон на движение {\itq}',j,' = {\itq}',j,'({\itt})'])
subplot(2,1,2), plot(t,y(:,2+i),[tmin tmax],[0 0],'k'),grid on
axis([tmin, tmax, ymin, ymax]);
set(gca,'FontName','Arial Cyr','FontSize',12);
title(['Обобщена скорост {\it qt}',j,' = {\it qt}',j,'({\itt})'])
pause
% Фазова траектория
figure % 4
subplot(1,1,1)
comet(y(:,i),y(:,2+i))
plot(y(:,i),y(:,2+i), [xmin,xmax],[0 0],'k',...
[0 0],[ymin,ymax],'k'), grid on
axis([xmin, xmax, ymin, ymax]);
set(gca,'FontName','Arial Cyr','FontSize',12);
title([' Фазова траектория {\it qt}',j,' = {\itf}({\itq}',j,')'])
xlabel(['{\itq}',j]), ylabel(['{\it qt}',j]), pause
flag2 = 1;
close all
end
disp(' ');
ans = input(' Желаете ли продължение? (Y/N): ','s');
if ans == 'n' | ans == 'N', break, end
end
% **************** Край на програма LAGRE2 *****************
- 145 -
Приложение на MATLAB в инженерните изследвания – част II

Пример 6.7
Да се изследва движението на т.н. елиптично махало (фиг. 6.32),
състоящо се от плъзгач 1 с маса m1 и топче 2 с маса m2 , свързано
шарнирно към плъзгача с помощта на безтегловен прът с дължина l .
Към плъзгача, движещ се праволинейно по хоризонтална идеално
гладка равнина, е свързана пружина с константа c и линеен демпфер с
коефициент на съпротивление α. Между пръта и плъзгача е монтиран
демпфер с коефициент на съпротивление k , създаващ съпротивителен
момент M R = kϕ& .

Решение:
Системата има две степени на
свобода. За обобщени коор-
динати избираме премества-
нето x на плъзгача, отчитано
от положението, в което пружи-
ната е недеформирана, и ъгло-
вото отклонение ϕ на пръта от
долното му вертикално поло-
жение.

Фиг. 6.32. Елиптично махало


Кинетичната енергия на системата е :

1 1
EК = m1 x& 2 + m2 va2 =
2 2
1 1
= m1 x& 2 + m2 ( x& 2 + l 2ϕ& 2 + 2lx&ϕ& cos ϕ )
2 2
Определяме потенциалната енергия :

1 1
E П = c x 2 − m2 g h = c x 2 − m2 g l cos ϕ
2 2
Накрая получаваме израза за Лагранжиана :

1 1 1
L = ( m1 + m2 ) x& 2 + m2l 2ϕ& 2 + m2lx&ϕ& cos ϕ − cx 2 + m2 gl cos ϕ
2 2 2
- 146 -
Глава 6. Динамика на механични системи

Обобщените непотенциални сили са :

Q1неп = − R = −α x&
Q2неп = − M R = − kϕ&
Приготвяме файла с входните данни, показан по-долу:
% -------------------------------------------------
% Файл с данни DMAH2
% Елиптично махало
% -------------------------------------------------
L = ['1/2*(m1+m2)*qt1^2 + 1/2*m2*l^2*qt2^2 + ',...
'm2*l*qt1*qt2*cos(q2) - 1/2*c*q1^2 + ',...
'9.81*m2*l*cos(q2)']; % Лагранжиан
QN1 = '-alfa*qt1'; % Обобщени непотенциални
QN2 = '-k*qt2'; % сили
qj0 = [0.02, 0]; % Начални координати
qtj0 = [0.1, 0]; % Начални скорости
Tend = 2; % Горна граница на интегриране
eps = 1e-10; % Желана точност
np = 6; % Брой на параметрите
P{1} = 'm1'; % Маса на плъзгача
P{2} = 'm2'; % Маса на пръта
P{3} = 'l'; % Дължина на пръта
P{4} = 'c'; % Пружинна константа
P{5} = 'alfa'; % Коефициент на демпфиране на плъзгача
P{6} = 'k'; % Коефициент на демпфиране на пръта
Част от резултатите от изпълнението на програмата, за стойности
на параметрите m1 = 1 , m2 = 1 , l = 0.4 , c = 200 , α = 0.5 и k = 0.6 , са
представени на фиг. 6.33 – 6.36.

Закон на движение q1 = q1(t) Фазова траектория qt1 = f(q1)

0.02 0.1

0.015 0.05

0
0.01
qt1

-0.05
q1

0.005

-0.1
0

-0.15
-0.005
-0.2
-0.01

0 0.5 1 1.5 2 -0.01 -0.005 0 0.005 0.01 0.015 0.02


t q1

Фиг. 6.33 Фиг. 6.34

- 147 -
Приложение на MATLAB в инженерните изследвания – част II

Закон на движение q2 = q2(t) Фазова траектория qt2 = f(q2)


0.08 0.6

0.06 0.4

0.04 0.2

qt2
q2

0
0.02

-0.2
0

-0.4
-0.02
-0.6
0 0.5 1 1.5 2 -0.02 0 0.02 0.04 0.06 0.08
t q2

Фиг. 6.35 Фиг. 6.36


Това са изведените от програмата диференциални уравнения:
(m1+m2)*qtt1-m2*l*qt2^2*sin(q2)+m2*l*cos(q2)*qtt2+c*q1+alfa*qt1 = 0
m2*l*cos(q2)*qtt1+m2*l^2*qtt2+9.81*m2*l*sin(q2)+k*qt2 = 0
А ето и генерираната от LAGRE2 файл-функция:
function yt = felmah(t,y,m1,m2,l,c,alfa,k)
% Динамика на елиптично махало
% Инерционна матрица A
A(1,1) = m1+m2;
A(1,2) = m2*l*cos(y(2));
A(2,1) = m2*l*cos(y(2));
A(2,2) = m2*l^2;
% Десни части на ДУ
b(1) = m2*l*y(4)^2*sin(y(2))-c*y(1)-alfa*y(3);
b(2) = -9.81*m2*l*sin(y(2))-k*y(4);
% Първи производни
a = A\b';
yt(1) = y(3);
yt(2) = y(4);
yt(3) = a(1);
yt(4) = a(2);
yt = yt';
% *** Край на файл-функцията felmah ***
6.8. Уравнения на Лагранж за система с произволен брой
степени на свобода
Диференциалните уравнения на движение на холономна механич-
на система с нестационарни връзки и произволен брой степени на
свобода могат да се съставят с помощта на уравненията на Лагранж

d ⎜⎛ ∂L ⎞ ∂L
⎟− неп
= Q , j = 1, 2, 3, ..., s
dt ⎜⎝ ∂q& j ⎟ ∂q j
⎠ j

- 148 -

You might also like