ある行列の一般逆行列を求める際にpinvを使用すると、フリーズしてしまいます。
17 views (last 30 days)
Show older comments
行列の一般逆行列を計算する際、行列によってすぐに計算されるものとフリーズしてしまうものがあります。行列のサイズに大きな差はないのですが、、、 たとえば、 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
Accepted Answer
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
on 28 Dec 2018
なかなか万能とはいきませんので、Symbolic演算に限らず、行列計算の際はrankやcondはあらかじめ確認することをおすすめいたします。
HTH
More Answers (0)
See Also
Categories
Find more on 線形代数 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!