Обобщенный несимметричный собственный решатель PythonPython

Программы на Python
Ответить
Anonymous
 Обобщенный несимметричный собственный решатель Python

Сообщение Anonymous »

Как решить несимметричную собственную задачу. С точки зрения scipy.sparse.linalg.eigsh матрица должна быть «действительной симметричной квадратной матрицей или комплексной эрмитовой матрицей A» (https://docs.scipy.org/doc/scipy/refere ... rse.linalg .eigsh.html). и то же самое для scipy.sparse.linalg.eigs.
"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
Код Python:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»