필터 지우기
필터 지우기

ある行列の一般逆行列​を求める際に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 CenterFile Exchange에서 線形代数에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!