Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Scilab-Branch-6.1-GIT
Change language to: English - Français - Português - Русский

# qmr

プリコンディショナ付きのQuasi Minimal Residual法

### 呼び出し手順

```[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```

### Parameters

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*x` or `A'*x` depending on a option t, it must have the following header :

`function y = A(x, t)`

• If `t = "notransp"`: the function returns `A*x`.
• If `t = "transp"`: the function returns `A'*x`.

Ap
function returning `A'*x`. It must have the following header :

`function y = Ap(x)`

b

x0

M1

• only `M1*x`, or
• `M1*x` or `M1'*x`, depending on `t`.

M1p
`M1`が関数の場合のみ指定する 必要があります. この場合, `M1p``M1'*x`を返す関数です.

M2

• only `M2*x`, or
• `M2*x` or `M2'*x` depending on an option `t`.

M2p
`M2`が関数の場合のみ指定する 必要があります. この場合, `M2p``M2'*x`を返す関数です.

maxi

tol

x

flag
• `flag`=0: `gmr``maxi`回の反復の間に 許容誤差内に収束しました
• `flag`=1: 指定した`maxi`回の反復の間に 収束しませんでした
• `-7 < flag < 0`: A breakdown occurred because one of the scalar quantities calculated was equal to zero.

res

err

iter

### 説明

プリコンディショナ付きのQuasi Minimal Residual法により, 線形システム`Ax=b`を解きます.

### 例

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:

```// See functions defined above in previous examples. Then,

[x,flag,err,iter,res] = qmr(funA, funAp, b, zeros(10,1), funM1, funM1p, funM2, funM2p, 10, 1d-12)
// or
[x,flag,err,iter,res] = qmr(Atimesx, b, zeros(10,1), M1timesx, M2timesx, 10, 1d-12)```

### 参照

• gmres — Generalized Minimum RESidual 法

### 履歴

 バージョン 記述 5.4.0 qmr(A, Ap) のコールは廃止されました. qmr(A) を代わりに使用してください.