つづき
!関数 ※ベクトル系 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
|