Transposefree quasiminimal residual method
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)
attempts to solve the system of linear equations
A*x=b
for x
. The
n
byn
coefficient matrix A
must be square and the righthand side column vector b
must have
length n
.
x = tfqmr(afun,b)
accepts a function handle,
afun
, instead of the matrix A
. The function,
afun(x)
, accepts a vector input x
and returns
the matrixvector product A*x
. In all of the following syntaxes, you
can replace A
by afun
. Parameterizing Functions explains how to provide additional parameters to
the function afun
.
x = tfqmr(a,b,tol)
specifies the tolerance of the method. If
tol
is []
then tfqmr
uses
the default, 1e6.
x = tfqmr(a,b,tol,maxit)
specifies the maximum number of
iterations. If maxit
is []
then
tfqmr
uses the default, min(N,20)
.
x = tfqmr(a,b,tol,maxit,m)
and x =
tfqmr(a,b,tol,maxit,m1,m2)
use preconditioners m
or
m=m1*m2
and effectively solve the system A*inv(M)*x =
B
for x
. If M
is
[]
then a preconditioner is not applied. M
may
be a function handle mfun
such that mfun(x)
returns m\x
.
x = tfqmr(a,b,tol,maxit,m1,m2,x0)
specifies the initial guess. If
x0
is []
then tfqmr
uses
the default, an all zero vector.
[x,flag] = tfqmr(A,B,...)
also returns a convergence flag:
Flag  Convergence 





 Preconditioner 


 One of the scalar quantities calculated during

[x,flag,relres] = tfqmr(A,b,...)
also returns the relative
residual norm(bA*x)/norm(b)
. If flag
is 0, then
relres <= tol
.
[x,flag,relres,y]y(A,b,...)
also returns the iteration number at
which x
was computed: 0 <= iter <=
maxit
.
[x,flag,relres,iter,resvec] = tfqmr(A,b,...)
also returns a
vector of the residual norms at each iteration, including
norm(bA*x0)
.
This example shows how to use tfqmr
with a matrix input and
with a function input.
n = 100; on = ones(n,1); A = spdiags([2*on 4*on on],1:1,n,n); b = sum(A,2); tol = 1e8; 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,[]);
You can also use a matrixvector product function as input:
function y = afun(x,n) y = 4 * x; y(2:n) = y(2:n)  2 * x(1:n1); y(1:n1) = y(1:n1)  x(2:n); x1 = tfqmr(@(x)afun(x,n),b,tol,maxit,M1,M2);
If applyOp
is a function suitable for use with
qmr
, it may be used with tfqmr
by
wrapping it in an anonymous
function:
x1 = tfqmr(@(x)applyOp(x,'notransp'),b,tol,maxit,M1,M2);
This example demonstrates the use of a preconditioner.
Load A = west0479
, a real 479by479 nonsymmetric sparse matrix.
load west0479;
A = west0479;
Define b
so that the true solution is a vector of all ones.
b = full(sum(A,2));
Set the tolerance and maximum number of iterations.
tol = 1e12; maxit = 20;
Use tfqmr
to find a solution at the requested tolerance and number of iterations.
[x0,fl0,rr0,it0,rv0] = tfqmr(A,b,tol,maxit);
fl0
is 1 because tfqmr
does not converge to the requested tolerance 1e12
within the requested 20 iterations. The seventeenth iterate is the best approximate solution and is the one returned as indicated by it0 = 17
. MATLAB® stores the residual history in rv0
.
Plot the behavior of tfqmr
.
semilogy(0:maxit,rv0(1:maxit+1)/norm(b),'o'); xlabel('Iteration number'); ylabel('Relative residual');
Note that like bicgstab
, tfqmr
keeps track of half iterations. The plot shows that the solution does not converge. You can use a preconditioner to improve the outcome.
Create the preconditioner with ilu
, since the matrix A
is nonsymmetric.
[L,U] = ilu(A,struct('type','ilutp','droptol',1e5));
Error using ilu There is a pivot equal to zero. Consider decreasing the drop tolerance or consider using the 'udiag' option.
MATLAB cannot construct the incomplete LU as it would result in a singular factor, which is useless as a preconditioner.
You can try again with a reduced drop tolerance, as indicated by the error message.
[L,U] = ilu(A,struct('type','ilutp','droptol',1e6)); [x1,fl1,rr1,it1,rv1] = tfqmr(A,b,tol,maxit,L,U);
fl1
is 0 because tfqmr
drives the relative residual to 4.1410e014
(the value of rr1
). The relative residual is less than the prescribed tolerance of 1e12
at the sixth iteration (the value of it1
) when preconditioned by the incomplete LU factorization with a drop tolerance of 1e6
. The output rv1(1)
is norm(b)
, and the output rv1(7)
is norm(bA*x2)
.
You can follow the progress of tfqmr
by plotting the relative residuals at each iteration starting from the initial estimate (iterate number 0).
semilogy(0:0.5:it1,rv1/norm(b),'o'); xlabel('Iteration number'); ylabel('Relative residual');