新しく発言する  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 

  2×2の実正方行列による複素数の計算 山中和義 2008/10/01 19:19:30   ツリーへ
2×2の実正方行列による複素数の計算  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:19:30
!2×2の実行列による複素数の計算

DIM ZZ(2,2),T1(2,2),T2(2,2) !作業用


!行列の演算ルーチン

!関数
FUNCTION tr(A(,)) !行列Aのトレース
LET t=0 !対角成分の和
FOR m=1 TO MIN(UBOUND(A,1),UBOUND(A,2))
LET t=t+A(m,m)
NEXT m
LET tr=t
END FUNCTION


!複素数(二元数)の演算ルーチン

DIM i(2,2) !虚数単位
DATA 0,-1
DATA 1, 0
MAT READ i

SUB CompDiv(Z1(,),Z2(,), Z(,)) !除算 z=z1/z2
MAT ZZ=TRN(Z2)
MAT T1=Z1*ZZ !分子
MAT T2=Z2*ZZ !分母
MAT Z=( 2/tr(T2) )*T1
END SUB

!関数
SUB CompZER(Z(,)) !0 ※Z=0
MAT Z=ZER
END SUB
SUB CompIDN(Z(,)) !1 ※Z=1
MAT Z=IDN
END SUB
SUB CompRe(Z(,),ReZ(,)) !zの実部 Re(z)
MAT ZZ=TRN(Z)
MAT T1=Z+ZZ
MAT ReZ=(1/2)*T1 !ReZ=(Z+Z')/2
END SUB
SUB CompIm(Z(,),ImZ(,)) !zの虚部 Im(z)
MAT ZZ=TRN(Z)
MAT T1=Z-ZZ
MAT ImZ=(1/2)*T1 !ImZ=(Z-Z')/2
END SUB
SUB CompConj(Z(,), ZZ(,)) !共役複素数 z'=conj(z)=a-b*i、iは虚数単位
MAT ZZ=TRN(Z) !転置
END SUB
SUB CompABS(Z(,), AbsZ(,)) !絶対値|z|、ABS(z) ※ノルム
MAT ZZ=TRN(Z)
MAT T1=Z*ZZ !Z*Z'=|Z|^2
MAT AbsZ=( SQR( tr(T1)/2 ) )*IDN

!!!別解 MAT AbsZ=( SQR( DET(Z) ) )*IDN
END SUB
SUB CompINV(Z(,), iZ(,)) !逆数 1/z
MAT iZ=INV(Z)
END SUB

!関数 ※ベクトル系
SUB CompDOT(Z1(,),Z2(,), Z(,)) !内積(z1,z2)=a1*a2+b1*b2
MAT ZZ=TRN(Z2)
MAT T1=Z1*ZZ
MAT Z=( tr(T1)/2 )*IDN !tr(Z1*Z2')/2
END SUB
SUB CompNRM(Z(,), nZ(,)) !正規化 |Z|=1
MAT ZZ=TRN(Z)
MAT T1=Z*ZZ !Z*Z'=|Z|^2
MAT nZ=( 1/SQR( tr(T1)/2 ) )*Z

!!!別解 MAT nZ=( 1/SQR( DET(Z) ) )*Z
END SUB

!表記
SUB dispComp(s$,Z(,)) !行列表記の複素数を表示する ※z=[ a, b ]
PRINT s$;"[ ";
PRINT Z(1,1);Z(2,1); !1列目
PRINT "]"
END SUB
SUB Comp(a,b, Z(,)) !複素数を行列表記する ※z=a+b*i、iは虚数単位
MAT T1=a*IDN !実部
MAT T2=b*i !虚部
MAT Z=T1+T2
END SUB
!---------- ここまでがサブルーチン
  つづき 山中和義 2008/10/01 19:20:12   ツリーへ
Re: 2×2の実正方行列による複素数の計算  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:20:12
つづき



DIM A(2,2),AA(2,2)
CALL Comp(2,2, A) !z1=2+2i
CALL dispComp("z1'=",A)
MAT PRINT A;

DIM B(2,2),BB(2,2)
CALL Comp(1,-1, B) !z2=1-i
CALL dispComp("z2'=",B)
MAT PRINT B;


DIM C(2,2) !結果

CALL CompConj(A,C) !共役 z'
CALL dispComp("z1'=",C)

MAT C=A+B !加算 z1+z2
CALL dispComp("z1+z2=",C)

MAT C=A-B !減算 z1-z2
CALL dispComp("z1-z2=",C)

MAT C=(-3)*A !定数倍
CALL dispComp("(-3)*z1=",C)

MAT C=A*B !乗算 z1*z2
CALL dispComp("z1*z2=",C)

CALL CompDiv(A,B, C) !除算 z1/z2
CALL dispComp("z1/z2=",C)

CALL CompABS(A,C) !ノルム
CALL dispComp("|z1|=",C)


CALL CompDOT(A,B,C) !内積
CALL dispComp("(z1,z2)=",C)

CALL CompNRM(A,C) !正規化
CALL dispComp("z1/|z1|=",C)


END
   ├!4×4の実行列によるクォータニオン(四元... 山中和義 2008/10/01 19:21:51   ツリーへ
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:21:51
!4×4の実行列によるクォータニオン(四元数)の計算

DIM ZZ(4,4),T1(4,4),T2(4,4) !作業用


!行列の演算ルーチン
FUNCTION tr(A(,)) !行列Aのトレース
LET t=0 !対角成分の和
FOR m=1 TO MIN(UBOUND(A,1),UBOUND(A,2))
LET t=t+A(m,m)
NEXT m
LET tr=t
END FUNCTION


!クォータニオン(四元数)の演算ルーチン

DIM i(4,4) !虚数単位
DATA 0,-1,0, 0
DATA 1, 0,0, 0
DATA 0, 0,0,-1
DATA 0, 0,1, 0
MAT READ i
DIM j(4,4) !虚数単位
DATA 0, 0,-1,0
DATA 0, 0, 0,1
DATA 1, 0, 0,0
DATA 0,-1, 0,0
MAT READ j
DIM k(4,4) !虚数単位
DATA 0,0, 0,-1
DATA 0,0,-1, 0
DATA 0,1, 0, 0
DATA 1,0, 0, 0
MAT READ k

!関数
SUB QuatZER(Z(,)) !零 ※q=0
MAT Z=ZER
END SUB
SUB QuatIDN(Z(,)) !単位四元数 ※q=1
MAT Z=IDN
END SUB
SUB QuatRe(Z(,),ReZ(,)) !qの実部 Re(q)
MAT ZZ=TRN(Z)
MAT T1=Z+ZZ
MAT ReZ=(1/2)*T1 !ReZ=(Z+Z')/2
END SUB
SUB QuatIm(Z(,),ImZ(,)) !qの虚部 Im(q)
MAT ZZ=TRN(Z)
MAT T1=Z-ZZ
MAT ImZ=(1/2)*T1 !ImZ=(Z-Z')/2
END SUB
SUB QuatConj(Z(,), ZZ(,)) !共役四元数 ※q'=w-x*i-y*j-z*k、i,j,kは虚数単位
MAT ZZ=TRN(Z)
END SUB
SUB QuatABS(Z(,), AbsZ(,)) !絶対値|q| ※ノルム
MAT ZZ=TRN(Z)
MAT T1=Z*ZZ !q*q'=|q|^2
MAT AbsZ=( SQR( tr(T1)/4 ) )*IDN

!!!別解 MAT AbsZ=( DET(Z)^(1/4) )*IDN
END SUB
SUB QuatINV(Z(,), iZ(,)) !逆四元数q^-1
MAT iZ=INV(Z)
END SUB

   │├つづき 山中和義 2008/10/01 19:23:37   ツリーへ
Re: !4×4の実行列によるクォータニオン(四元...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:23:37
つづき


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

!!!別解 MAT nZ=( 1/DET(Z)^(1/4) )*Z
END SUB
SUB QuatCROSS(Z1(,),Z2(,), Z(,)) !外積q1×q2 ※ベクトル(x,y,z)=[0,x,y,z]
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 q(1,1);q(2,1);q(3,1);q(4,1); !1列目
PRINT "]"
END SUB
SUB Quat(w,x,y,z, q(,)) !四元数を行列表記する ※q=w+x*i+y*j+z*k、i,j,kは虚数単位
MAT q=w*IDN !実行列
MAT T1=x*i
MAT q=q+T1
MAT T1=y*j
MAT q=q+T1
MAT T1=z*k
MAT q=q+T1
END SUB
!---------- ここまでがサブルーチン



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

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

   │└つづき 山中和義 2008/10/01 19:24:24   ツリーへ
Re: !4×4の実行列によるクォータニオン(四元...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:24:24
つづき




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

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)); DET(q1)^(1/4) !検算


CALL QuatRe(q1,q)
CALL dispQuat("Re(q1)=",q)

CALL QuatIm(q1,q)
CALL dispQuat("Im(q1)=",q)


CALL QuatDOT(q1,q2,q) !内積
CALL dispQuat("(q1,q2)=",q)
PRINT 3*(-2)+2*(-4)+(-1)*1+(-2)*(-3) !検算

CALL Quat(0,1,2,3, q1) !ベクトル(1,2,3)
CALL Quat(0,-1,1,2, q2) !ベクトル(-1,1,2)
CALL QuatCROSS(q1,q2,q)
CALL dispQuat("q1×q2=",q) !外積



END
   └!2×2の複素行列によるクォータニオン(四... 山中和義 2008/10/01 19:27:00   ツリーへ
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/10/01 19:27:00
!2×2の複素行列によるクォータニオン(四元数)の計算

OPTION ARITHMETIC COMPLEX

DIM ZZ(2,2),T1(2,2),T2(2,2) !作業用


!行列の演算ルーチン

!関数
FUNCTION tr(A(,)) !行列Aのトレース
LET t=0 !対角成分の和
FOR m=1 TO MIN(UBOUND(A,1),UBOUND(A,2))
LET t=t+A(m,m)
NEXT m
LET tr=t
END FUNCTION
SUB MatrixConj(A(,), AA(,)) !複素共役行列 ~A
IF UBOUND(A,1)<>UBOUND(AA,1) OR UBOUND(A,2)<>UBOUND(AA,2) THEN
PRINT "行または列の大きさが違います。"
STOP
END IF
FOR m=1 TO UBOUND(A,1)
FOR n=1 TO UBOUND(A,2)
LET AA(m,n)=conj(A(m,n))
NEXT n
NEXT m
END SUB
SUB MatrixConjTRN(A(,), AA(,)) !複素共役転置行列 A*
DIM T9(100,100)
MAT T9=ZER(UBOUND(A,1),UBOUND(A,2))
CALL MatrixConj(A,T9)
IF UBOUND(A,1)<>UBOUND(AA,2) OR UBOUND(A,2)<>UBOUND(AA,1) THEN
PRINT "行または列の大きさが違います。"
STOP
END IF
MAT AA=TRN(T9)
END SUB


!クォータニオン(四元数)の演算ルーチン

DIM i(2,2) !虚数単位
DATA 0,-1
DATA 1, 0
MAT READ i

!関数
SUB QuatZER(Z(,)) !零 ※q=0
MAT Z=ZER
END SUB
SUB QuatIDN(Z(,)) !単位四元数 ※q=1
MAT Z=IDN
END SUB
SUB QuatRe(Z(,),ReZ(,)) !qの実部 Re(q)
CALL MatrixConjTRN(Z,ZZ)
MAT T1=Z+ZZ
MAT ReZ=(1/2)*T1 !ReZ=(Z+Z')/2
END SUB
SUB QuatIm(Z(,),ImZ(,)) !qの虚部 Im(q)
CALL MatrixConjTRN(Z,ZZ)
MAT T1=Z-ZZ
MAT ImZ=(1/2)*T1 !ImZ=(Z-Z')/2
END SUB
SUB QuatConj(Z(,), ZZ(,)) !共役四元数 ※q'=w-x*i-y*j-z*k、i,j,kは虚数単位
CALL MatrixConjTRN(Z,ZZ)
END SUB
SUB QuatABS(Z(,), AbsZ(,)) !絶対値|q| ※ノルム
CALL MatrixConjTRN(Z,ZZ)
MAT T1=Z*ZZ !q*q'=|q|^2
MAT AbsZ=( SQR( tr(T1)/2 ) )*IDN

!!!別解 MAT AbsZ=( SQR( DET(Z) ) )*IDN
END SUB
SUB QuatINV(Z(,), iZ(,)) !逆四元数q^-1
MAT iZ=INV(Z)
END SUB
    └つづき 山中和義 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
新規発言を反映させるにはブラウザの更新ボタンを押してください。