ある行列の一般逆行列を求める際にpinvを使用すると、フリーズしてしまいます。
16 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
m17td024
am 20 Sep. 2018
Kommentiert: Etsuo Maeda
am 28 Dez. 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 Kommentare
Akzeptierte Antwort
Etsuo Maeda
am 26 Dez. 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 Kommentare
Etsuo Maeda
am 28 Dez. 2018
なかなか万能とはいきませんので、Symbolic演算に限らず、行列計算の際はrankやcondはあらかじめ確認することをおすすめいたします。
HTH
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu 線形代数 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!