eigs 行列の最大固有値と固有ベクトルを計算

## 呼び出し手順

                d = eigs(A)
                d = eigs(Af, n)
                d = eigs(.., B)
                d = eigs(.., B, k)
                d = eigs(.., B, k, sigma)
                d = eigs(.., B, k, sigma, opts)
                [d, v] = eigs(..)

## 引数

A

  通常または疎, 実数または複素数, 対称または非対称正方行列

B

  `A`と同じ次元の疎, 実数または複素数, 正方行列. Specify `[]` to skip it, as by default.

k

  整数, 計算する固有値の数. By default, `k=min(n-1, 6)` (`A` real symetric) or `k=min(n-2, 6)` (otherwise) eigen values are computed, with n=size(A,1).

sigma

  実スカラーまたは長さ2の文字列

opts

  構造体

Af

  関数

n

  スカラー, Aが関数の場合のみ `A` 定義

d

  実数または複素数の固有値ベクトルまたは対角行列 (対角項に固有値)

v

  実数または複素数の固有ベクトル行列

## 説明

eigs関数の目的は,疎で大きな行列の最大固有値を計算することです.

d = eigs(A) または d = eigs(Af, n)

  は,固有値問題`A * v = lambda * v`を解きます. このコールは,大きさが最大の6個の固有値を有する ベクトル `d`を返します. `A` は正方行列で, 対称または非対称, 実数または複素数, 通常または複素数 とすることができます.

  `A` は関数`Af`で 表すことも可能です.この場合, ベクトル引数の長さを指定するスカラー`n`を 定義する必要があります. この関数は,以下のヘッダを有する必要があります:

      function y = A ( x )

  この関数 `Af` は以下の4つの式の1つを返す必要があります:

A * x

sigmaが指定されないか文字列が'SM'以外の場合.

- A \ x

  sigmaが0または'SM'の場合.

- (A - sigma * I) \ x

  標準固有値問題の場合, ただし I は単位行列.

- (A - sigma * B) \ x

  一般化固有値問題の場合.

[d, v] = eigs(A) or [d, v] = eigs(Af, n)

  は,6個の最大固有値を対角項に有する対角行列 `d` を返します. `v` は n行6列の行列で, その列は返された固有値に対応する6個の固有値ベクトルです.

d = eigs(A, B)

  は,正定行列`B`を指定して, 一般化固有値問題 `A * v = lambda * B * v` を解きます.

  - `B` が指定されない場合, `B = []` が使用されます.

  - `B` が指定された場合, `B` はAと同じ大きさとする必要があります.

d = eigs(A, B, k)

  は,`k`個の固有値をベクトル`d`に返します.

d = eigs(A, B, k, sigma)

  は,`sigma`で定義された`k`個の固有値を ベクトル`d`に返します. `sigma` は,0を含む実数または複素数,または文字列 とすることができます. sigma が長さ2の文字列の場合, 以下の値のどれかとします :

  - `'LM'` は,大きさが最大の`k`個の 固有値を計算します(デフォルト).

  - `'SM'` は,大きさが最小の`k`個の 固有値を計算します(sigma = 0 と同じ).

  - `'LA'` は,実対称問題のみに適用され, `k`個の代数的最大固有値を計算します.

  - `'SA'` は,実対称問題のみに適用され, `k`個の代数的最小固有値を計算します.

  - `'BE'` は,実対称問題のみに適用され, スペクトラムの各端から半分づつ,`k`個の固有値を計算します.

  - `'LR'` は,実非対称または複素問題のみに適用され, `k`個の実部最大の固有値を計算します.

  - `'SR'` は,実非対称または複素問題のみに適用され, `k`個の実部最小の固有値を計算します.

  - `'LI'` は,実非対称または複素問題のみに適用され, `k`個の虚部最大の固有値を計算します.

  - `'SI'` は,実非対称または複素問題のみに適用され, `k`個の虚部最小の固有値を計算します.

d = eigs(A, B, k, sigma, opts)

  `opts` 構造体が指定された場合, `k` 個の固有値を計算する際に 異なるオプションを使用できます:

tol

所要の収束閾値. デフォルトで, `tol = %eps`.

- maxiter

  最大反復回数. デフォルトで, `maxiter = 300`.

- ncv

  使用するLanzcos基底ベクトルの数. 実非対称問題の場合, `ncv`の値は `2 * k + 1` 以上とする必要があり, デフォルトで `ncv = min(max(2 * k + 1, 20), nA)` です. 実対称または複素数問題の場合,`ncv`は `2 * k` 以上とする必要があり, デフォルトで`ncv = min(max(2 * k, 20), nA)` です.ただし,`nA = size(A, 2)` .

- resid

  初期残差ベクトルを有する開始ベクトルで, 前回実行時の値を使用することもできます. デフォルトで,`resid` はランダムな 初期値ベクトルです.

- cholB

  `B`ではなく `chol(B)`を指定します. デフォルトで , `cholB` は %f です.

- isreal

  `Af` が指定された場合, `isreal` を定義できます. デフォルトで, `isreal` は %t です. この引数は,`A`が行列の場合, 指定する必要がありません.

