pcg

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

Синтаксис

x = pcg(A,b)
pcg(A,b,tol)
pcg(A,b,tol,maxit)
pcg(A,b,tol,maxit,M)
pcg(A,b,tol,maxit,M1,M2)
pcg(A,b,tol,maxit,M1,M2,x0)
[x,flag] = pcg(A,b,...)
[x,flag,relres] = pcg(A,b,...)
[x,flag,relres,iter] = pcg(A,b,...)
[x,flag,relres,iter,resvec] = pcg(A,b,...)

Описание

x = pcg(A,b) попытки решить систему линейных уравнений A*x=b для xзатем- n матрица коэффициентов A должно быть симметричным и положительный определенный, и должен также быть большим и разреженным. Вектор-столбец b должен иметь длину n. Также можно задать A быть указателем на функцию, afun, таким образом, что afun(x) возвращает A*x.

Параметризация Функций объясняет, как предоставить дополнительные параметры функциональному afun, а также предварительный формирователь функционирует mfun описанный ниже, при необходимости.

Если pcg сходится, сообщение к тому эффекту отображено. Если pcg сбои, чтобы сходиться после максимального количества итераций или остановов по любой причине, предупреждающее сообщение распечатано, отобразив относительный остаточный norm(b-A*x)/norm(b) и номер итерации, в который метод, остановленный или отказавший.

pcg(A,b,tol) задает допуск метода. Если tol [], затем pcg использует значение по умолчанию, 1e-6.

pcg(A,b,tol,maxit) задает максимальное количество итераций. Если maxit [], затем pcg использует значение по умолчанию, min(n,20).

pcg(A,b,tol,maxit,M) и pcg(A,b,tol,maxit,M1,M2) используйте симметричный положительный определенный предварительный формирователь M или M = M1*M2 и эффективно решите систему inv(M)*A*x = inv(M)*b для x. Если M [] затем pcg не применяет предварительного формирователя. M может быть указатель на функцию mfun таким образом, что mfun(x) возвращает M\x.

pcg(A,b,tol,maxit,M1,M2,x0) задает исходное предположение. Если x0 [], затем pcg использует значение по умолчанию, все-нулевой вектор.

[x,flag] = pcg(A,b,...) также возвращает флаг сходимости.

Флаг

Сходимость

0

pcg сходившийся к желаемому допуску tol в maxit итерации.

1

pcg выполненный с помощью итераций maxit времена, но не сходились.

2

Предварительный формирователь M было плохо обусловлено.

3

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

4

Один из скаляров вычисляется во время pcg стал слишком маленьким или слишком большим, чтобы продолжить вычислять.

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

[x,flag,relres] = pcg(A,b,...) также возвращает относительный остаточный norm(b-A*x)/norm(b). Если flag 0, relres <= tol.

[x,flag,relres,iter] = pcg(A,b,...) также возвращает номер итерации в который x был вычислен, где 0 <= iter <= maxit.

[x,flag,relres,iter,resvec] = pcg(A,b,...) также возвращает вектор норм невязки в каждой итерации включая norm(b-A*x0).

Примеры

Используя pcg с Большими Матрицами

В этом примере показано, как использовать pcg с матричным входом и с указателем на функцию.

n1 = 21; 
A = gallery('moler',n1);  
b1 = sum(A,2);
tol = 1e-6;  
maxit = 15;  
M1 = spdiags((1:n1)',0,n1,n1);
[x1,flag1,rr1,iter1,rv1] = pcg(A,b1,tol,maxit,M1);

В качестве альтернативы можно использовать следующую функцию вместо матричного A:

function y = applyMoler(x)
y = x;
y(end-1:-1:1) = y(end-1:-1:1) - cumsum(y(end:-1:2));
y(2:end) = y(2:end) - cumsum(y(1:end-1));

При помощи этой функции можно решить большие системы более эффективно, когда нет никакой потребности сохранить целый матричный A:

n2 = 21;
b2 = applyMoler(ones(n2,1));
tol = 1e-6;
maxit = 15;
M2 = spdiags((1:n2)',0,n2,n2);
[x2,flag2,rr2,iter2,rv2] = pcg(@applyMoler,b2,tol,maxit,M2);

Используя pcg с Предварительным формирователем

Этот пример демонстрирует, как использовать матрицу перед формирователем с pcg.

Создайте входную матрицу и попытайтесь решить систему с pcg.

A = delsq(numgrid('S',100));
b = ones(size(A,1),1);
[x0,fl0,rr0,it0,rv0] = pcg(A,b,1e-8,100);

fl0 1 потому что pcg не сходится к требуемому допуску 1e-8 в требуемых максимальных 100 итерациях. Предварительный формирователь может заставить систему сходиться более быстро.

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

L = ichol(A);
[x1,fl1,rr1,it1,rv1] = pcg(A,b,1e-8,100,L,L');

fl1 0 потому что pcg управляет относительной невязкой к 9.8e-09 (значение rr1) который меньше требуемого допуска 1e-8 в семьдесят седьмой итерации (значение it1) когда предобусловленный заполнением нулями неполной факторизации Холесского. rv1(1) = norm(b) и rv1(78) = norm(b-A*x1).

Предыдущая матрица представляет дискретизацию Лапласиана на 100x100 сетка с граничными условиями Дирихле. Это означает, что модифицированный неполный предварительный формирователь Холесского может выполнить еще лучше.

Используйте michol опция, чтобы создать модифицированный неполный предварительный формирователь Холесского.

L = ichol(A,struct('michol','on'));
[x2,fl2,rr2,it2,rv2] = pcg(A,b,1e-8,100,L,L');

В этом случае вы достигаете сходимости только в сорока семи итерациях.

Вы видите, как предварительные формирователи влияют на уровень сходимости pcg путем графического вывода каждой из остаточных историй, начинающих с первоначальной оценки (выполняют итерации номера 0).

figure;
semilogy(0:it0,rv0/norm(b),'b.');
hold on;
semilogy(0:it1,rv1/norm(b),'r.');
semilogy(0:it2,rv2/norm(b),'k.');
legend('No Preconditioner','IC(0)','MIC(0)');
xlabel('iteration number');
ylabel('relative residual');
hold off;

Ссылки

[1] Барретт, R., М. Берри, Т. Ф. Чан, и др., Шаблоны для Решения Линейных систем: Базовые блоки для Итерационных методов, SIAM, Филадельфия, 1994.

Расширенные возможности

Представлено до R2006a