Матричное масштабирование для улучшения кондиционирования
Уравновесьте матрицу с большим числом обусловленности, чтобы улучшить эффективность и стабильность решения линейной системы с помощью итерационного решателя gmres
.
Загрузите west0479
матрица, которая является действительной 479 на 479 разреженной матрицей. Использование condest
для вычисления предполагаемого числа обусловленности матрицы.
load west0479
A = west0479;
c1 = condest(A)
c1 = 1.4244e+12
Попытайтесь решить линейную систему использование gmres
с 450 итерациями и допуском 1e-11
. Задайте пять выходов так, чтобы gmres
возвращает нормы невязки решения при каждой итерации (использование ~
для подавления ненужных выходов). Постройте график норм невязки на полулогарифмический график. График показывает, что gmres
не в состоянии достичь разумной нормы невязки, и поэтому расчетное решение для не надежно.
b = ones(size(A,1),1);
tol = 1e-11;
maxit = 450;
[x,flx,~,~,rvx] = gmres(A,b,[],tol,maxit);
semilogy(rvx)
title('Residual Norm at Each Iteration')
Использование equilibrate
для транспозиции и пересмотра A
. Создайте новую матрицу B = R*P*A*C
, который имеет лучшее число обусловленности и диагональные элементы только 1 и -1.
[P,R,C] = equilibrate(A); B = R*P*A*C; c2 = condest(B)
c2 = 5.1036e+04
Использование выходов, возвращенной equilibrate
, можно переформулировать задачу в , где и . В этой форме вы можете восстановить решение в исходной системе с .
Использование gmres
решить для , и затем повторите нормы невязки при каждой итерации. График показывает, что уравновешивание матрицы улучшает стабильность задачи с gmres
сходится к желаемому допуску 1e-11
менее чем за 200 итераций.
d = R*P*b; [y,fly,~,~,rvy] = gmres(B,d,[],tol,maxit); hold on semilogy(rvy) legend('Original', 'Equilibrated', 'Location', 'southeast') title('Relative Residual Norms (No Preconditioner)') hold off
Улучшите решение с помощью Preconditioner
После того, как вы получите матрицу B
, можно улучшить стабильность задачи еще дальше путем вычисления предварительного кондиционера для использования с gmres
. Числовые свойства B
лучше, чем у исходной матрицы A
таким образом, вы должны использовать уравновешенную матрицу, чтобы вычислить предварительный кондиционер.
Вычислите два различных предварительных обусловителя с ilu
, и используйте их как входы для gmres
чтобы решить проблему снова. Постройте график норм невязки при каждой итерации на том же графике, что и уравновешенные нормы для сравнения. График показывает, что вычисление предварительных кондиционеров с уравновешенной матрицей значительно увеличивает стабильность задачи с gmres
достижение желаемого допуска менее чем за 30 итераций.
semilogy(rvy) hold on [L1,U1] = ilu(B,struct('type','ilutp','droptol',1e-1,'thresh',0)); [yp1,flyp1,~,~,rvyp1] = gmres(B,d,[],tol,maxit,L1,U1); semilogy(rvyp1) [L2,U2] = ilu(B,struct('type','ilutp','droptol',1e-2,'thresh',0)); [yp2,flyp2,~,~,rvyp2] = gmres(B,d,[],tol,maxit,L2,U2); semilogy(rvyp2) legend('No preconditioner', 'ILUTP(1e-1)', 'ILUTP(1e-2)') title('Relative Residual Norms with ILU Preconditioner (Equilibrated)') hold off
A
- Входная матрицаВходная матрица, заданная как квадратная матрица. A
может быть плотным или разреженным, но должен быть структурно несингулярным, как определяется sprank
.
Когда A
является разреженным, выходы P
, R
, и C
также разрежены.
Типы данных: single
| double
Поддержка комплексного числа: Да
P
- Матрица сочетанийМатрица сочетаний, возвращенная как матрица. P*A
является сочетанием A
что максимизирует абсолютное значение продукта его диагональных элементов.
R
- Масштабирование строкМасштабирование строк, возвращаемое как диагональная матрица. Диагональные элементы в R
и C
реальны и положительны.
C
- Масштабирование столбцовМасштабирование столбца, возвращаемое как диагональная матрица. Диагональные элементы в R
и C
реальны и положительны.
[1] Дафф, И. С., и Дж. Костер. «Об алгоритмах перестановки больших записей в диагональ разреженной матрицы». SIAM Journal по матричному анализу и применениям 22, № 4 (январь 2001 года): 973-96.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.