- issym

  `Af` が指定された場合, `issym` を定義できます. デフォルトで `issym` は %f です. この引数は,`A`が行列の場合, 指定する必要がありません.

## 参考文献

この関数はR. Lehoucq, K. Maschhoff, D. Sorensen, および C. Yang.により書かれた ARPACKパッケージに基づいています.

- 実対称問題用のDSAUPD および DSEUPD ルーチン,

- 実非対称行列用のDNAUPD および DNEUPD ルーチン.

- 複素問題用のZNAUPD および ZNEUPD.

## 実対称問題の例

    clear opts
    A            = diag(10*ones(10,1));
    A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6*ones(9,1));
    A(2:$,1:$-1) = A(2:$,1:$-1) + diag(6*ones(9,1));
    B = eye(10,10);
    k = 8;
    sigma = 'SM';
    opts.cholB = %t;
    d = eigs(A)
    [d, v] = eigs(A)
    d = eigs(A, B, k, sigma)
    [d, v] = eigs(A, B, k, sigma)
    d = eigs(A, B, k, sigma, opts)
    [d, v] = eigs(A, B, k, sigma, opts)
    // 疎行列
    AS = sparse(A);
    BS = sparse(B);
    d = eigs(AS)
    [d, v] = eigs(AS)
    d = eigs(AS, BS, k, sigma)
    [d, v] = eigs(AS, BS, k, sigma)
    d = eigs(AS, BS, k, sigma, opts)
    [d, v] = eigs(AS, BS, k, sigma, opts)
    // 関数
    clear opts
    function y = fn(x)
       y = A * x;
    endfunction
    opts.isreal = %t;
    opts.issym = %t;
    d = eigs(fn, 10, [], k, 'LM', opts)
    function y = fn(x)
       y = A \ x;
    endfunction
    d = eigs(fn, 10, [], k, 'SM', opts)
    function y = fn(x)
       y = (A - 4 * eye(10,10)) \ x;
    endfunction
    d = eigs(fn, 10, [], k, 4, opts)

## 実非対称問題の例

        clear opts
        A            = diag(10*ones(10,1));
        A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6*ones(9,1));
        A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6*ones(9,1));
        B = eye(10,10);
        k = 8;
        sigma = 'SM';
        opts.cholB = %t;
        d = eigs(A)
    [d, v] = eigs(A)
        d = eigs(A, B, k, sigma)
        [d, v] = eigs(A, B, k, sigma)
        d = eigs(A, B, k, sigma, opts)
        [d, v] = eigs(A, B, k, sigma, opts)
    // 疎行列
        AS = sparse(A);
        BS = sparse(B);
    d = eigs(AS)
    [d, v] = eigs(AS)
        d = eigs(AS, BS, k, sigma)
        [d, v] = eigs(AS, BS, k, sigma)
        d = eigs(AS, BS, k, sigma, opts)
        [d, v] = eigs(AS, BS, k, sigma, opts)
        // 関数
    clear opts
    function y = fn(x)
       y = A * x;
    endfunction
    opts.isreal = %t;
    opts.issym = %f;
    d = eigs(fn, 10, [], k, 'LM', opts)
    function y = fn(x)
       y = A \ x;
    endfunction
    d = eigs(fn, 10, [], k, 'SM', opts)
    function y = fn(x)
       y = (A - 4 * eye(10,10)) \ x;
    endfunction
    d = eigs(fn, 10, [], k, 4, opts)

## 複素問題の例

        clear opts
        A            = diag(10*ones(10,1) + %i * ones(10,1));
        A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6*ones(9,1));
        A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6*ones(9,1));
        B = eye(10,10);
        k = 8;
        sigma = 'LM';
        opts.cholB = %t;
        d = eigs(A)
    [d, v] = eigs(A)
        d = eigs(A, B, k, sigma)
        [d, v] = eigs(A, B, k, sigma)
        d = eigs(A, B, k, sigma, opts)
        [d, v] = eigs(A, B, k, sigma, opts)
        // 疎行列
        AS = sparse(A);
        BS = sparse(B);
        d = eigs(AS)
    [d, v] = eigs(AS)
        d = eigs(AS, BS, k, sigma)
        [d, v] = eigs(AS, BS, k, sigma)
        d = eigs(AS, BS, k, sigma, opts)
        [d, v] = eigs(AS, BS, k, sigma, opts)
        // 関数
    clear opts
    function y = fn(x)
       y = A * x;
    endfunction
    opts.isreal = %f;
    opts.issym = %f;
    d = eigs(fn, 10, [], k, 'LM', opts)
    function y = fn(x)
       y = A \ x;
    endfunction
    d = eigs(fn, 10, [], k, 'SM', opts)
    function y = fn(x)
       y = (A - 4 * eye(10,10)) \ x;
    endfunction
    d = eigs(fn, 10, [], k, 4, opts)

## 参照

- spec

## 履歴

5.4.0 関数が導入されました.
6.1.1 dnaupd, dneupd, dsaupd, dseupd, znaupd and zneupd become internal.