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

조회 수: 89 (최근 30일)
YoshikiFukada
YoshikiFukada 2019년 7월 15일
댓글: Tomotaka Hirata 2020년 8월 23일
Matlabで採用している逆行列の計算手法を教えてください。手法を公開している論文などを紹介いただければ幸いです。
特に、実数で、大きいスパース行列についての情報があればありがたいです。
現在、対称な行列の逆行列を計算すると、結果が非対称行列になる現象に遭遇しております。

답변 (2개)

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

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 線形代数에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

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

Start Hunting!