Main Content

linsolve

線形システム方程式の求解

説明

X = linsolve(A,B) は、これらの方法の 1 つを使用して線形システム AX = B を解決します。

  • Asquare の場合、linsolve は部分ピボットを使用した LU 分解を使用します。

  • その他の場合はすべて、linsolve は列ピボットを使用した QR 分解を使用します。

A が悪条件の場合 (正方行列の場合) またはランク落ち (方形行列の場合) の場合、linsolve は警告を出力します。

X = linsolve(A,B,opts) は、オプション構造体 opts によって決定される適切なソルバーを使用します。opts のフィールドは、行列 A のプロパティを表す logical 値です。たとえば、A が上三角行列である場合、opts.UT = true を設定して linsolve が上三角行列用に設計されたソルバーを使用するようにできます。linsolve は、Aopts で指定されたプロパティがあるかどうかを確認する検定を行いません。

また、[X,r] = linsolve(___)r を返します。これは A の条件数の逆数 (正方行列の場合)、または A のランクの逆数 (方形行列の場合) です。前述の構文にある任意の入力引数の組み合わせが使用できます。この構文では、linsolveA が悪条件、またはランク落ちの場合に警告を行いません。

すべて折りたたむ

mldivide および linsolve の両方で線形システムを解き、パフォーマンスを比較します。

mldivide は、MATLAB® で大半の線形方程式系を解くために推奨される方法です。ただし、関数は入力行列に対して特殊なプロパティがあるかどうかを確認するためのいくつかのチェックを行います。事前に係数行列のプロパティがわかっている場合は、linsolve を使用して、時間のかかる大きな行列のチェックを回避できます。

10000 行 10000 列の魔方陣行列を作成し、下三角部分を抽出します。opts 構造体の LT フィールドを true に設定して、A が下三角行列であることを示します。

A = tril(magic(1e4));
opts.LT = true;

線形方程式 Ax=b の右辺について 1 のベクトルを作成します。A の行数と b の行数は等しくなければなりません。

b = ones(size(A,2),1);

mldivide を使用して線形システム Ax=b を解き、計算時間を測定します。

tic
x1 = A\b; 
t1 = toc
t1 = 0.0562

ここで、linsolve を使用して再度システムを解きます。linsolve が下三角行列に対する適切なソルバーを選択できるよう、オプション構造体を指定します。

tic
x2 = linsolve(A,b,opts);
t2 = toc
t2 = 0.0217

実行時間を比較して、linsolve がどれだけ速いかを確認します。他の時間の比較と同様に、結果は、さまざまなコンピューターと MATLAB のリリースにより変化します。

speedup = t1/t2
speedup = 2.5948

2 つの出力をもつ linsolve を使用して線形システムを解き、行列条件の警告を非表示にします。

20 行 20 列のヒルベルト テスト行列を作成します。この行列は、最大の特異値が最小の特異値よりおよそ 2e18 大きい近特異です。

A = hilb(20);

A を含む線形システムを linsolve で解きます。A が近特異であるため、linsolve は警告を返します。

b = ones(20,1);
x = linsolve(A,b);
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  5.628781e-20.

ここで、同じ線形システムを解きますが、linsolve に 2 つの出力を指定します。MATLAB® は警告を非表示にし、2 番目の出力 r には A の条件数の逆数が含まれます。この構文を使用して、コード内にある特殊なケースの悪条件行列を、コードが警告を出すことなく取り扱うことができます。

[x,r] = linsolve(A,b)
x = 20×1
109 ×

   -0.0000
    0.0000
   -0.0004
    0.0071
   -0.0592
    0.2819
   -0.7821
    1.1830
   -0.7030
   -0.1061
      ⋮

r = 5.6288e-20

入力引数

すべて折りたたむ

係数行列 A は線形方程式系で左辺に AX = B として表示されます。A 内の行の数は B 内の行の数と等しくなければなりません。

A はスパースにできません。スパース行列を含む線形システムを解くには、mldivide または decomposition を代わりに使用します。

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

