Scilab-Branch-6.1-GIT
      
      
    Please note that the recommended version of Scilab is 2026.0.0. This page might be outdated.
See the recommended documentation of this function
qmr
quasi minimal residual method with preconditioning
Syntax
[x, flag, err, iter, res] = qmr(A, b, x0, M1, M2, maxi, tol) [x, flag, err, iter, res] = qmr(A,Ap,b,x0,M1,M1p,M2,M2p,maxi,tol) // deprecated
Arguments
- A
- Square dense or sparse matrix of size n-by-n, or function:
                    
                    - If A is a function which returns A*x, it must have the following header :function y = A ( x )
- 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 
 
- If A is a function which returns 
- Ap
- function returning A'*x. It must have the following header :function y = Ap(x)
- 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 either,- only M1*x, or
- M1*xor- M1'*x, depending on- t.
 
- only 
- M1p
- must only be provided when M1is a function returningM1*x. In this caseM1pis the function which returnsM1'*x.
- M2
- right preconditioner : matrix or function (In the first case, default: eye(n,n)).
                    If M2is a function, it returns either- only M2*x, or
- M2*xor- M2'*xdepending on an option- t.
 
- only 
- M2p
- must only be provided when M2is a function returningM2*x. In this caseM2pis the function which returnsM2'*x
- maxi
- maximum number of iterations (default: n)
- tol
- error tolerance (default: 1000*%eps)
- x
- solution vector.
- flag
- flag=0:- qmrconverged to the desired tolerance within- maxiiterations.
- flag=1: no convergence up to- maxiiterations,
- -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)
OR
function y=funA(x) 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]; y = A*x endfunction function y=funAp(x) 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]; y = A'*x endfunction b = ones(10,1); [x,flag,err,iter,res] = qmr(funA, funAp, b) [x,flag,err,iter,res] = qmr(funA, funAp, 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)
OR
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=funM1(x) M1 = eye(10,10); y = M1*x; endfunction function y=funM1p(x) M1 = eye(10,10); y = M1'*x; endfunction function y=funM2(x) M2 = eye(10,10); y = M2*x; endfunction function y=funM2p(x) M2 = eye(10,10); y = M2'*x; endfunction [x,flag,err,iter,res] = qmr(A, b, zeros(10,1), funM1, funM1p, funM2, funM2p, 10, 1d-12)
If A, M1, M2 are functions:
History
| Version | Description | 
| 5.4.0 | Calling qmr(A, Ap) is deprecated. qmr(A) should be used instead. | 
| Report an issue | ||
| << gmres | Linear Equations (Iterative Solvers) | Sparse Matrix Conversion >> |