Układ równań metodą macierzową (w python...)

Przestrzenie wektorowe, bazy, liniowa niezależność, macierze.... Formy kwadratowe, twierdzenia o klasyfikacji...
Sh3aker
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 22 lut 2016, o 16:41
Płeć: Mężczyzna
Lokalizacja: Daleko

Układ równań metodą macierzową (w python...)

Post autor: Sh3aker »

Witam serdecznie po długiej przerwie.

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
- tutaj cały background.

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
ODPOWIEDZ