linsolve
線形システム方程式の求解
説明
例
線形システムの求解
mldivide
および linsolve
の両方で線形システムを解き、パフォーマンスを比較します。
mldivide
は、MATLAB® で大半の線形方程式系を解くために推奨される方法です。ただし、関数は入力行列に対して特殊なプロパティがあるかどうかを確認するためのいくつかのチェックを行います。事前に係数行列のプロパティがわかっている場合は、linsolve
を使用して、時間のかかる大きな行列のチェックを回避できます。
10000 行 10000 列の魔方陣行列を作成し、下三角部分を抽出します。opts
構造体の LT
フィールドを true
に設定して、A
が下三角行列であることを示します。
A = tril(magic(1e4)); opts.LT = true;
線形方程式 の右辺について 1 のベクトルを作成します。A
の行数と b
の行数は等しくなければなりません。
b = ones(size(A,2),1);
mldivide
を使用して線形システム を解き、計算時間を測定します。
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
— 係数行列
行列
係数行列 A
は線形方程式系で左辺に AX = B として表示されます。A
内の行の数は B
内の行の数と等しくなければなりません。
A
はスパースにできません。スパース行列を含む線形システムを解くには、mldivide
または decomposition
を代わりに使用します。
データ型: single
| double
複素数のサポート: あり
B
— 入力配列
ベクトル | 行列
入力配列。ベクトルまたは行列として指定します。B
は線形方程式系で左辺に AX = B として表示されます。B
が行列の場合、この行列の各列は右辺の各ベクトルを表します。
A
内の行の数は B
内の行の数と等しくなければなりません。
データ型: single
| double
複素数のサポート: あり
opts
— 係数行列のプロパティ
構造体
係数行列のプロパティ。構造体として指定します。この構造体を使用して、linsolve
がその線形システムに適切なソルバーを選択するのに使用する A
のプロパティを指定します。構造体のフィールドには A
に各プロパティがあるかどうかを示す true
/false
の値が含まれています。既定では構造体のすべてのフィールドは false
であると仮定されます。この表は、opts
にある可能性のあるフィールド、およびそれに対応する行列のプロパティの一覧です。
フィールド | 行列プロパティ |
---|---|
| 下三角行列 (非ゼロの値は主対角線上またはその下にのみ出現) |
| 上三角行列 (非ゼロの値は主対角線上またはその上にのみ出現) |
| 上ヘッセンベルグ行列 (1 番目の下対角要素より下はすべてゼロ値) |
| 実数対称行列または複素エルミート行列 (行列は自身の転置と等しい) |
| 正定値 (すべて正固有値) |
| 方形行列 (異なる行数および列数) |
| 共役転置 — 関数が |
例: opts.UT = true
は、A
が上三角行列であることを指定します。
例: opts.SYM = true, opts.POSDEF = true
は、A
が対称な正定値であることを指定する 2 つのフィールドを設定します。
有効な組み合わせ
次の表の行は、linsolve
に有効な opts
内のフィールド値のすべての組み合わせを示しています。空のセルは既定値の false
であり、true
/false
のエントリは linsolve
がいずれの値も受け入れることを示します。
|
|
|
|
|
|
| |
---|---|---|---|---|---|---|---|
|
|
|
| ||||
|
|
|
| ||||
|
|
| |||||
|
|
|
| ||||
|
|
|
使用についての注釈
A
がopts
のプロパティをもつ場合、linsolve
はmldivide
と比較してより高速です。なぜならばlinsolve
が即座に適切なソルバーを起動し、A
に指定されたプロパティをもたないことを確認する検定を実行しないからです。A
がopts
で指定されるプロパティを "もたない" 場合、関数linsolve
は、不正確な結果を返し、エラー メッセージを返さない場合があります。したがって、A
が指定されたプロパティをもつかどうかが不明な場合は、mldivide
またはdecomposition
を代わりに使用します。
データ型: struct
出力引数
X
— 線形システムの解
ベクトル | 行列
線形システムの解。AX = B (または、opts.TRANSA = true
の場合、ATX = B) を満たすベクトルまたは行列として返されます。X
のサイズは、opts.TRANSA = true
が以下の場合によって異なります。
A
がm
行n
列で、B
がm
行k
列の場合、X
はn
行k
列になり、これが AX = B の解になります。opts.TRANSA = true
の場合、A
はm
行n
列で、B
はn
行k
列になります。この場合、X
はm
行k
列であり、これが ATX = B の解になります。
r
— 条件数またはランクの逆数
スカラー
条件数またはランクの逆数。スカラーとして返されます。
A
が正方行列の場合、r
はA
の条件数の逆数です。A
が方形行列の場合、r
はA
のランクです。opts
が指定されている場合、RECT
がtrue
で、LT
とUT
の両方がfalse
でない限り、r
はA
の条件数の逆数です。この条件に該当しない場合、r
はA
のランクを与えます。
ヒント
linsolve
の高速化のメリットは、行列構造と基礎となるアルゴリズムの相対的な最適化によって異なります。場合によっては (行列が小さい場合など)、mldivide
と比べて高速にならないことがあります。linsolve
の高速化のメリットは、大きな行列の高コストなプロパティ チェックを回避した場合、またはmldivide
で選択されるものよりも入力に適したアルゴリズムを選択した場合に得られます。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
opts
構造体は定数スカラーでなければなりません。コード生成では、オプション構造体の配列はサポートされていません。コード生成では以下のケースのみが最適化されます。
UT
LT
UHESS
=true
(TRANSA
はtrue
またはfalse
のいずれかの値をとります)。SYM
=true
かつPOSDEF
=true
その他のオプションは
mldivide
を使用するのと同等です。コード生成では、この関数のスパース行列入力はサポートされません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意事項および制限事項:
opts
構造体は定数スカラーでなければなりません。コード生成では、オプション構造体の配列はサポートされていません。コード生成では以下のケースのみが最適化されます。
UT
LT
UHESS
=true
(TRANSA
はtrue
またはfalse
のいずれかの値をとります)。SYM
=true
かつPOSDEF
=true
その他のオプションは
mldivide
を使用するのと同等です。コード生成では、この関数のスパース行列入力はサポートされません。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
2 出力の構文
[x,r] = linsolve(___)
はサポートされていません。MATLAB® 関数
linsolve
は、A
が正しくスケーリングされていないか、ほぼ特異か、またはランク落ちの場合に警告を出力します。gpuArray
のlinsolve
ではこの条件を確認できません。この条件の回避措置を取ってください。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
この関数は分散配列を完全にサポートしています。詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)