新しく発言する  EXIT  インデックスへ

2×2の実正方行列による複素数の計算


  2×2の実正方行列による複素数の計算 山中和義 2008/10/01 19:19:30 
  つづき 山中和義 2008/10/01 19:20:12 
   ├!4×4の実行列によるクォータニオン(四元... 山中和義 2008/10/01 19:21:51 
   │├つづき 山中和義 2008/10/01 19:23:37 
   │└つづき 山中和義 2008/10/01 19:24:24 
   └!2×2の複素行列によるクォータニオン(四... 山中和義 2008/10/01 19:27:00 
    └つづき 山中和義 2008/10/01 19:28:00 
Re: !2×2の複素行列によるクォータニオン(四...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:28:00
つづき


!関数 ※ベクトル系
SUB QuatDOT(Z1(,),Z2(,), Z(,)) !内積(q1,q2)=w1*w2+x1*x2+y1*y2+z1*z2
CALL MatrixConjTRN(Z2,ZZ)
MAT T1=Z1*ZZ
MAT Z=( tr(T1)/2 )*IDN !tr(q1*q2')/2
END SUB
SUB QuatNRM(Z(,), nZ(,)) !正規化 |q|=1
CALL MatrixConjTRN(Z,ZZ)
MAT T1=Z*ZZ !q*q'=|q|^2
MAT nZ=( 1/SQR( tr(T1)/2 ) )*Z

!!!別解 MAT nZ=( 1/SQR( DET(Z) ) )*Z
END SUB
SUB QuatCROSS(Z1(,),Z2(,), Z(,)) !外積q1×q2 ※ベクトル(x,y,z)=[0,x,y,z]
!積q1*q2=(s1, V1)*(s2, V2)=(s1*s2-(V1,V2), s1*V2+s2*V1+V1×V2)
MAT Z=Z1*Z2 !w=0より、q1*q2=-(q1,q2)+q1×q2
CALL QuatDOT(Z1,Z2,T1)
MAT Z=Z+T1
END SUB

!表記
SUB dispQuat(s$,q(,)) !行列表記の四元数を表示する ※q=[ (w,x) (y,z) ]
PRINT s$;"[ ";
PRINT Re(q(1,1));Im(q(1,1)); Re(q(1,2));Im(q(1,2)); !1行目
PRINT "]"
END SUB
SUB Quat(w,x,y,z, q(,)) !四元数を行列表記する ※q=w+x*i+y*j+z*k、i,j,kは虚数単位
!q=a+b*i+c*j+d*k、i,j,kは虚数単位
!┌ a+b*i c+d*i ┐=a*1+b*I+c*J+d*K
!└ -c+d*i a-b*i ┘
!パウリ行列
!1=┌ 1 0 ┐
! └ 0 1 ┘
!I=┌ i 0 ┐
! └ 0 -i ┘
!J=┌ 0 1 ┐
! └ -1 0 ┘
!K=┌ 0 i ┐
! └ i 0 ┘
LET q(1,1)=COMPLEX(w,x)
LET q(1,2)=COMPLEX(y,z)
LET q(2,1)=COMPLEX(-y,z)
LET q(2,2)=COMPLEX(w,-x)
END SUB
!---------- ここまでがサブルーチン


!q1,q2を複素行列で表現する
DIM q1(2,2) !q1=3+2i-j-2k
CALL Quat(3,2,-1,-2, q1)
CALL dispQuat("q1=",q1)
MAT PRINT q1; !debug debug debug

DIM q2(2,2) !q2=-2-4i+j-3k
CALL Quat(-2,-4,1,-3, q2)
CALL dispQuat("q2=",q2)
MAT PRINT q2;


DIM q(2,2),qq(2,2) !結果

CALL QuatConj(q1,q) !共役 q'
CALL dispQuat("q1'=",q)

MAT q=q1+q2 !加算 q1+q2
CALL dispQuat("q1+q2=",q)

MAT q=q1-q2 !減算 q1-q2
CALL dispQuat("q1-q2=",q)

MAT q=(-3)*q2 !実数倍
CALL dispQuat("(-3)*q1=",q)

MAT q=q1*q2 !乗算 q1*q2
CALL dispQuat("q1*q2=",q)

MAT q=q2*q1 !q2*q1
CALL dispQuat("q2*q1=",q) !q1*q2≠q2*q1

CALL QuatABS(q1,q) !ノルム
CALL dispQuat("|q1|=",q)
PRINT DET(q1); SQR(DET(q1))


END

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。