Бисопряженные градиенты стабилизированный (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
-by-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 |
|
4 | Один из скаляров, вычисленных во время |
[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
:
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));
Этот пример демонстрирует использование предварительного формирователя.
Загрузите 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');