Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - Português - Русский
Scilabヘルプ >> ARnoldi PACKage > eigs

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)です. 実対称または複素数問題の場合,ncv2 * 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 関数が導入されました. dnaupd, dneupd, dsaupd, dseupd, znaupd および zneupdは廃止されました.
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Feb 14 15:02:13 CET 2019