Witam serdecznie,
Próbuję rozwiązać zagadnienie drgania belki z trzeba masami. W zasadzie rozwiązałem je nieco okrężną drogą bo coś numpy.linalg.eig nie daje mi w tym przypadku właściwych wyników.
Kod:
import numpy as np
import matplotlib.pyplot as plt
K = [
[1.5e07,3.4e08,-4.4e06,3.4e08,0.0,0.0],
[3.4e08,3.6e10,-3.4e08,1.8e10,0.0,0.0],
[-4.4e06,-3.4e08,8.9e06,0.0,-4.4e06,3.4e08],
[3.4e08,1.8e10,0.0, 7.2e10,-3.4e08,1.8e10],
[0.0,0.0,-4.4e06,-3.4e08,1.5e07,-3.4e08],
[0.0,0.00,3.4e08,1.8e10,-3.4e08,3.6e10]
]
M = np.mat([[113.2,0,0,0,0,0],[0,0,0,0,0,0],[0,0,201.8,0,0,0],[0,0,0,0,0,0],[0,0,0,0,88.6,0],[0,0,0,0,0,0]])
print(M)
A = np.linalg.pinv(M)*K
lbd, vect = np.linalg.eig(A)
for i in range(3):
print('Natural frequency from linalg.eig:')
print(np.power(lbd[i],0.5)/2.0/np.pi)
a=[]
b=[]
for i in range (0,500,1):
a.append(i/2.0/np.pi)
b.append(np.linalg.det(K-i*i*M))
plt.axis([0,500/2.0/np.pi,-100,1000])
plt.plot(a,b,'r',[0,500/2.0/np.pi],[0,0],'b')
plt.show()
Powyższy kod najpierw rozwiązuje macierzowy układ równań i podaje wartości własne (np.linalg.eig(M^-1*K)), a potem rozwiązuje zadanie inaczej - drukując wartości wyznacznika macierzy (np.linalg.det(K-i’*i’*M)).
Problem polega na tym, że np.linalg.det(K-i’*i’M) plotuje właściwe wartości własne natomiast np.linalg.eig(M^-1K) daje wartości dość sensowne, lecz zdecydowanie inne.
Prawidłowy wynik z np.linalg.det(K-i’*i’M):
Nieprawidłowe wartości z np.linalg.eig(M^-1K):
Zużyłem już wiele godzin swojego czasu sprawdzając czy poszczególne operacje wykonują się prawidłowo. Nigdzie nie widzę problemu w moim podejściu. Wcześniej rozwiązałem bardzo podobne zadanie jeszcze inną metodą, lecz wykorzystując tą samą funkcję np.linalg.eig(A) i wyniki były prawidłowe.
Będę wdzięczny za pomoc.
Pozdrawiam serdecznie,
Sheaker