Все-таки хорошо, что этот форум индексируется в Яндексе - если кто в России заинтересуется, то точно нас найдет.
Да, я использую в качестве предобуславливателя "ближнюю" матрицу, так как другого выхода у меня нет. Как я понимаю, все в моем случае так делают. Вот только согласия нет о том, какой предобуславливатель лучше.
Первый метод, которым я воспользовался, был BiCGSTAB (Van der Vorst). У меня он не заработал: на малых частотах сходился как-то "не до конца", а на больших вообще ерунду показывал. Ни один из семейства CG-методов так нормально и не заработал. Потом были различные вариации QMR (Freund). Начало сходиться. Скопировал свои матрицы в MatLab - с помощью его методов понял, что так и должно быть, но GMRES еще лучше. Реализовал GMRES (Saad), им пока и пользуюсь.
В моей задаче размерность прямо связана с частотой излучения - размер элемента должен быть пропорционален длине волны. Где-то около 5000 переменных сходимость стала очень грустной - 40 dB за 200 итераций, и стало ясно, что потом будет еще хуже. Так я и начал искать предобуславливатели.
В BiCG долго стоял вопрос, какое скалярное умножение использовать: обычное v на v^T или эрмитово v на v^*? Вопрос не был решен, так как все равно не сошлось, но я все же склоняюсь в пользу эрмитова. В описании QMR говорилось о комплексных числах в явном виде. В GMRES надо использовать эрмитово произведение и комплексное вращение Гивенса.
Думаю, что симметрия матрицы для FMM (fast multipole method) не принципиальна. Сам Рохлин это придумывал для потенциалов, а лишь потом выяснилось, что этот трюк можно вносить и под интегралы, и под дифференцирование, и под векторное произведение. Главная идея в том, с каждой неизвестной связана некоторая точка r_i (реально - семейство точек с весами, по которым идет численное интегрирование), а элемент матрицы имеет вид A_{ij} = f(r_j - r_i). Далее нужно существование универсальных разложений f(r_1+r_2)=g(r_1)h(r_2), а А f(x) = f(-x) вроде не требуется. По fast multipole method есть уйма статей в совершенно различных приложениях.
Вопросы по Вашей задаче:
1) У Вас метод конечных элементов или граничных элементов? В смысле интегралы по объему или по поверхности? Конечные элементы что-то мало в России встречаются.
2) Как выглядят базисные функции? В моем случае поверхность делится на треугольники, а область задания каждой функции - два смежных треугольника. Это так называемые RWG-функции. С другими не работал.
3) Где Вы все-таки этим занимаетесь? И под чьим руководством?
Плотные задачи тоже много решают итерационными методами, если переменных много - всяко быстрее, чем прямыми методами. Хотя есть задачи с плохой сходимостью... Не представляю, как отличить плохую сходимость от ошибок в коде.
Я так понимаю, есть два основных направления предобуславливателей. Первое - ILU. Но у него много всяких вариаций, параметров, алгоритмы из статьи в статью переходят с описками. Не всегда помогает, плюс использование специальных структур для хранения редких матриц добавляет проблем с быстродействием.
Второй, который идет от статьи Колотилиной, развился в SAI, sparse approximate inverse. В нем ищут какую-то матрицу с фиксированными местами (?) у элементов, минимизирующую некоторую норму, решая при этом (на этапе построения предобуславливателя) неслабую задачу наименьших квадратов. На этом во французском CERFACS собаку съели (J.Rahola, B.Carpentieri, I.Duff, L.Giraud). Но описания его я пока не добрался.
Есть еще блочный ILU, где матрицу делят на блоки, для блоков делают ILU, а матрицу целиком обращают рекурсивно более точно, используя обращенные блоки (J.Rius, A.Heldring).
С ILUT я связался, прочитав Jeonghwa Lee, Jun Zhang, Cai-Cheng Lu, "Incomplete LU preconditioning for large scale dense complex linear systems from electromagnetic wave scattering problems", Journal of Computational Physics,
Vol. 185, No. 1 (2003), pp. 158 - 175. У них есть и объемные, и поверхностные, и матрица несимметричная.
Но пока ни ILUT, ни ILU(p) ничего не дали.
|