Матричное масштабирование для улучшения кондиционирования
Уравновесьте матрицу с большим числом обусловленности, чтобы улучшить эффективность и стабильность решения линейной системы с помощью итерационного решателя 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.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.