フィルターのクリア

ある行列の一般逆行列​を求める際にpinv​を使用すると、フリー​ズしてしまいます。

15 ビュー (過去 30 日間)
m17td024
m17td024 2018 年 9 月 20 日
コメント済み: Etsuo Maeda 2018 年 12 月 28 日
行列の一般逆行列を計算する際、行列によってすぐに計算されるものとフリーズしてしまうものがあります。行列のサイズに大きな差はないのですが、、、 たとえば、 A =
[ 3^(1/2)/6, 0, 1/2, -3^(1/2)/(3*h), 0, -1/h, 0, 0]
[ 3^(1/2)/6, 0, 1/2, 3^(1/2)/(3*h), 0, 1/h, 0, 0]
[ -3^(1/2)/12, 3^(1/2)/4, 0, 3^(1/2)/(6*h), -3^(1/2)/(2*h), 0, 0, 0]
[ -3^(1/2)/12, 3^(1/2)/4, 0, -3^(1/2)/(6*h), 3^(1/2)/(2*h), 0, 0, 0]
[ 3^(1/2)/6, 0, -1/2, -3^(1/2)/(3*h), 0, 1/h, 0, 0]
[ 3^(1/2)/6, 0, -1/2, 3^(1/2)/(3*h), 0, -1/h, 0, 0]
[ 0, 0, 0, 0, 0, 0, -1/s, 0]
[ 0, 0, 0, 0, 0, 0, 1/(2*s), 3^(1/2)/(2*s)]
[ 0, 0, 0, 0, 0, 0, 1/(2*s), -3^(1/2)/(2*s)]
はすぐに計算されますが、
B =
[ 3/4, 3^(1/2)/4, 0, 3^(1/2)/8, 3/4, 3^(1/2)/4, 0, 0, 0, 0, 0, 0]
[ 3^(1/2)/4, 0, 0, 0, -3^(1/2)/4, 0, 0, 0, 0, 0, 0, 0]
[ 1/4, 0, 1, 3^(1/2)/4, 1/4, 3^(1/2)/4, 0, 0, 0, 0, 0, 0]
[ -(3*h)/8, (3^(1/2)*h)/8, 0, (3^(1/2)*h)/16, -(3*h)/8, (3^(1/2)*h)/16, 0, 0, 0, 0, 0, 0]
[ -(3^(1/2)*h)/8, 0, 0, 0, (3^(1/2)*h)/8, 0, 0, 0, 0, 0, 0, 0]
[ -h/8, 0, -h/2, (3^(1/2)*h)/8, -h/8, (3^(1/2)*h)/8, 0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, (3^(1/2)*s)/4, 0, 0, -(3^(1/2)*s)/4, 0, -(3^(1/2)*s)/4]
[ 0, 0, 0, 0, 0, 0, 0, 0, -s/4, s/4, s/4, -s/4]
はフリーズします。(s,hはsyms s hでシンボリック変数を作成しています。) 問題点を指摘していただければ、幸いです。よろしくお願い致します。
  2 件のコメント
Aoi Midori
Aoi Midori 2018 年 12 月 3 日
上の記述で行列AとBを作成すると1x8および1x12のサイズになるのですが、9x8および8x12のサイズでpinv実行されたということですよね?
m17td024
m17td024 2018 年 12 月 3 日
コメントありがとうございます。
そうです、おっしゃるとおりです。

サインインしてコメントする。

採用された回答

Etsuo Maeda
Etsuo Maeda 2018 年 12 月 26 日
行列のランクを確認すると、行列Bはランク落ちしています。
低ランクの行列であってもpinvで疑似逆行列計算はできますが、シンボリック演算で解を一意に定めるには時間がかかります。
syms h s
A=[3^(1/2)/6,0,1/2,-3^(1/2)/(3*h),0,-1/h,0,0;
3^(1/2)/6,0,1/2,3^(1/2)/(3*h),0,1/h,0,0;
-3^(1/2)/12,3^(1/2)/4,0,3^(1/2)/(6*h),-3^(1/2)/(2*h),0,0,0;
-3^(1/2)/12,3^(1/2)/4,0,-3^(1/2)/(6*h),3^(1/2)/(2*h),0,0,0;
3^(1/2)/6,0,-1/2,-3^(1/2)/(3*h),0,1/h,0,0;
3^(1/2)/6,0,-1/2,3^(1/2)/(3*h),0,-1/h,0,0;
0,0,0,0,0,0,-1/s,0;
0,0,0,0,0,0,1/(2*s),3^(1/2)/(2*s);
0,0,0,0,0,0,1/(2*s),-3^(1/2)/(2*s)];
rank(A) == min(size(A))
B=[3/4,3^(1/2)/4,0,3^(1/2)/8,3/4,3^(1/2)/4,0,0,0,0,0,0;
3^(1/2)/4,0,0,0,-3^(1/2)/4,0,0,0,0,0,0,0;
1/4,0,1,3^(1/2)/4,1/4,3^(1/2)/4,0,0,0,0,0,0;
-(3*h)/8,(3^(1/2)*h)/8,0,(3^(1/2)*h)/16,-(3*h)/8,(3^(1/2)*h)/16,0,0,0,0,0,0;
-(3^(1/2)*h)/8,0,0,0,(3^(1/2)*h)/8,0,0,0,0,0,0,0;
-h/8,0,-h/2,(3^(1/2)*h)/8,-h/8,(3^(1/2)*h)/8,0,0,0,0,0,0;
0,0,0,0,0,0,(3^(1/2)*s)/4,0,0,-(3^(1/2)*s)/4,0,-(3^(1/2)*s)/4;
0,0,0,0,0,0,0,0,-s/4,s/4,s/4,-s/4];
rank(B) == min(size(B))
HTH
  2 件のコメント
m17td024
m17td024 2018 年 12 月 28 日
ご回答ありがとうございます。
行列によっては、処理出来かねるものもあるということですね、、、
Etsuo Maeda
Etsuo Maeda 2018 年 12 月 28 日
なかなか万能とはいきませんので、Symbolic演算に限らず、行列計算の際はrankやcondはあらかじめ確認することをおすすめいたします。
HTH

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange線形代数 についてさらに検索

Community Treasure Hunt

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

Start Hunting!