итеративный линейный решатель для положительно определенной и плохо обусловленной матрицы

Мне нужна помощь в решении этой проблемы.

Я хочу решить Ax = b,

где A is n x n (square matrix), b is n x 1 matrix.

Но матрица A имеет следующее свойство: + Ill обусловлено (K >> 1) (может быть больше 10 ^ 8) + Симметричная положительно определенная (потому что это ковариационная матрица)

Я уже пробовал метод Якоби, но, к сожалению, он очень медленно сходится. Я избегаю использования разложения Холецкого.

И я уже пробовал Conjugate Gradient, но, к сожалению, если число Condition из матрицы A слишком велико, оно не может стать сходящимся.

Обновление: мне нужен метод, который можно запускать в параллельной среде (например, MPI). Поэтому я не могу использовать Gauss-seidal, которому требуется x [i] в ​​текущей итерации.

Какой метод я могу использовать для решения такого рода проблем? Спасибо :)


person psuedobot    schedule 05.08.2013    source источник


Ответы (3)


Я собираюсь предположить, что ваши проблемы возникают из-за неточного вычисления произведения матрица-вектор. (Я никогда не видел, чтобы сопряженный градиент полностью не уменьшал остаток, если только произведение матрица-вектор не было плохим. Первая итерация после перезапуска просто выполняет самый крутой спуск.)

Вы можете попробовать запустить сопряженный градиент снова, но с использованием повышенной точности или суммирования Кахана или чего-то еще при вычислении матрицы -векторный продукт.

В качестве альтернативы, если ваша матрица имеет некоторую известную структуру, вы можете попытаться найти другой способ записи произведения матрица-вектор, который уменьшает округление в вычисленном результате. Если бы я мог видеть вашу матрицу, я мог бы дать здесь более конкретные предложения.

person tmyklebu    schedule 05.08.2013
comment
да, моя матрица A очень плохая ... число условий до 10 ^ 8 :( ... какой формат вы хотите? вы хотите, чтобы я поместил его в * .mat или * .txt? thx :) - person psuedobot; 06.08.2013
comment
10 ^ 8 не так уж и плохо. Текстовое описание, первая строка которого - #rows #cols #nonzeros, а каждая оставшаяся строка - row col entry, с записями, состоящими как минимум из 17 значащих цифр, вероятно, легче всего для меня. - person tmyklebu; 06.08.2013
comment
у вас есть матлаб / октава? что, если я дам вам * .mat? чтобы не потерять точность цифр dl.dropboxusercontent.com/u/32191086/gpmat .mat - person psuedobot; 07.08.2013
comment
@psuedobot: Вы не теряете точности при преобразовании двойных чисел IEEE в десятичные числа с 17 или более значащими цифрами. - person tmyklebu; 07.08.2013
comment
Вы указали записи с шестью десятичными знаками, а не с 17 значащими цифрами; это привело к отрицательному собственному значению. Однако я загрузил ваш файл mat и заметил, что у вас плотная матрица с некоторыми довольно небольшими записями. Его номер состояния около 1e9. Тем не менее, вы все равно можете запускать сопряженный градиент без предварительных условий на этой матрице (той, что находится в файле mat), если вы выполняете достаточно точную арифметику - 80-битные аппаратные числа с плавающей запятой должны работать, если вы внимательно оцениваете суммы. - person tmyklebu; 07.08.2013
comment
Отдельно предлагаю решать здесь системы с помощью факторизации Холецкого. Если вы получили эту положительно определенную матрицу как эмпирическую ковариационную или обратную ковариационную матрицу (или какую-либо другую аналогичную конструкцию A A ^ T), которая, я подозреваю, у вас может быть, вы могли бы вместо этого взглянуть на итерационные методы решения линейных задач наименьших квадратов. Они, безусловно, будут вести себя намного лучше, потому что вы можете обойти квадрат всех сингулярных значений шага. - person tmyklebu; 07.08.2013
comment
Вчера, когда я искал в Интернете, я нашел об алгоритме Ланцоша. Могу ли я использовать его для получения только нескольких наибольших собственных значений и собственных векторов и использовать их для решения Ax = b? - person psuedobot; 09.08.2013

Глядя на загруженную вами матрицу, некоторые вещи кажутся немного странными:

  1. Ваша матрица K является относительно небольшой (400 x 400) плотной матрицей.
  2. Ваша матрица K содержит значительное количество записей, близких к нулю, с (abs(K(i,j)) < 1.E-16*max(abs(K))).

Для матриц такого размера непосредственное вычисление факторизации Холецкого должно быть наиболее эффективным подходом. Я не уверен, почему вы говорите, что не можете этого сделать?

Итерационные методы, такие как методы предварительно обусловленных сопряженных градиентов, обычно используются только для очень больших и разреженных систем уравнений, поэтому здесь они не кажутся применимыми.


При решении таких систем разреженных линейных уравнений, как эта, важно не количество строк / столбцов в матрице, а шаблон разреженности самой матрицы.

Если, например, ваша матрица A очень разреженная, возможно, удастся вычислить разреженную факторизацию Холецкого A = L*L' напрямую. Однако будьте осторожны, порядок уравнений определяет образец разреженности результирующих факторов, и выбор плохой стратегии упорядочивания для A может привести к катастрофическому заполнению для L*L' и низкой производительности.

Существует ряд стратегий, таких как приблизительная минимальная степень и Многоуровневое вложенное рассечение, которое следует использовать для изменения порядка A для получения псевдооптимальной разреженности для L*L'.

Существует ряд хороших пакетов, которые реализуют высокопроизводительную разреженную факторизацию, включая реализации схем переупорядочения, описанных выше. Я бы порекомендовал изучить пакет CHOLMOD Дэвиса.

Если вы все же обнаружите, что ваша система уравнений слишком велика для эффективной обработки с использованием прямой факторизации, вам следует изучить предварительное кондиционирование вашего итеративного PCG решатель. Хорошее предварительное кондиционирование может уменьшить эффективное число обусловленности линейной системы, что в большинстве случаев значительно улучшает сходимость.

Вы должны всегда использовать хотя бы простой диагональный предварительный кондиционер Jacobi, хотя обычно гораздо лучшая производительность может быть достигнута с использованием более сложных подходов, таких как неполная факторизация Холецкого или, возможно, алгебраические многосеточные или многоуровневые методы. В этом отношении вам может быть полезна библиотека PETSc, поскольку она содержит высокопроизводительные реализации количество итерационных решателей и схем предварительной обработки.

Надеюсь это поможет.

person Darren Engwirda    schedule 05.08.2013
comment
@psuedobot: Я внес некоторые правки на основе загруженной вами матрицы. - person Darren Engwirda; 11.08.2013
comment
да, я просто понимаю, что большая часть моей ценности очень мала, и когда я просто устанавливаю их на ноль, результат все еще в порядке. Возможно, я попытаюсь использовать вычисление разреженной матрицы, а не настраивать / оптимизировать мой метод Якоби плотной матрицы :) - person psuedobot; 12.08.2013

Я видел (но не особо усмотрел) недавние работы по этому поводу, такие как http://www.cs.yale.edu/homes/spielman/precon/precon.html. Связывая сказанное с Википедией, вы можете посмотреть http://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method, который является частным случаем http://en.wikipedia.org/wiki/Successive_Over-relaxation.

Если толчок идет вразрез, вы всегда можете спуститься на уровень ниже (найти более быструю реализацию или добавить больше оборудования для решения проблемы) или повысить уровень (попробуйте найти другой способ достижения своей цели, который не предполагает решение больших линейных систем, или решая их так часто).

person mcdowella    schedule 05.08.2013