Предположим, у меня есть оригинальная большая, разреженная линейная система: . Теперь у меня нет как A слишком велика для разложения или любого вида разложения , но предположим, что у меня есть решение найденное с помощью итеративного решения.
Теперь я хочу применить небольшое ранговое обновление к диагонали A (измените несколько диагональных элементов): где - диагональная матрица с в основном 0 по диагонали и несколько ненулевых значений. Если бы у меня был я бы смог воспользоваться формулой Вудбери, чтобы применить обновление к обратному. Тем не менее, у меня нет этого в наличии. Есть ли что-то, что я могу сделать, кроме как заново решить всю систему? Может быть, есть какой-то способ, которым я могу придумать предобусловливатель который легко \ легче инвертировать, такой, что , так что все, что мне нужно сделать, если у меня есть это применить и итерационный метод будет сходиться в пару / несколько итераций?
Ответы:
Сохраните в столбцах двух матриц и все векторы к которым вы применяли матрицу на предыдущих итерациях, и результаты .B C bj cj=Abj
Для каждой новой системы (или , что является особым случаем ), приблизительно решить переопределенную линейную систему , например, выбрав подмножество строк (возможно, все) и используя плотный метод наименьших квадратов. Обратите внимание, что только выбранная часть должна быть собрана; так что это быстрая операция!(A+D)x′=b′ Ax=b′ D=0 (C+DB)y≈b′ C+DB
Положите . Это хорошее начальное приближение, с которого начинается итерация для решения . В случае, если дальнейшие системы должны быть обработаны, используйте матричные векторные произведения в этой новой итерации, чтобы расширить матрицы и в результирующей подсистеме.x0=By (A+D)x′=b′ B C
Если матрицы и не помещаются в основную память, сохраните на диске и заранее выберите поднабор строк. Это позволяет вам хранить в ядре соответствующую часть и необходимую для формирования системы наименьших квадратов, и следующий может быть вычислен за один проход через с небольшим использованием памяти ядра.B C B B C x0 B
Строки должны быть выбраны таким образом, чтобы они приблизительно соответствовали грубой дискретизации полной задачи. Достаточно взять в пять раз больше строк, чем общее число ожидаемых умножителей на матрицы.
Редактировать: Почему это работает? По построению матрицы и связаны соотношением . Если подпространство, натянутое на столбцы содержит точный вектор решения (редкая, но простая ситуация), то имеет вид для некоторого . Подставляя это в уравнение, определяющее получаем уравнение . Таким образом, в этом случае вышеуказанный процесс дает в качестве отправной точки , что является точным решением.B C C=AB B x′ x′ x′=By y x′ (C+DB)y=b′ x0=By=x′
В общем, нельзя ожидать, что будет лежать в пространстве столбцов , но сгенерированная отправная точка будет точкой в этом неясном пространстве, ближайшей к , в метрике, определяемой выбранными строками. Таким образом, это, вероятно, разумное приближение. По мере того, как обрабатывается больше систем, пространство столбцов увеличивается, и аппроксимация, вероятно, значительно улучшится, так что можно надеяться на сходимость за меньшее и меньшее количество итераций.x′ B x′
Edit2: О сгенерированном подпространстве: если каждый решает каждую систему методом Крылова, векторы, используемые для получения начальной точки для второй системы, охватывают подпространство Крылова первой правой части. Таким образом, можно получить хорошее приближение всякий раз, когда это подпространство Крылова содержит вектор, близкий к решению вашей второй системы. В общем, векторы, используемые для получения начальной точки -й системы, охватывают пространство, содержащее подпространство Крылова первых правых частей.(k+1) k
источник