tfqmr

Метод квази-минимальных невязок без транспонирования

Синтаксис

x = tfqmr(A,b)
x = tfqmr(afun,b)
x = tfqmr(a,b,tol)
x = tfqmr(a,b,tol,maxit)
x = tfqmr(a,b,tol,maxit,m)
x = tfqmr(a,b,tol,maxit,m1,m2,x0)
[x,flag] = tfqmr(A,B,...)
[x,flag,relres] = tfqmr(A,b,...)
[x,flag,relres,y]y(A,b,...)
[x,flag,relres,iter,resvec] = tfqmr(A,b,...)

Описание

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

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

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

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

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

x = tfqmr(a,b,tol,maxit,m1,m2,x0) задает исходное предположение. Если x0 является [] затем, tfqmr использует значение по умолчанию, весь нулевой вектор.

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

Флаг

Сходимость

0

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

1

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

2

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

3

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

4

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

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

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

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

Примеры

Используя tfqmr с Входным параметром Матрицы или Указателя на функцию

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

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 = tfqmr(A,b,tol,maxit,M1,M2,[]);

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

function y = afun(x,n)
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);
x1 = tfqmr(@(x)afun(x,n),b,tol,maxit,M1,M2);

Если applyOp является функцией, подходящей для использования с qmr, это может использоваться с tfqmr путем переноса его в анонимной функции:

x1 = tfqmr(@(x)applyOp(x,'notransp'),b,tol,maxit,M1,M2);

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

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

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

load west0479;
A = west0479;

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

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

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

tol = 1e-12;
maxit = 20;

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

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

fl0 равняется 1, потому что tfqmr не сходится к требуемому допуску 1e-12 в требуемых 20 итерациях. Семнадцатые выполняют итерации, лучшее приближенное решение и тот, возвращенный, как обозначено it0 = 17. MATLAB® хранит остаточную историю в rv0.

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

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

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

Создайте предварительный формирователь с 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] = tfqmr(A,b,tol,maxit,L,U);

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

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

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

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