Main Content

orth

シンボリック行列の範囲の正規直交基底

説明

orth(A) は、A の範囲の正規直交基底を計算します。

orth(A,'real') は、直交化プロセスで実数スカラー積を使用して、正規直交基底を計算します。

orth(A,'skipnormalization') は非正規直交基底を計算します。この場合、B の列を構成するベクトルの長さは必ずしも 1 でなくてかまいません。

orth(A,'real','skipnormalization') は、直交化プロセスで実数スカラー積を使用して、正規化されていない直交基底を計算します。

正規直交基底の計算

次の行列の範囲の正規直交基底を計算します。これらの数値はシンボリック オブジェクトではないため、結果は浮動小数点数となります。

A = [2 -3 -1; 1 1 -1; 0 1 -1];
B = orth(A)
B =
   -0.9859   -0.1195    0.1168
    0.0290   -0.8108   -0.5846
    0.1646   -0.5729    0.8029

次に、この行列をシンボリック オブジェクトに変換し、正規直交基底を計算します。

A = sym([2 -3 -1; 1 1 -1; 0 1 -1]);
B = orth(A)
B =
[ (2*5^(1/2))/5, -6^(1/2)/6, -(2^(1/2)*15^(1/2))/30]
[     5^(1/2)/5,  6^(1/2)/3,  (2^(1/2)*15^(1/2))/15]
[             0,  6^(1/2)/6,  -(2^(1/2)*15^(1/2))/6]

double を使用して、この結果を倍精度数値形式に変換することができます。結果の行列は、MATLAB® 関数 orth で返される行列とは異なります。これらの関数で使用されている Gram-Schmidt 直行化アルゴリズムのバージョンが異なるためです。

double(B)
ans =
    0.8944   -0.4082   -0.1826
    0.4472    0.8165    0.3651
         0    0.4082   -0.9129

B'*B = I であることを確認します。ここで、I は単位行列です。

B'*B
ans =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]

次に、B の各列の 2 ノルムが 1 であることを確認します。

norm(B(:, 1))
norm(B(:, 2))
norm(B(:, 3))
ans =
1
 
ans =
1
 
ans =
1

実数の正規直交基底の計算

'real' の使用で複素共役を回避して、行列の正規直交基底を計算します。

syms a
A = [a 1; 1 a];
B = orth(A,'real')
B =
[ a/(a^2 + 1)^(1/2),    -(a^2 - 1)/((a^2 + 1)*((a^2 -...
 1)^2/(a^2 + 1)^2 + (a^2*(a^2 - 1)^2)/(a^2 + 1)^2)^(1/2))]
[ 1/(a^2 + 1)^(1/2), (a*(a^2 - 1))/((a^2 + 1)*((a^2 -...
 1)^2/(a^2 + 1)^2 + (a^2*(a^2 - 1)^2)/(a^2 + 1)^2)^(1/2))]

正規化をスキップする直交基底の計算

'skipnormalization' を使用して、行列の直交基底を計算します。結果のベクトル (行列 B の列) の長さを 1 とする必要はありません。

syms a
A = [a 1; 1 a];
B = orth(A,'skipnormalization')
B =
[ a,               -(a^2 - 1)/(a*conj(a) + 1)]
[ 1, -(conj(a) - a^2*conj(a))/(a*conj(a) + 1)]

実数の直交基底の計算

'skipnormalization' および 'real' を使用して、行列の直交基底を計算します。

syms a
A = [a 1; 1 a];
B = orth(A,'skipnormalization','real')
B =
[ a,    -(a^2 - 1)/(a^2 + 1)]
[ 1, (a*(a^2 - 1))/(a^2 + 1)]

入力引数

すべて折りたたむ

入力。シンボリック行列として指定します。

詳細

すべて折りたたむ

正規直交基底

行列 A の範囲の正規直交基底は B であり、以下のようになります。

  • B'*B = I。ここで、I は単位行列です。

  • B の列は A の列と同じ空間をもちます。

  • B の列数は、A のランクになります。

ヒント

  • シンボリック オブジェクトではない数値引数について orth を呼び出すと、MATLAB 関数 orth が呼び出されます。MATLAB orth で返される結果は、orth で返される結果と異なることがあります。この 2 つの関数では、異なったアルゴリズムを使用して正規直交基底を計算するからです。関数 Symbolic Math Toolbox™ orth では、標準の Gram-Schmidt 直交化アルゴリズムを使用します。標準のアルゴリズムは数値的に不安定であるため、MATLAB 関数 orth では修正された Gram-Schmidt アルゴリズムを使用します。

  • 'skipnormalization' を使用して正規直交基底ではなく直交基底を計算すると、計算を高速化できます。

アルゴリズム

orth では、標準の Gram-Schmidt 直交化アルゴリズムを使用します。

バージョン履歴

R2013a で導入

参考

| | | |