入力配列。ベクトルまたは行列として指定します。B は線形方程式系で左辺に AX = B として表示されます。B が行列の場合、この行列の各列は右辺の各ベクトルを表します。

A 内の行の数は B 内の行の数と等しくなければなりません。

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

係数行列のプロパティ。構造体として指定します。この構造体を使用して、linsolve がその線形システムに適切なソルバーを選択するのに使用する A のプロパティを指定します。構造体のフィールドには A に各プロパティがあるかどうかを示す true/false の値が含まれています。既定では構造体のすべてのフィールドは false であると仮定されます。この表は、opts にある可能性のあるフィールド、およびそれに対応する行列のプロパティの一覧です。

フィールド行列プロパティ

LT

下三角行列 (非ゼロの値は主対角線上またはその下にのみ出現)

UT

上三角行列 (非ゼロの値は主対角線上またはその上にのみ出現)

UHESS

上ヘッセンベルグ行列 (1 番目の下対角要素より下はすべてゼロ値)

SYM

実数対称行列または複素エルミート行列 (行列は自身の転置と等しい)

POSDEF

正定値 (すべて正固有値)

RECT

方形行列 (異なる行数および列数)

TRANSA

共役転置 — 関数が A*X = B を解くかどうか (opts.TRANSA = false の場合)、または転置された問題 A'*X = B を解くかどうか (opts.TRANSA = true の場合)

例: opts.UT = true は、A が上三角行列であることを指定します。

例: opts.SYM = true, opts.POSDEF = true は、A が対称な正定値であることを指定する 2 つのフィールドを設定します。

有効な組み合わせ

次の表の行は、linsolve に有効な opts 内のフィールド値のすべての組み合わせを示しています。空のセルは既定値の false であり、true/false のエントリは linsolve がいずれの値も受け入れることを示します。

 

LT

UT

UHESS

SYM

POSDEF

RECT

TRANSA

A が下三角行列

true

    

true/false

true/false

A が上三角行列

 

true

   

true/false

true/false

A が上ヘッセンベルグ行列

  

true

   

true/false

A が対称

   

true

true/false

 

true/false

A が方形

     

true/false

true/false

使用についての注釈

  • Aopts のプロパティをもつ場合、linsolvemldivide と比較してより高速です。なぜならば linsolve が即座に適切なソルバーを起動し、A に指定されたプロパティをもたないことを確認する検定を実行しないからです。

  • Aopts で指定されるプロパティを "もたない" 場合、関数 linsolve は、不正確な結果を返し、エラー メッセージを返さない場合があります。したがって、A が指定されたプロパティをもつかどうかが不明な場合は、mldivide または decomposition を代わりに使用します。

データ型: struct

出力引数

すべて折りたたむ

線形システムの解。AX = B (または、opts.TRANSA = true の場合、ATX = B) を満たすベクトルまたは行列として返されます。X のサイズは、opts.TRANSA = true が以下の場合によって異なります。

  • Amn 列で、Bmk 列の場合、Xnk 列になり、これが AX = B の解になります。

  • opts.TRANSA = true の場合、Amn 列で、Bnk 列になります。この場合、Xmk 列であり、これが ATX = B の解になります。

条件数またはランクの逆数。スカラーとして返されます。

  • A が正方行列の場合、rA の条件数の逆数です。

  • A が方形行列の場合、rA のランクです。

  • opts が指定されている場合、RECTtrue で、LTUT の両方が false でない限り、rA の条件数の逆数です。この条件に該当しない場合、rA のランクを与えます。

ヒント

  • linsolve の高速化のメリットは、行列構造と基礎となるアルゴリズムの相対的な最適化によって異なります。場合によっては (行列が小さい場合など)、mldivide と比べて高速にならないことがあります。linsolve の高速化のメリットは、大きな行列の高コストなプロパティ チェックを回避した場合、または mldivide で選択されるものよりも入力に適したアルゴリズムを選択した場合に得られます。

拡張機能

バージョン履歴

R2006a より前に導入