Matlab eigs не сходится, если количество вычисленных собственных значений велико

Я пытаюсь вычислить собственные значения λ (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: Количество лямбд сходится = 8
  • k = 20: количество лямбд сходится = 8
  • k = 50: количество лямбд сходится = 8
  • k = 100: количество лямбд сходится = 20
  • k = 120: количество лямбд, сходящихся = 80
  • k = 150: количество лямбд, сходящихся = 150

Также стоит упомянуть, что многие из собственных значений, которые не сходятся с более низкими значениями k, выглядят вырожденными или, по крайней мере, очень близко расположенными.

Мне было интересно, если кто-нибудь может придумать объяснение этого поведения? Если да, то есть ли способ заставить все собственные значения сходиться, не делая k очень большим? Спасибо!