Main Content

rref

行の階段型への変換 (ガウス ジョルダン消去)

説明

R = rref(A) は、部分ピボットを使ったガウス ジョルダン消去法で、A行簡約階段形を返します。

R = rref(A,tol) は、無視できる列を判断するためにアルゴリズムで使用されるピボット許容誤差を指定します。

[R,p] = rref(A) は、非ゼロのピボット p も返します。

すべて折りたたむ

行列を作成し、行簡約階段形を計算します。この形式では、行列の各列のピボット位置に先行する 1 があります。

A = magic(3)
A = 3×3

     8     1     6
     3     5     7
     4     9     2

RA = rref(A)
RA = 3×3

     1     0     0
     0     1     0
     0     0     1

3 行 3 列の魔方陣行列はフル ランクであるため、行簡約階段形は単位行列です。

ここで、4 行 4 列の魔方陣行列の行簡約階段形を計算します。非ゼロのピボット列を返すために 2 つの出力を指定します。この行列はランク落ちであるため、結果は単位行列ではありません。

B = magic(4)
B = 4×4

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

[RB,p] = rref(B)
RB = 4×4

     1     0     0     1
     0     1     0     3
     0     0     1    -3
     0     0     0     0

p = 1×3

     1     2     3

拡大行列に対してガウス ジョルダン消去法を使用して線形システムを解き、逆行列を計算します。これらの手法は主として学術的観点からのものであり、こうした値の計算には、より効率的で数値的に安定した方法があります。

3 行 3 列の魔方陣行列を作成します。行列の最後に列をさらに追加します。拡大行列は、b に対応する余分な列をもつ線形システム Ax=b を表します。

A = magic(3);
A(:,4) = [1; 1; 1]
A = 3×4

     8     1     6     1
     3     5     7     1
     4     9     2     1

A の行簡約階段形を計算します。R にインデックスを付けて、線形システムに対する解が含まれている余分な (拡大された) 列にあるエントリを抽出します。

R = rref(A)
R = 3×4

    1.0000         0         0    0.0667
         0    1.0000         0    0.0667
         0         0    1.0000    0.0667

x = R(:,end)
x = 3×1

    0.0667
    0.0667
    0.0667

この線形システムを解くより効率的な方法は、バックスラッシュ演算子 x = A\b を使用することです。

同様の魔方陣行列を作成しますが、今回は同じサイズの単位行列を終了列に追加します。

A = [magic(3) eye(3)]
A = 3×6

     8     1     6     1     0     0
     3     5     7     0     1     0
     4     9     2     0     0     1

A の行簡約階段形を計算します。この形式では、余分な列には 3 行 3 列の魔方陣行列の逆行列が含まれます。

R = rref(A)
R = 3×6

    1.0000         0         0    0.1472   -0.1444    0.0639
         0    1.0000         0   -0.0611    0.0222    0.1056
         0         0    1.0000   -0.0194    0.1889   -0.1028

inv_A = R(:,4:end)
inv_A = 3×3

    0.1472   -0.1444    0.0639
   -0.0611    0.0222    0.1056
   -0.0194    0.1889   -0.1028

逆行列を計算するより効率的な方法は inv(A) を使用することです。

4 つの方程式と 3 つの未知数からなる線形方程式系について検討します。

x1+x2+5x3=62x1+x2+8x3=8x1+2x2+7x3=10-x1+x2-x3=2.

方程式系を表す拡大行列を作成します。

A = [1  1  5;
     2  1  8;
     1  2  7;
    -1  1 -1];
b = [6 8 10 2]';
M = [A b];

システムを行簡約階段形で表すには、rref を使用します。

R = rref(M)
R = 4×4

     1     0     3     2
     0     1     2     4
     0     0     0     0
     0     0     0     0

R の最初の 2 行には、x3 の観点から x1x2 を表す方程式が含まれます。次の 2 つの行は、右側のベクトルに適合する解が少なくとも 1 つ存在することを示しています (そうでない場合、いずれかの方程式が 1=0 を読み取ります)。3 番目の列にはピボットが含まれていないため、x3 は独立変数です。そのため、x1 および x2 には解が無限に存在し、x3 は自由に選択できます。

x1=2-3x3x2=4-2x3.

たとえば、x3=1 である場合、x1=-1 および x2=2 です。

数値的な観点からは、この方程式系を解くより効率的な方法は x0 = A\b を使用することです。これは、(方形行列 A に対して) 最小二乗解を計算します。この場合、rank(A) が未知数の数と等しいか確認することで、norm(A*x0-b)/norm(b) を使用した解決法の正確性と、解の一意性を確認できます。複数の解が存在する場合、それらの形式はすべて x=x0+nt になります。ここで、n はヌル空間 null(A) であり、t は自由に選択できます。

入力引数

すべて折りたたむ

入力行列。

データ型: single | double
複素数のサポート: あり

ピボット許容誤差。スカラーとして指定します。ピボット列内の最大要素 (絶対値) が許容誤差未満である場合、その列はゼロとして除外されます。これにより、許容誤差より小さい非ゼロのピボット要素を使用した除算と乗算が回避されます。

データ型: single | double

出力引数

すべて折りたたむ

A行簡約階段形。行列として返されます。

非ゼロのピボット列。ベクトルとして返されます。p の各要素は、A の列インデックスです。p を使用して、次のいくつかの量を推定できます。

  • length(p)A のランクの推定値です。

  • x(p) には、線形システム Ax = b のピボットを設定する変数が含まれます。

  • A(:,p) は、A の範囲の基底です。

  • R(1:r,p) は、rr 列の単位行列です。ここで、r = length(p) です。

制限

  • 通常、rankorthnull は高速でより正確に行列のランクと基底ベクトルを計算します。

  • 線形システムを解くには mldivide を使用することを推奨します。

詳細

すべて折りたたむ

部分ピボット

部分ピボットは、ピボット列で最大の絶対値をもつ列要素を選択し、この要素がピボット位置 (行内で一番左にある非ゼロの要素) にくるように行列の行を入れ替える手法です。

たとえば、下の行列では、アルゴリズムはまず 1 列目の最大値 ((2,1) の位置にある値 1.1) を特定し、この値が (1,1) の位置に表示されるように、第 1 列と第 2 列全体を入れ替えます。

3-by-3 matrix. The first row has values of 0.5, 1.4, and 2. The second row has values of 1.1, 0.3, and 0.1. The third row has values of 0.2, 5, and 0.5.

ガウスの消去法で部分ピボットを使用することで、計算の丸め誤差が軽減されます (ただし、なくすことはできません)。

行簡約階段形

次の条件が満たされる場合、行列は "行階段形" です。

  • すべての非ゼロ行がすべてゼロの行より上にある。

  • 各行の最初の係数が厳密に、その上の行内の係数の右側にある。

行階段形の行列の例を示します。

A=(123041002).

"行簡約階段形" の追加要件は次のとおりです。

  • 最初の係数はすべて 1 でなければならず、その列の中で唯一の非ゼロでなければならない。

多くの場合、単位行列は行簡約階段形に関連付けられていますが、他の形式も使用できます。行簡約階段形をとる別の行列の例です。

A=(1001010300130000).

アルゴリズム

関数 rref は、部分ピボットを使ってガウス ジョルダン消去法を実装します。max(size(A))*eps*norm(A,inf) の既定の許容誤差は、丸め誤差を減らすためにゼロとして除外された列の要素が無視できるかどうかを判定します。

拡張機能

バージョン履歴

R2006a より前に導入

参考

| | |