|
|
◆ Zlatme()
| Sub Zlatme |
( |
N As |
Long, |
|
|
Dist As |
String, |
|
|
Iseed() As |
Long, |
|
|
D() As |
Complex, |
|
|
Mode As |
Long, |
|
|
Cond As |
Double, |
|
|
Dmax As |
Complex, |
|
|
Rsign As |
String, |
|
|
Upper As |
String, |
|
|
Sim As |
String, |
|
|
Ds() As |
Double, |
|
|
Modes As |
Long, |
|
|
Conds As |
Double, |
|
|
Kl As |
Long, |
|
|
Ku As |
Long, |
|
|
ANorm As |
Double, |
|
|
A() As |
Complex, |
|
|
Info As |
Long |
|
) |
| |
指定された固有値を持つランダム非対称正方行列の生成 (複素行列)
- 目的
- 本ルーチンは指定された固有値を持つランダム非対称正方行列を生成する.
Zlatmeは以下の順に処理を行う.
- 対角要素をDとする. ただし, Dは入力値, または, 下記のようにMode, Cond, DmaxおよびRsignに基づいて求めた値である.
- Upper = "T"であれば, Aの上三角部分は分布Distのランダム値に設定される.
- Sim = "T"であれば, 特異値がDs, Modes および Condsで指定されたランダム行列Xを左からAに乗算する. また, Xの逆行列を右から乗算する.
- Kl < N-1であれば, ハウスホルダー変換により下帯幅をKlまで減らす. Ku < N-1であれば, 上帯幅をKuまで減らす.
- ANormが非負であれば, 行列は最大ノルムがANormとなるようにスケーリングされる.
(注: 行列をヘッセンベルグ形以上には縮小することはできないため, 圧縮格納オプションは用意されていない.)
- 引数
-
| [in] | N | Aの列数(あるいは行数). (N >= 0) |
| [in] | Dist | ランダム固有値/特異値生成に使用する乱数の分布.
= "U": 一様分布 (0, 1).
= "S": 一様分布 (-1, 1).
= "D": 複素単位円の内側 |z| < 1 で一様分布.
= "N": 正規分布 (0, 1). |
| [in,out] | Iseed() | 配列 Iseed(LIseed - 1) (LIseed >= 4)
[in] 乱数発生ルーチンのシード. (0 <= Iseed(i) <= 4095, ただし Iseed(3)は奇数)
[out] Iseed()の値は変更され, 同じ乱数系列を続けるために次の呼び出しで使うことができる. |
| [in,out] | D() | 配列 D(LD - 1) (LD >= N)
Aの固有値を指定するために使用される.
[in] Mode = 0であれば, D()は固有値の入力とみなされる.
[out] Mode <> 0であれば, Mode, Cond, Dmax および Rsignに基づいて固有値が計算され, D()に入れられる. |
| [in] | Mode | 固有値の指定方法.
= 0: D() (および Ei()) にユーザーが入力する.
= 1: D(0) = 1, D(1〜N-1) = 1/Cond.
= 2: D(0〜N-2) = 1, D(N-1) = 1/Cond.
= 3: D(i) = Cond^(-i/(N-1)) (i = 0〜N-1).
= 4: D(i) = 1-i/(N-1)*(1-1/Cond) (i = 0〜N-1).
= 5: (1/Cond, 1)の範囲で対数値が一様に分布するようにランダムに生成する. 偶数番と奇数番の各要素の対は, 2つの実数固有値として, または, 固有値の複素共役対の実数部と虚数部として使われる. どちらになるかは50-50の確率でランダムに選択される.
< 0: |Mode|と同じであるがD()の中に逆順に入れる. 従って, Mode = 1〜4であれば, D()の値は1〜1/Condの範囲に並ぶ. -1〜-4であれば, D()の値は1/Cond〜1の範囲に並ぶ. |
| [in] | Cond | 上記のModeの説明のように使用される. (Cond >= 1) |
| [in] | Dmax | Mode = -6, 0および6以外のとき, ModeおよびCondに基づき計算された, D()の値はDmax/max(abs(D(i)))によりスケーリングされる. Dmaxは正または実数でなくてもよいことに注意せよ: Dmaxが負または複素数(または0)であれば, D()は負の値または複素数(または0)によりスケーリングされる.
Rsign = "F"の場合, 固有値の最大絶対値はDmaxに等しくなる. |
| [in] | Rsign | Mode = -6, 0, 6以外のときに有効.
= "T": ModeおよびCondに基づき計算された, D()の要素にランダムに符号(+1または-1)を乗算する.
= "F": 乗算しない. |
| [in] | Upper | = "T": Aの対角要素より上の要素をDistに従ったランダム値に設定する.
= "F": 設定しない. |
| [in] | Sim | = "T": Aに相似変換を施す, すなわち, 左からX, 右からX^(-1)を乗算する. ただし, X = U*S*Vで, UとVはランダムなユニタリ行列, SはDs(), ModesおよびCondsで指定された特異値(対角行列)である.
= "F": Aに変換を行わない. |
| [in,out] | Ds() | 配列 Ds(LDs - 1) (LDs >= N)
D()がAの固有値を指定するのと同様に, Ds()はXの特異値を指定するために使用される. Modes = 0 の場合, 非ゼロの特異値がDs()に入力として与えられる. |
| [in] | Modes | |
| [in] | Conds | ModeおよびCondと同様であるが, Sの対角要素を指定する. Modes = -6および6は許されない(ランダムに悪条件の固有値を与えてしまうため). |
| [in] | Kl | 行列の下帯幅. (Kl >= 1)
Kl = 1 は上ヘッセンベルグ形を示す. Kl >= N-1であれば, Aは最大下帯幅を持つ. |
| [in] | Ku | 行列の上帯幅. (Ku >= 1)
Ku >= N-1であれば, Aは最大上帯幅を持つ. Ku >= N-1 かつ Kl >= N-1の場合, Aは密行列である. KuとKlのどちらか一方のみをN-1より小さくすることができる. |
| [in] | Anorm | ANorm >= 0 の場合, Aの要素の最大ノルムがANormになるように非負の実数でスケーリングされる. |
| [out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
要求されたテスト行列. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N < 0)
= -2: パラメータ Dist の誤り. (Dist <> "U", "S", "D"および"N")
= -3: パラメータ Iseed() の誤り.
= -4: パラメータ D() の誤り.
= -5: パラメータ Mode の誤り. (Mode < -6 または Mode > 6)
= -6: パラメータ Cond の誤り. (Cond < 1)
= -8: パラメータ Rsign の誤り. (Rsign <> "T"および"F")
= -9: パラメータ Upper の誤り. (Upper <> "T"および"F")
= -10: パラメータ Sim の誤り. (Sim <> "T"および"F")
= -11: パラメータ Ds() の誤り. (Ds()が不正な値を含む)
= -12: パラメータ Modes の誤り. (Modes < -5 または Modes > 5)
= -13: パラメータ Conds の誤り. (Conds < 1)
= -14: パラメータ Kl の誤り. (Kl < 1)
= -15: パラメータ Ku の誤り. (Ku < 1 または KuとKlの両方 < N-1)
= -17: パラメータ A() の誤り.
= 1: Zlatm1でエラー. (D()の計算中)
= 2: Dmaxによるスケーリングができなかった. (特異値の最大値が0)
= 3: Dlatm1でエラー. (Ds()の計算中)
= 4: Zlargeでエラー.
= 5: Dlatm1が特異値として0を返した. |
- 出典
- LAPACK
|