PRINT PRINT "< 対称行列の対角化 >" PRINT PRINT "MAT INPUT の方法" PRINT " 1 2" PRINT " 3 4" PRINT "上記の行列の入力方法は、1,2,3,4 です。" PRINT DIM X(2,2),B(2,2),Z1(2,2),Z2(2,2),Q(2,2),W(2,2),R(2,2),S1(2),S2(2) MAT INPUT PROMPT "対称行列を入力してください。 ":X PRINT PRINT "「入力された対称行列を表現行列とする演算テンソル」" FOR i=1 TO 2 PRINT " "; FOR j=1 TO 2 PRINT X(i,j); NEXT j PRINT NEXT i PRINT LET A=(X(1,1)+X(2,2))^2-4*(X(1,1)*X(2,2)-X(1,2)*X(2,1)) ! 2次方程式の解の公式: a=1, b=X(1,1)+X(2,2), c=X(1,1)*X(2,2)-X(1,2)*X(2,1) IF A<0 THEN GOTO 20 LET Y1=(X(1,1)+X(2,2)+SQR(A))/2 ! 2次方程式の解その1 IF Y1=0 THEN GOTO 10 LET Z1(1,1)=X(1,1)-Y1 LET Z1(1,2)=X(1,2) LET K1=Z1(1,2)/SQR(Z1(1,1)^2+Z1(1,2)^2) ! Z1(1,1)*x + Z1(1,2)*y = 0 より、大きさ1の固有ベクトルの x 座標値を求める IF Z1(1,1)*Z1(1,2)<0 THEN LET S1(1)=K1 LET S1(2)=-1*K1*Z1(1,1)/Z1(1,2) ELSE LET S1(1)=-1*K1 LET S1(2)=K1*Z1(1,1)/Z1(1,2) END IF 10 LET Y2=(X(1,1)+X(2,2)-SQR(A))/2 ! 2次方程式の解その2 IF Y2=0 OR Y2=Y1 THEN GOTO 20 LET Z2(1,1)=X(1,1)-Y2 LET Z2(1,2)=X(1,2) LET K2=Z2(1,2)/SQR(Z2(1,1)^2+Z2(1,2)^2) IF Z2(1,1)*Z2(1,2)<0 THEN LET S2(1)=K2 LET S2(2)=-1*K2*Z2(1,1)/Z2(1,2) ELSE LET S2(1)=-1*K2 LET S2(2)=K2*Z2(1,1)/Z2(1,2) END IF PRINT IF S2(1)=-1*S1(2) THEN LET Q(1,1)=ROUND(S1(1),3) LET Q(2,1)=ROUND(S1(2),3) LET Q(1,2)=ROUND(S2(1),3) LET Q(2,2)=ROUND(S2(2),3) ELSE LET Q(1,1)=ROUND(S2(1),3) LET Q(2,1)=ROUND(S2(2),3) LET Q(1,2)=ROUND(S1(1),3) LET Q(2,2)=ROUND(S1(2),3) END IF MAT W=INV(Q) MAT R=X*Q MAT B=W*R PRINT "対角化された「入力された対称行列を表現行列とする演算テンソル」" FOR i=1 TO 2 PRINT " "; FOR j=1 TO 2 PRINT ROUND(B(i,j),3); NEXT j PRINT NEXT i PRINT PRINT PRINT "「入力された対称行列を表現行列とする演算テンソル」の対角化行列" FOR i=1 TO 2 PRINT " "; FOR j=1 TO 2 PRINT Q(i,j); NEXT j PRINT NEXT i GOTO 30 20 PRINT "対角化行列はありません。" 30 PRINT END