qmr
quasi minimal residual method with preconditioning
Syntax
[x, flag, err, iter, res] = qmr(A, b, x0, M1, M2, maxi, tol)
Arguments
- A
 Square dense or sparse matrix of size n-by-n, or function.
If A is a function which returns
A*xorA'*xdepending on a option t, it must have the following header:function y = A(x, t)- If 
t = "notransp": the function returnsA*x. - If 
t = "transp": the function returnsA'*x. 
- If 
 - b
 - right hand side vector
 - x0
 - initial guess vector (default: zeros(n,1)).
 - M1
 left preconditioner: matrix or function (In the first case, default: eye(n,n)). If
M1is a function, it returns:M1*xorM1'*x, depending ont.- M2
 right preconditioner: matrix or function (In the first case, default: eye(n,n)). If
M2is a function, it returns:M2*xorM2'*xdepending ont.- maxi
 - maximum number of iterations (default: n)
 - tol
 - error tolerance (default: 1000*%eps)
 - x
 - solution vector.
 - flag
 flag=0:qmrconverged to the desired tolerance withinmaxiiterations.flag=1: no convergence up tomaxiiterations,-7 < flag < 0: A breakdown occurred because one of the scalar quantities calculated was equal to zero.
- res
 - residual vector.
 - err
 - final residual norm.
 - iter
 - number of iterations performed.
 
Description
Solves the linear system Ax=b using the Quasi Minimal Residual Method
            with preconditioning.
Examples
If A is a matrix:
A = [ 94 0 0 0 0 28 0 0 32 0 0 59 13 5 0 0 0 10 0 0 0 13 72 34 2 0 0 0 0 65 0 5 34 114 0 0 0 0 0 55 0 0 2 0 70 0 28 32 12 0 28 0 0 0 0 87 20 0 33 0 0 0 0 0 28 20 71 39 0 0 0 10 0 0 32 0 39 46 8 0 32 0 0 0 12 33 0 8 82 11 0 0 65 55 0 0 0 0 11 100]; b = ones(10,1); [x,flag,err,iter,res] = qmr(A, b) [x,flag,err,iter,res] = qmr(A, b, zeros(10,1), eye(10,10), eye(10,10), 10, 1d-12)
If A is a function:
function y=Atimesx(x, t) A = [ 94 0 0 0 0 28 0 0 32 0 0 59 13 5 0 0 0 10 0 0 0 13 72 34 2 0 0 0 0 65 0 5 34 114 0 0 0 0 0 55 0 0 2 0 70 0 28 32 12 0 28 0 0 0 0 87 20 0 33 0 0 0 0 0 28 20 71 39 0 0 0 10 0 0 32 0 39 46 8 0 32 0 0 0 12 33 0 8 82 11 0 0 65 55 0 0 0 0 11 100]; if (t == 'notransp') then y = A*x; elseif (t == 'transp') then y = A'*x; end endfunction b = ones(10,1); [x,flag,err,iter,res] = qmr(Atimesx, b) [x,flag,err,iter,res] = qmr(Atimesx, b, zeros(10,1), eye(10,10), eye(10,10), 10, 1d-12)
If A is a matrix, M1 and M2 are functions:
A = [ 94 0 0 0 0 28 0 0 32 0 0 59 13 5 0 0 0 10 0 0 0 13 72 34 2 0 0 0 0 65 0 5 34 114 0 0 0 0 0 55 0 0 2 0 70 0 28 32 12 0 28 0 0 0 0 87 20 0 33 0 0 0 0 0 28 20 71 39 0 0 0 10 0 0 32 0 39 46 8 0 32 0 0 0 12 33 0 8 82 11 0 0 65 55 0 0 0 0 11 100]; b = ones(10,1); function y=M1timesx(x, t) M1 = eye(10,10); if(t=="notransp") then y = M1*x; elseif (t=="transp") then y = M1'*x; end endfunction function y=M2timesx(x, t) M2 = eye(10,10); if(t=="notransp") then y = M2*x; elseif (t=="transp") then y = M2'*x; end endfunction [x, flag, err, iter, res] = qmr(A, b, zeros(10,1), M1timesx, M2timesx, 10, 1d-12)
If A, M1, M2 are functions:
// See functions defined above in previous examples. Then, [x,flag,err,iter,res] = qmr(Atimesx, b, zeros(10,1), M1timesx, M2timesx, 10, 1d-12)
History
| Version | Description | 
| 5.4.0 | Calling qmr(A, Ap) is deprecated. qmr(A) should be used instead. | 
| 2023.0.0 | Calling qmr(A, Ap) is removed. | 
| Report an issue | ||
| << gmres | Linear Equations (Iterative Solvers) | Sparse Matrix Conversion >> |