bicgstabl

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

Синтаксис

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

Описание

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

x = bicgstabl(afun,b) принимает указатель на функцию afun вместо матричного A. afun(x) принимает векторный вход x и возвращает матричное векторное произведение A*x. Во всех следующих синтаксисах можно заменить A afun.

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

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

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

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

[x,flag] = bicgstabl(A,b,...) также возвращает сходимость flag:

Флаг

Сходимость

0

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

1

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

2

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

3

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

4

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

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

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

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

Примеры

Используя bicgstabl с Вводами или с Функцией

Можно передать входные параметры непосредственно bicgstabl:

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

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

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

и предварительный формирователь backsolve функция:

function y = mfun(r,n)
y = r ./ [((n-1)/2:-1:1)';
1; 
(1:(n-1)/2)'];

как вводит к bicgstabl:

x1 = bicgstabl(@(x)afun(x,n),b,tol,maxit,@(x)mfun(x,n));

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

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

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

load west0479;
A = west0479;

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

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

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

tol = 1e-12;
maxit = 20;

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

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

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

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

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

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

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

semilogy(0:0.25:it1,rv1/norm(b),'-o');

h = gca;
h.XTick = 0:0.25:it1;

xlabel('Iteration number');
ylabel('Relative residual');

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

Для просмотра документации необходимо авторизоваться на сайте