Matlabの逆行列​計算法を教えてくださ​い。公開されている論​文や、「○○法」とい​った情報で十分です。

45 views (last 30 days)
YoshikiFukada
YoshikiFukada on 15 Jul 2019
Commented: Tomotaka Hirata on 23 Aug 2020
Matlabで採用している逆行列の計算手法を教えてください。手法を公開している論文などを紹介いただければ幸いです。
特に、実数で、大きいスパース行列についての情報があればありがたいです。
現在、対称な行列の逆行列を計算すると、結果が非対称行列になる現象に遭遇しております。

Answers (2)

Yoshio
Yoshio on 15 Jul 2019
Edited: Yoshio on 16 Jul 2019
こちらに概要説明があります。
アルゴリズム
inv は、入力行列の LU 分解 (または、入力行列がエルミートの場合は LDL 分解) を実行します。その後、その結果を使用して、解が逆行列 inv(X) である線形システムを形成します。スパース入力の場合、inv(X) はスパース単位行列を作成し、バックスラッシュ X\speye(size(X)) を使用します。
なお、このページにあるヒントも参考になるかと思います。
ヒント
  • 行列の明示的な逆行列を求める必要はあまりありません。関数 inv は、線形方程式系 Ax = b を解くときにしばしば誤用されます。この方程式を解く 1 つの方法は、x = inv(A)*bを使うことです。実行時間と数値精度の両面でより優れた方法は、行列バックスラッシュ演算子を x = A\b のように使用することです。この場合、逆行列を明示的に求めることなく、ガウスの消去法を使って解を求めます。詳細については、mldivide を参照してください。

YoshikiFukada
YoshikiFukada on 17 Jul 2019
ありがとうございます。mldivideに掲載されているというのは知りませんでした。ご指摘の通り、実際にやっている計算は、バックスラッシュ演算子による連立方程式の解です。
現在やっている計算は、少し特殊でして、対角要素に非常に小さい値が入っていて、正則ではあるが特異性が高い行列です。
逆行列計算の中でエルミート判定に失敗したか、その前の計算で桁落ちなどで対称性が壊れていたかのどちらかでしょうね。
後者の方をまずあたってみます。
いったん解決といたします。
ありがとうございました。
  1 Comment
Tomotaka Hirata
Tomotaka Hirata on 23 Aug 2020
詳しくないので余計なことかもしれませんが...
oldDigits = digits(欲しい有効桁数);
としてから
関数(vpa("変数")) %大きすぎる変数の場合は、文字列で括る
とすると、任意精度で計算できます。これを利用することで桁落ちを防ぐことが出来ます。
また、digitsを元に戻したい場合、
digits(oldDigits);
とします。

Sign in to comment.

Categories

Find more on 線形代数 in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!