bicg

Бисопряженный метод градиентов

Синтаксис

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

Описание

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

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

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

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

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

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

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

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

Флаг

Сходимость

0

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

1

bicg выполнил итерации времен maxit, но не сходился.

2

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

3

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

4

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

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

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

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

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

Примеры

Используя bicg с Матричным Входным параметром

Этот пример показывает, как использовать bicg с матричным входом. bicg. Следующий код:

n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);

x = bicg(A,b,tol,maxit,M1,M2);

отображения это сообщение:

bicg converged at iteration 9 to a solution with relative
residual 5.3e-009

Используя bicg с Указателем на функцию

Этот пример заменяет матричный A в предыдущем примере с указателем на функцию матричного векторного произведения afun. Пример содержится в файле run_bicg это

  • Вызовы bicg с указателем на функцию @afun в качестве его первого аргумента.

  • Содержит afun как вложенную функцию, так, чтобы все переменные в run_bicg были доступны afun.

Поместите следующее в файл под названием run_bicg:

function x1 = run_bicg
n = 100; 
on = ones(n,1); 
b = afun(on,'notransp'); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);
x1 = bicg(@afun,b,tol,maxit,M1,M2);

    function y = afun(x,transp_flag)
       if strcmp(transp_flag,'transp')      % y = A'*x
          y = 4 * x;
          y(1:n-1) = y(1:n-1) - 2 * x(2:n);
          y(2:n) = y(2:n) - x(1:n-1);
       elseif strcmp(transp_flag,'notransp') % y = A*x
          y = 4 * x;
          y(2:n) = y(2:n) - 2 * x(1:n-1);
          y(1:n-1) = y(1:n-1) - x(2:n);
       end
    end
end

Когда вы входите

x1 = run_bicg;

MATLAB отображает сообщение

bicg converged at iteration 9 to a solution with ...
relative residual 
5.3e-009

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

Этот пример демонстрирует использование предварительного формирователя.

Загрузите A = west0479, действительное 479 479 несимметричная разреженная матрица.

load west0479;
A = west0479;

Задайте b так, чтобы истинное решение было вектором из всех единиц.

b = full(sum(A,2));

Установите допуск и максимальное количество итераций.

tol = 1e-12;
maxit = 20;

Используйте bicg, чтобы найти решение в требуемом допуске и количестве итераций.

[x0,fl0,rr0,it0,rv0] = bicg(A,b,tol,maxit);

fl0 равняется 1, потому что bicg не сходится к требуемому допуску 1e-12 в требуемых 20 итерациях. На самом деле поведение bicg так плохо, что исходное предположение (x0 = zeros(size(A,2),1)) является лучшим решением и возвращено, как обозначено it0 = 0. MATLAB® хранит остаточную историю в rv0.

Постройте поведение bicg.

semilogy(0:maxit,rv0/norm(b),'-o');
xlabel('Iteration number');
ylabel('Relative residual');

График показывает, что решение не сходится. Можно использовать предварительный формирователь, чтобы улучшить результат.

Создайте предварительный формирователь с ilu, поскольку матричный A несимметричен.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-5));
Error using ilu
There is a pivot equal to zero. Consider decreasing 
the drop tolerance or consider using the 'udiag' option.

MATLAB не может создать неполный LU, когда это привело бы к сингулярному фактору, который бесполезен как предварительный формирователь.

Можно попробовать еще раз с уменьшаемым допуском отбрасывания, как обозначено сообщением об ошибке.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6));
[x1,fl1,rr1,it1,rv1] = bicg(A,b,tol,maxit,L,U);

fl1 0, потому что bicg управляет относительной невязкой к 4.1410e-014 (значение rr1). Относительная невязка является меньше, чем предписанный допуск 1e-12 в шестой итерации (значение it1), когда предобусловленный неполной LU-факторизацией с допуском отбрасывания 1e-6. Выводом rv1(1) является norm(b), и выводом rv1(7) является norm(b-A*x2).

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

semilogy(0:it1,rv1/norm(b),'-o');
xlabel('Iteration number');
ylabel('Relative residual');

Ссылки

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

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

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