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

17 views (last 30 days)
m17td024
m17td024 on 20 Sep 2018
Commented: Etsuo Maeda on 28 Dec 2018
行列の一般逆行列を計算する際、行列によってすぐに計算されるものとフリーズしてしまうものがあります。行列のサイズに大きな差はないのですが、、、 たとえば、 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 Comments
m17td024
m17td024 on 3 Dec 2018
コメントありがとうございます。
そうです、おっしゃるとおりです。

Sign in to comment.

Accepted Answer

Etsuo Maeda
Etsuo Maeda on 26 Dec 2018
行列のランクを確認すると、行列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 Comments
Etsuo Maeda
Etsuo Maeda on 28 Dec 2018
なかなか万能とはいきませんので、Symbolic演算に限らず、行列計算の際はrankやcondはあらかじめ確認することをおすすめいたします。
HTH

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!