# gmres

Generalized Minimum RESidual 法

## 呼び出し手順

    [x,flag,err,iter,res] = gmres(A,b,[rstr,[tol,[maxi,[M,[x0]]]]])

## パラメータ

A

  n行n列行列または`A*x`を返す関数. `A`が関数の場合,以下のようなヘッダを有すること:

      function y = A ( x )

b

  右辺ベクトル

x0

  初期推定値ベクトル(デフォルト: zeros(n,1))

M

  プリコンディショナ: n行n列行列（デフォルト: eye(n,n)）または `M*x`を返す関数. M が関数の場合,以下のようなヘッダを有すること:

      function y = M ( x )

rstr

  リスタートまでの反復回数 (デフォルト: 10)

maxi

  最大反復回数 (デフォルト: n)

tol

  許容誤差 (デフォルト: 1e-6)

x

  解のベクトル

err

  最終残差ノルム

iter

  実行した反復回数

flag
  0 =

    `gmres`は, `maxi`回の反復内に 指定した許容誤差に収束しました

  1 =

    指定した `maxi`回では収束しませんでした

res

  残差ベクトル

## 説明

GMRES

  線形システム`Ax=b`をリスタート付きの Generalized Minimal residual法により解きます.

詳細

  このアルゴリズムの詳細は以下の文献に記述されています :

  "Templates for the Solution of Linear Systems: Building Blocks for Iterative Methods", Barrett, Berry, Chan, Demmel, Donato, Dongarra, Eijkhout, Pozo, Romine, and Van der Vorst, SIAM Publications, 1993 (ftp netlib2.cs.utk.edu; cd linalg; get templates.ps).

  "Iterative Methods for Sparse Linear Systems, Second Edition" Saad, SIAM Publications, 2003 (ftp ftp.cs.umn.edu; cd dept/users/saad/PS; get all_ps.zip).

## 例

    	// A および M が行列の場合
    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] = gmres(A, b)

    M = eye(10, 10);

    [x,flag,err,iter,res] = gmres(A, b, 10, 1d-12, 20, M, zeros(10, 1))

    	// Aが行列, Mが関数の場合
    	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 = Mtimesx(x)
    M = eye(10,10);
    y = M*x;
    endfunction

    [x,flag,err,iter,res] = gmres(A, b, 10, 1d-12, 20, Mtimesx, zeros(10, 1))

    	// A が関数, M が行列の場合
    	function y = Atimesx(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);
    	 M = eye(10, 10);

    	 [x,flag,err,iter,res] = gmres(Atimesx, b)

    	 [x,flag,err,iter,res] = gmres(Atimesx, b, 10, 1d-12, 20, M, zeros(10,1))

    	 // A および M が関数
    	 function y = Atimesx(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 = Mtimesx(x)
    M = eye(10,10);
    y = M*x;
    endfunction

    	 [x,flag,err,iter,res] = gmres(Atimesx, b, 10, 1d-12, 20, Mtimesx, zeros(10,1))

## 参照

- pcg
- qmr