Я пытаюсь диагонализировать некоторые плотные, плохо обусловленные матрицы. В машинной точности результаты являются неточными (возвращая отрицательные собственные значения, собственные векторы не имеют ожидаемой симметрии). Я переключился на функцию Eigensystem [] Mathematica, чтобы использовать преимущества произвольной точности, но вычисления очень медленные. Я открыт для любого количества решений. Существуют ли пакеты / алгоритмы, которые хорошо подходят для плохо обусловленных проблем? Я не эксперт по предварительному кондиционированию, поэтому я не уверен, насколько это может помочь. В противном случае все, о чем я могу думать, - это распараллеленные решатели на собственные значения произвольной точности, но я не знаком ни с чем, кроме Mathematica, MATLAB и C ++.
Чтобы дать некоторое представление о проблеме, матрицы большие, но не огромные (максимум от 4096x4096 до 32768x32768). Они действительны, симметричны, и собственные значения ограничены между 0 и 1 (исключая), причем многие собственные значения очень близки к 0 и ни один не близок к 1. Матрица по существу является оператором свертки. Мне не нужно диагоналировать все мои матрицы, но чем больше я могу пойти, тем лучше. У меня есть доступ к вычислительным кластерам со многими процессорами и возможностями распределенных вычислений.
Спасибо
Ответы:
Рассчитайте СВД вместо спектрального разложения. Результаты одинаковы в точной арифметике, так как ваша матрица симметрична положительно определена, но в арифметике конечной точности вы получите маленькие собственные значения с гораздо большей точностью.
Редактировать: См. Деммель и Кахан, Точные сингулярные значения двухдиагональных матриц, SIAM J. Sci. Стат. Вычи. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf
Edit2; Обратите внимание, что ни один метод не сможет разрешить собственные значения, меньшие, чем примерно норма, умноженная на точность используемой машины, так как изменение одной записи на один ulp может уже на столько изменить небольшое собственное значение. Таким образом, получение нулевых собственных значений вместо очень крошечных является целесообразным, и никакой метод (кроме работы с более высокой точностью) не будет распутывать соответствующие собственные векторы, а просто возвращает основу для общего числового нулевого пространства.
источник
Спасибо за это предложение. Я попробовал команду SVD Mathematica, но я не получил заметного улучшения (все еще не хватает соответствующих симметрий, «собственные значения» неправильно равны нулю там, где они ранее неправильно выходили отрицательными). Может быть, мне потребуется реализовать один из описанных выше алгоритмов вместо встроенной функции? Я бы, вероятно, хотел бы избежать проблем, связанных с использованием определенного метода, подобного этому, если я не был заранее уверен, что он предложит значительное улучшение.
@JackPoulson, я просмотрел статью о методе Якоби, на которую ты ссылался, и это выглядит многообещающе. Можете ли вы или кто-нибудь порекомендовать хороший способ реализации метода Якоби для поиска собственных систем? Я предполагаю, что если бы я сам его кодировал (в MATLAB), это было бы очень медленно.
источник