W ramach poszerzania wiedzy z zakresu inżynierii mechanicznej skupiłem się ostatnio na temacie drgań. Zacząłem rozwiązywać układ o dwóch stopniach swobody. Wygląda to mniej więcej tak:
\begin{equation*}
M=
\begin{bmatrix}
m1 & 0\\
0 & m2\\
\end{bmatrix}
\end{equation*}
\begin{equation*}
K=
\begin{bmatrix}
k1+k2 & -k2\\
-k2 & k2\\
\end{bmatrix}
\end{equation*}
Równanie ruchu ma postać:
\begin{equation*}
M\ddot{x}+Kx=0
\end{equation*}
Zakładam rozwiązanie
\begin{equation*}
X=X_0cos\left( \omega t\right)
\end{equation*}
Różniczkuję dwa razy, podstawiam pod równanie ruchu i dzielę przez:
\begin{equation*}
X_0cos\left( \omega t\right)
\end{equation*}
I jeszcze zakładam:
\begin{equation*}
\lambda=\omega^2
\end{equation*}
Otrzymuję więc:
\begin{equation*}
M\lambda-K=0
\end{equation*}
Rozwiązania można poszukiwać na dwa sposoby:
1. Robiąc wykres wyznacznika powyższego równania w funkcji lambda i szukając miejsc zerowych.
2. "Rozwiązując" układ równań pomnożony przez
\begin{equation*}
M^\left( -1\right)
\end{equation*}
W skrócie:
\begin{equation*}
\mathbb{1}\lambda=M^\left( -1\right)K
\end{equation*}
Ok. Napisałem więc program w pythonie, który tworzy końcową macierz
\begin{equation*}
M^\left( -1\right)K
\end{equation*}
a następnie rozwiązuje ją przy pomocy 'numpy.linalg.eig'
Kod: Zaznacz cały
https://numpy.org/doc/stable/reference/generated/numpy.linalg.eig.html
To działa świetnie dla przypadku 2D oraz dla przypadku 3D. (Tak naprawdę wszystko robiłem jako 3DOF ale dla ułatwienia zapisu zrobiłem to na forum jako 2DOF.)
Następnie to samo zadanie spróbowałem rozwiązać wykorzystując nieco inną metodę z macierzą sztywności belki.
Kod: Zaznacz cały
https://en.wikipedia.org/wiki/Euler%E2%80%93Bernoulli_beam_theory
Ogólnie różnica polega na tym, że układ 3 mas rozwiązujemy jako 6DOF, gdzie uwzględniamy przemieszczenia mas oraz obroty belki. (na które nie działa masa tylko sztywność samej belki)
W efekcie moja macierz mas wygląda następująco:
\begin{equation*}
M=
\begin{bmatrix}
m1 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & m2 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & m3 & 0\\
0 & 0 & 0 & 0 & 0 & 0\\
\end{bmatrix}
\end{equation*}
Natomiast macierz sztywności jest tego samego rozmiaru tylko jest 'pełna'. Ze względu na swoją skomplikowaną naturę nie jest ona zapisana.
Jestem wstanie w pythonie policzyć właściwie wszystko do czasu powstania równania:
\begin{equation*}
M\lambda-K=0
\end{equation*}
lub w drugim przypadku do czasu powstania macierzy:
\begin{equation*}
M^\left( -1\right)K
\end{equation*}
I teraz jest problem, bo gdy wyznacznik równania wykreślę dla różnych wartości omega w poszukiwaniu miejsc zerowych, to otrzymuję właściwe wartości częstotliwości drgań własnych. Jednak gdy próbuję 'rozwiązać'
\begin{equation*}
M^\left( -1\right)K
\end{equation*}
przy pomocy numpy.linalg.eig wyniki są po prostu złe.
I teraz po tym bardzo długim wstępie przechodzimy do mojego pytania: Czy z jakiegoś powodu matematyczne podejście nie jest właściwe w tym ostatnim przypadku?
Pozdrawiam serdecznie,
Sheaker