bicgstab

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

Синтаксис

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

Описание

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

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

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

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

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

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

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

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

Флаг

Сходимость

0

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

1

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

2

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

3

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

4

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

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

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

[x,flag,relres,iter] = bicgstab(A,b,...) также возвращает номер итерации в который x был вычислен, где 0 <= iter <= maxit. iter может быть целочисленный + 0.5, указывая на сходимость на полпути через итерацию.

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

Примеры

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

Этот пример сначала решает Ax = b путем обеспечения A и предварительный формирователь M1 непосредственно в качестве аргументов.

Код:

A = gallery('wilk',21);
b = sum(A,2);
tol = 1e-12;  
maxit = 15; 
M1 = diag([10:-1:1 1 1:10]);

x = bicgstab(A,b,tol,maxit,M1);

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

bicgstab converged at iteration 12.5 to a solution with relative 
residual 2e-014.

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

Этот пример заменяет матричный A в предыдущем примере с указателем на матричное векторное произведение функционируют afun, и предварительный формирователь M1 с указателем на backsolve функционируют mfun. Пример содержится в файле run_bicgstab это

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

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

Следующее показывает код для run_bicgstab:

function x1 = run_bicgstab
n = 21;
b = afun(ones(n,1));
tol = 1e-12;  
maxit = 15; 
x1 = bicgstab(@afun,b,tol,maxit,@mfun);

    function y = afun(x)
       y = [0; x(1:n-1)] + ...
           [((n-1)/2:-1:0)'; (1:(n-1)/2)'].*x + ...
           [x(2:n); 0];
    end
 
    function y = mfun(r)
        y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)'];
    end
end

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

x1 = run_bicgstab;

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

bicgstab converged at iteration 12.5 to a solution with relative 
residual 2e-014.

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

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

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

load west0479;
A = west0479;

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

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

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

tol = 1e-12;
maxit = 20;

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

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

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

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

semilogy(0:0.5: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] = bicgstab(A,b,tol,maxit,L,U);

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

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

semilogy(0:0.5:it1,rv1/norm(b),'-o');
xlabel('Iteration Number');
ylabel('Relative Residual');

Ссылки

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

[2] ван дер Ворст, H.A. bicgstab: быстрый и гладко сходящийся вариант BI-CG для решения несимметричных линейных систем", SIAM J. Научный Закон Comput., март 1992, Издание 13, № 2, стр 631–644.

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

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