- •Конкретні числові значення параметрів
- •Теоретична частина Роль імітаційного моделювання в дослідженні складних технічних систем
- •Перевага над іншими видами моделювання
- •Практична частина Постановка завдання:
- •Перетворення рівнянь:
- •Лістинг програми:
- •В результаті виконання програми отримуємо наступні графіки:
- •Висновок:
- •Використана література:
Перетворення рівнянь:
Спочатку, для підготовки диференційних рівнянь до чисельного інтегрування, необхідно привести ці рівняння до нормальної форми Коші. Бажано подати також їх у безрозмірному вигляді.
Спочатку введемо позначення: y1 = φ; у2 =
Тоді початкове рівняння маятника можна подати у вигляді двох диференційних рівнянь 1-го порядку:
Порівнюючи одержану систему з загальною формою рівнянь Коші, можна зробити висновок, що
Саме обчислення цих двох функцій і повинно відбуватися у процедурі правих частин.
Вихідною змінною у ній буде параметр z=[z1 z2]
Вхідними - момент часу t та вектор-рядок у=[у1 у2]
Винесемо обчислення моментів зовнішніх дій у окрему обчислювану процедуру для того щоб зробити процедуру правих частин більш загальною, а також для більшої зручності, оскільки дозволяє скоротити кількість параметрів.
Згрупуємо разом обчислювання зовнішніх моментів сил, окрім моменту сил тяжіння. Для цього спочатку дещо перетворимо початкове рівняння, записуючи його у вигляді:
де крапка - позначення похідної за безрозмірним часом τ=ω0⋅t
а через S(τ,φ,) позначено деяку задану функцію безрозмірного часу, кута повороту маятника та його безрозмірної швидкості
У нашому випадку ця функція набуває вигляду:
причому безрозмірні величини ζ і ν визначаються виразами:
ζ= та ν=
Схема алгоритму програми моделювання руху маятникового датчика кута у загальному вигляді:
Лістинг програми:
%FizMayatnik
k=menu('Що далі робити?','Закінчити роботу','Продовжити роботу');
if k==1,
while k==1
k=menu('Що далі робити?','Закінчити роботу','Продовжити роботу');
end
end
clear global
clear
%zastav
sprogram='Курсач.m';
sname='Al1n04ka';
KM1=[0 0 0 0 0 0]
MPFUN='MomFm1';
global KM1 MPFUN
tfinal=2*pi*5;
fi0=pi/180;
fit0=0.8;
%Діалогова зміна даних
k=1
while k<10
disp('')
disp('Зараз встановлено')
disp([sprintf('Початковий кут,град=%g',...
fi0*180/pi),...
sprintf('початкова швидкість=%g',fit0)]),...
disp(sprintf('Число періодів=%g',tfinal/2/pi))
KM1
k=menu('Що змінювати?',...)
sprintf('Відносний коеф.затухання=%g',KM1(1)),...
sprintf('Перезавантаження вертикаль=%g',KM1(2)),...
sprintf('Перезавантаження-горизонталь=%g',KM1(3)),...
sprintf('Відносна частота=%g',KM1(4)),...
sprintf('fфаза-вертикаль=%g',KM1(5)),...
sprintf('фаза-горизонталь=%g',KM1(6)),...
sprintf('Початковий кут,град=%g',fi0*180/pi),...
sprintf('Початкова швидкість=%g',fit0),...
sprintf('кіл.періодів=%g',tfinal/2/pi),...
'Нічого не змінювати.');
disp('')
if k<7,
KM1(k)=input(['сейчас KM1',num2str(k),sprintf('=%g',KM1(k)),...
'Введіть нове значення=']);
%fi0=fi0*180/pi),...
%j 'Введіть нове значення=');
elseif k==8, fit0=input([sprintf('Зараз fit0=%g',fit0),'Нове значення=']);
elseif k==9, tfinal=input([sprintf('Зараз кількість періодів=%g',tfinal/2/pi),'Нове значення=']);
tfinal=tfinal*2*pi;
end
end
%fizmatglav
%1, Підготовка початкових умов
t=0;
tf=tfinal;
y0=[fi0 fit0];
options=odeset('RelTol',1e-8,'AbsTol',[1e-10]);
%2.Організація циклу інтегрування
[t,y]=ode45('iks1',[0 tf], y0, options);
%3. Вивід графіків
subplot(2,1,2);
plot(t/2/pi,y(:,1)*180/pi),grid;
title('Відхилення від вертикалі','FontSize',16);
xlabel('Час в періодах малих власних коливань','Fontsize',14);
ylabel('Кут в градусах','FontSize',14);
subplot(2,4,1:2);
plot(y(:,1)*180/pi,y(:,2)),grid on;
title('Фазова траєкторія','FontSize',16);
xlabel('Кут в градусах','FontSize',14);
ylabel('Швидкість','FontSize',14);
subplot(2,4,3:4);
axis('off');
h1=text(0,1.1,'Моделювання руху фізичного маятника','FontSize',16,'FontWeight','Bold')
h1=text(0.15,1,'з рівняння','FontSize',14);
h1=text(0,0.9,'fi"+2*dz*fi`+[1+nmy*sin(nu*t+ey)]*sin(fi)=','FontSize',16);
h1=text(0.375,0.8,'=-nmx*sin(nu*t+ex)*cos(fi)','FontSize',16);
h1=text(0,0.7,'з таких значень параметрів:','FontSize',14);
h1=text(0.4,0.1,sprintf('dz=%g',KM1(1)),'FontSize',14);
h1=text(0,0.5,sprintf('nmy=%g',KM1(2)),'FontSize',14);
h1=text(0.7,0.5,sprintf('nmx=%g',KM1(3)),'FontSize',14);
h1=text(0,0.4,sprintf('ey=%g',KM1(5)),'FontSize',14);
h1=text(0.7,0.4,sprintf('ex=%g',KM1(6)),'FontSize',14);
h1=text(0.45,0.3,sprintf('nu=%g',fit0),'FontSize',14);
h1=text(0,0.2,'з початкових умов KM1(6)','FontSize',14);
h1=text(0,0.1,[sprintf('fi(0)=%g',fi0*180/pi),'градусів'],'FontSize',14);
h1=text(0.7,0.1,sprintf('fi''(0)=%g',KM1(4)),'FontSize',14);
function z=iks1(t,y)
global MPFUN
z(1)=y(2)
z(2)=-sin(y(1))+feval(MPFUN,t,y);z=z'
function m=MomFm1(t,y)
global KM1
m=-2*KM1(1)*y(2)-KM1(3)*sin(KM1(4)*t+KM1(6))...
*cos(y(1))-KM1(2)*sin(KM1(4)*t+KM1(5))*sin(y(1))