"M должно представлять действительную симметричную матрицу, если A действительна, и должна представлять комплексную эрмитову матрицу, если A комплексна. Для достижения наилучших результатов тип данных M должно быть таким же, как у A" (https://docs.scipy.org/doc/scipy/refere ... inalg.eigs).
Я это нужно для решения виброакустической задачи конечных элементов. Который будет иметь описание матрицы формы матрицы для виброакустической задачи.
Я использую компьютер с Windows.
ev, phi = scipy.sparse.linalg. eigs(A=жесткий, k=nev, M=mass, that='SM')
ev, phi = scipy.sparse.linalg.eigs(A=жесткий, k=nev, M=mass, sigma=0)
До реализации функции не работают для несимметричных задач.
Матрицы разрежены.
Код Matlab:
Код: Выделить всё
k = load('k_global.mat');
m = load('m_global.mat');
[V,D] = eigs(k.array, m.array, 20,0);
D = diag(D)
natural_frequency = sqrt(D)/(2*pi)
Код: Выделить всё
0.00000000000000 + 0.000356591992067188i
0.000668911454165071 + 0.00000000000000i
0.00000000000000 + 0.000973128785222090i
0.00222975851379527 + 0.00000000000000i
0.00246434216130016 + 0.00000000000000i
0.00000000000000 + 0.00372951940564144i
8.06883871646537 + 0.00000000000000i
64.7482150103242 + 0.00000000000000i
234.453670549319 + 0.00000000000000i
268.154072409059 + 0.00000000000000i
312.537263749716 + 0.00000000000000i
356.103849178590 + 0.00000000000000i
389.038117338274 + 0.00000000000000i
412.048267727649 + 0.00000000000000i
473.729345964820 + 0.00000000000000i
2996.35112385098 + 0.00000000000000i
3240.96766107255 + 0.00000000000000i
4186.42444133727 + 0.00000000000000i
4585.99172192305 + 0.00000000000000i
4794.52737053778 + 0.00000000000000i
Код: Выделить всё
import pickle
import scipy
import numpy as np
if __name__ == '__main__':
with open('../k_full.pickle', 'rb') as f:
print('loading matrix K')
k_global = pickle.load(f)
with open('../m_full.pickle', 'rb') as f:
print('loading matrix M')
m_global = pickle.load(f)
eigvalues, eigvectors = scipy.sparse.linalg.eigs(k_global, M=m_global, k = 20, which='SM')
natural_frequency_Hz = np.sqrt(np.abs(eigvalues))/(2*np.pi)
for i, nat_freq in enumerate(natural_frequency_Hz):
print(f'[{i + 1: 3.0f}] : Freq = {nat_freq: 8.2f}')
Код: Выделить всё
scipy.sparse.linalg._eigen.arpack.arpack.ArpackNoConvergence: ARPACK error -1: No convergence (321 iterations, 4/20 eigenvectors converged)
https://pastebin.com/Ri0rebyt
Массаhttps://pastebin.com/mPKnTt8A
Подробнее здесь: https://stackoverflow.com/questions/793 ... ver-python
Мобильная версия