Zadanie 1.1
Dany jest system mechaniczny o jednym stopniu swobody, dla którego równanie dynamiczne ruchu:
Mając zadane parametry systemu:
- Masa: [],
- Tłumienie: [],
- Sztywność sprężyny: [].
Należało wyznaczyć:
- Częstotliwość drgań własnych: [],
- Bezwymiarowy współczynnik tłumienia: ,
- Stosunek amplitud wierzchołków kolejnych oscylacji: .
W tym celu skorzystałem z poniższych zależności:
gdzie to tłumienie krytyczne, dane jako: Dodatkowo, dla systemów oscylujących ():
Kod programu:
M = 1; % Masa
C = pi; % Tłumienie
K = 1089*(pi^2); % Sztywność sprężyny
Cc=2*M*sqrt(K/M); % Tłumienie krytyczne
f=sqrt(K/M)/(2*pi); % Częstotliwość własna
Xi=C/Cc; % Bezwymiarowy współczynnik tłumienia
X01=exp(2*pi*Xi); % Stosunek kolejnych amplitud
disp('f = '); disp(f)
disp('ξ = '); disp(Xi)
disp('x0/x1 = '); disp(X01)
Wynik działania programu:
f =
16.5000
ξ =
0.0152
x0/x1 =
1.0999
Zadanie 1.2
Następnie należało sprawdzić wyniki uzyskane w zadaniu 1.1 metodą numeryczną. W tym celu utworzyłem model w Simulinku układu mechanicznego opisanego równaniem (1), wymuszonego impulsem o amplitudzie 1, przy częstotliwości próbkowania .
Schemat modelu:
Kod programu:
Fs = 1000; % Częstotliwość próbkowania
M = 1; % Masa
C = pi; % Tłumienie
K = 1089*(pi^2); % Sztywność sprężyny
% Symulacja układu:
out = sim('Lab6_model_1_2023');
t=out.tout; % Wektor czasu
x=out.Displacement.Data; % Przemieszczenie
% Szukanie pierwszych dwóch wierzchołków:
[x_peaks,location]=findpeaks([0,x'],'NPEAKS',2);
X01=x_peaks(1)/x_peaks(2); % Stosunek kolejnych amplitud
Xi=log(X01)/(2*pi); % Bezwymiarowy współczynnik tłumienia
% Widmo amplitudowe:
N = length(x); % Ilość próbek
X = fft(x); % FFT z sygnału (x)
df = Fs/N; % Rozdzielczość
f_vec = (0:(N-1))*df; % Wektor częstotliwości
X_amp = abs(X); % Amplituda
% Znormalizowana amplituda:
X_amp_norm = X_amp/N*2; X_amp_norm(1)=X_amp_norm(1)/2;
% Szukanie częstotliwości własnej:
[A_peaks,Location]=findpeaks([0,X_amp_norm'],'NPEAKS',1);
f=f_vec(Location); % Częstotliwość własna
figure(1)
subplot(2,1,1)
plot(t,x)
xlabel('Czas [s]');
ylabel('Przemieszczenie [m]');
title("Przebieg czasowy")
subplot(2,1,2)
plot(f_vec,X_amp_norm)
xlabel('Częstotliwość [Hz]');
ylabel('Amplituda');
title("Jednostronne widmo amplitudowe")
xlim([0 Fs/20])
disp('f = '); disp(f)
disp('ξ = '); disp(Xi)
disp('x0/x1 = '); disp(X01)
Wynik działania programu:
f =
16.5983
ξ =
0.0150
x0/x1 =
1.0989
Przy pomocy funkcji
findpeaksjestem w stanie znaleźć wartości amplitud pierwszych dwóch wierzchołków. Następnie tworzę jednostronne widmo amplitudowe, z którego odczytuję częstotliwość własną.
Warto zauważyć, że identyczny wynik można było uzyskać korzystając z Toolbox’a SimScape, przy czym należy pamiętać o odwróceniu kierunku wymuszenia lub znaku zbieranych odpowiedzi.
Schemat modelu:
Porównanie wyników:
| Simulink: |
|---|
| SimScape: |
Zadanie 2
W tym zadaniu należało znaleźć taką wartość parametru tłumienia C, aby stosunek amplitud wierzchołków kolejnych oscylacji był równy 2, dla systemu mechanicznego z zadania 1.1.
Przekształcając wzór (4): Korzystam z własności logarytmu: A więc: Wstawiając wartość 2 za oraz wzór (3) za : Ostatecznie: Kod programu:
Fs = 1000; % Częstotliwość próbkowania
M = 1; % Masa
C = 33*log(2); % Tłumienie
K = 1089*(pi^2); % Sztywność sprężyny
out = sim('Lab6_model_1_2023');
t=out.tout; % Wektor czasu
x=out.Displacement.Data; % Przemieszczenie
[x_peaks,location]=findpeaks([0,x'],'NPEAKS',2);
% Położenie znaczników:
t1=t(location(1));
t2=t(location(2));
x1=x_peaks(1);
x2=x_peaks(2);
figure(1)
plot(t,x)
hold on
% Dodaj znaczniki:
plot(t1,x1,'_','MarkerSize',30,'MarkerEdgeColor','red','MarkerFaceColor',[1 .6 .6])
plot(t2,x2,'_','MarkerSize',30,'MarkerEdgeColor','red','MarkerFaceColor',[1 .6 .6])
xlabel('Czas [s]');
ylabel('Przemieszczenie [m]');
title('Przemieszczenie w czasie')
xlim([0,1])
hold off
Wynik działania programu:
Jak widać, dobrana wartość parametru C jest odpowiednia, gdyż stosunek jest równy w przybliżeniu 2.
Zadanie 3
W tym zadaniu należało wykorzystać model z zadania 1.2 do uzyskania funkcji odpowiedzi impulsowej (ang. Impulse Response Function - IRF), po czym powtórzyć symulację dla wymuszenia białym szumem. Na koniec trzeba było porównać wynik splotu IRF z białym szumem oraz odpowiedź systemu na wymuszenie białym szumem.
Schemat modelu:
Kod programu:
Fs = 1000; % Częstotliwość próbkowania
M = 1; % Masa
C = pi; % Tłumienie
K = 1089*(pi^2); % Sztywność sprężyny
out = sim('Lab6_model_1_2023');
t=out.tout; % Wektor czasu
IRF=out.Displacement.Data; % Funkcja odpowiedzi impulsowej [1]
out = sim('Lab6_model_3_2023');
x2=out.Wymuszenie.Data; % Wektor wymuszenia [2]
x3=out.Odp_Systemu.Data; % Odpowiedź systemu [3]
g=conv(IRF,x2); % Splot IRF z wymuszeniem
figure(1)
subplot(2,1,1)
plot(t,g(1:length(x3)))
xlabel('Czas [s]');
ylabel('Amplituda [-]');
title('Splot IRF z wymuszeniem drugiej symulacji')
subplot(2,1,2)
plot(t,x3)
xlabel('Czas [s]');
ylabel('Amplituda [-]');
title('Odpowiedź systemu w drugiej symulacji')
Wynik działania programu:
Jak widać, uzyskane wykresy są identyczne, co się zgadza z teorią, gdyż odpowiedź systemu na wymuszenie można uzyskać na dwa sposoby:
- Poprzez symulację układu:
- Poprzez splot wymuszenia z IRF:
Zadanie 4
W tym zadaniu należało utworzyć model systemu mechanicznego o dwóch stopniach swobody, opisanego równaniami:
Zadane parametry:
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [].
Schemat modelu:
Zadanie 5
W tym zadaniu należało utworzyć model systemu mechanicznego o 10 stopniach swobody. Parametry identyczne jak w zadaniu 1.2.
Schemat modelu:
Zadanie 6
W tym zadaniu należało wykonać symulacje modelu z zadania 5, po czym wykreślić przebiegi czasowe i ich widma amplitudowo-częstotliwościowe dla wybranej masy. Na koniec należało odczytać częstotliwości rezonansowe badanego układu.
Dane:
- Czas pierwszej symulacji: ,
- Czas drugiej symulacji: ,
- Częstotliwość próbkowania: .
Kod programu:
A = 10000; % Amplituda wymuszenia
Fs = 1000; % Częstotliwość próbkowania
M = 1; % Masa
C = pi; % Tłumienie
K = 1089*(pi^2); % Sztywność sprężyny
simTime1=100; % Czas symulacji
simTime2=1;
out = sim('Lab6_model_10DOF_2023', "StopTime",'simTime1');
t1=out.tout; % Wektor czasu
x1=out.M10; % Masa 10
N1 = length(x1); % Ilość próbek
X1 = fft(x1); % FFT z sygnału
df1 = Fs/N1; % Rozdzielczość
f_vec1 = (0:(N1-1))*df1; % Wektor częstotliwości
X1_amp = abs(X1); % Amplituda
X1_amp_norm = X1_amp/N1*2; X1_amp_norm(1)=X1_amp_norm(1)/2;
out = sim('Lab6_model_10DOF_2023', "StopTime",'simTime2');
t2=out.tout; % Wektor czasu
x2=out.M10; % Masa 10
N2 = length(x2); % Ilość próbek
X2 = fft(x2); % FFT z sygnału
df2 = Fs/N2; % Rozdzielczość
f_vec2 = (0:(N2-1))*df2; % Wektor częstotliwości
X2_amp = abs(X2); % Amplituda
X2_amp_norm = X2_amp/N2*2; X2_amp_norm(1)=X2_amp_norm(1)/2;
figure(1)
subplot(2,1,1)
plot(t1,x1)
xlabel('Czas [s]');
ylabel('Przemieszczenie masy 1 [m]');
title('t=100 s')
subplot(2,1,2)
semilogy(f_vec1,X1_amp_norm)
xlim([0 50])
xlabel('Częstotliwość [Hz]')
ylabel('Amplituda')
title('Jednostronne widmo amplitudowe w skali logarytmicznej dla t=100 s')
figure(2)
subplot(2,1,1)
plot(t2,x2)
xlabel('Czas [s]');
ylabel('Przemieszczenie masy 1 [m]');
title('t=1 s')
subplot(2,1,2)
semilogy(f_vec2,X2_amp_norm)
xlim([0 50])
xlabel('Częstotliwość [Hz]')
ylabel('Amplituda')
title('Jednostronne widmo amplitudowe w skali logarytmicznej dla t=1 s')
[X1_peakValue,X1_location]=findpeaks([0,X1_amp_norm'],'NPEAKS',8);
ResonanceFreq_1=f_vec1(X1_location(1:end));
disp('Częstotliwości rezonansowe dla t=100 s:'); disp(ResonanceFreq_1)
[X2_peakValue,X2_location]=findpeaks([0,X2_amp_norm'],'NPEAKS',8);
ResonanceFreq_2=f_vec2(X2_location(1:end));
disp('Częstotliwości rezonansowe dla t=1 s:'); disp(ResonanceFreq_2)
Wynik działania programu:
Częstotliwości rezonansowe dla t=100 s:
2.4800 7.3499 12.0699 16.5298 20.6498 24.3598 27.5397 30.0497
Częstotliwości rezonansowe dla t=1 s:
2.9970 7.9920 12.9870 17.9820 21.9780 25.9740 28.9710 30.9690
Jak widać, dla czasu symulacji , rozdzielczość jest zbyt mała, aby częstotliwości rezonansowe zostały odczytane poprawnie.