Я пытаюсь вычислить собственные значения λ (lambda
) демпфированной структуры по следующим уравнениям движения:
(λ² M + λ C + K) x= 0 0,
где M, C и K являются разреженными матрицами. Использование функции MATLAB polyeig
работает, но я хотел бы перейти к более крупным системам и воспользоваться преимуществами разреженности моих матриц. Я использовал линеаризацию пространства состояний для получения обобщенной задачи на собственные значения следующим образом:
(A - λ B) z= 0 0,
с
A= [K, 0 0; 0 0, -M],
B= [-C, -M; -M, 0 0],
z= [x; λ х]
Решаем это с помощью функции MATLAB eigs
:
lambda = eigs(A,B,10,'sm')
Создает следующий вывод:
lambda =
1.0e+03 *
-0.2518 - 1.3138i
-0.2518 + 1.3138i
-0.4690 - 1.7360i
-0.4690 + 1.7360i
-0.4690 - 1.7360i
-0.4690 + 1.7360i
-0.5387 - 1.8352i
-0.5387 + 1.8352i
NaN + NaNi
NaN + NaNi
Первые восемь собственных значений верны, но кажется, что последние два собственных значения не смогли сходиться. Увеличение количества базисных векторов Ланцоша, похоже, не решает проблему.
Как ни странно, увеличение числа вычисляемых собственных значений (k
) позволяет сходиться все большему количеству собственных значений:
k = 10
: Количество лямбд сходится = 8k = 20
: количество лямбд сходится = 8k = 50
: количество лямбд сходится = 8k = 100
: количество лямбд сходится = 20k = 120
: количество лямбд, сходящихся = 80k = 150
: количество лямбд, сходящихся = 150
Также стоит упомянуть, что многие из собственных значений, которые не сходятся с более низкими значениями k
, выглядят вырожденными или, по крайней мере, очень близко расположенными.
Мне было интересно, если кто-нибудь может придумать объяснение этого поведения? Если да, то есть ли способ заставить все собственные значения сходиться, не делая k
очень большим? Спасибо!