新しく発言する EXIT インデックスへ
基本行列による行列の基本変形

  基本行列による行列の基本変形 リウ 2007/10/06 01:18:27  (修正1回)
  ・飛び先番号100の削除 山中和義 2007/10/07 20:09:02 
  │└行番号はそのようにして消すのですか。私は... リウ 2007/10/08 11:57:05 
  有理数モード素晴らしい 島村1243 2007/10/08 10:55:21 

  基本行列による行列の基本変形 リウ 2007/10/06 01:18:27  (修正1回) ツリーへ

基本行列による行列の基本変形 返事を書く ノートメニュー
リウ <lphmnuwytg> 2007/10/06 01:18:27 ** この記事は1回修正されてます
!左基本変形を繰り返して階段行列を作る

OPTION ARITHMETIC RATIONAL !有理数モード

DIM A(4,5) !基本変形される行列
DATA 1,1,1,-2,-1,1,2,3,-4,-4,3,0,-3,1,7,0,-1,-2,-1,0
MAT READ A
MAT PRINT A

LET gyo=SIZE(A,1) !行数
LET retu=SIZE(A,2) !列数

DIM X(gyo,gyo) !基本行列を入れるためのもの

DECLARE EXTERNAL SUB P !2つの行を入れ替える基本行列
DECLARE EXTERNAL SUB Q !ある行を定数倍する基本行列
DECLARE EXTERNAL SUB R !ある行に他の行の定数倍を加える基本行列

LET K=1 !階段の行成分

FOR J=1 TO retu !Jは列
IF K>gyo THEN
EXIT FOR
END IF

LET I=K !Iは行
DO WHILE A(K,J)=0 !Oでない成分を(K,J)にもってくる
LET I=I+1
IF I>gyo THEN 100 !(K,J)より下の成分すべてが0ならば、次の列ベクトルの処理に移る
CALL P(X,I,K)
MAT A=X*A
MAT PRINT A
LOOP

CALL Q(X,K,1/A(K,J)) !さきほどもってきた成分を1にする
MAT A=X*A
MAT PRINT A

FOR I=1 TO gyo !Jは行
IF NOT I=K THEN !列ベクトルを単位ベクトルにする
CALL R(X,I,K,-A(I,J))
MAT A=X*A
MAT PRINT A
END IF
NEXT I
LET K=K+1
100 NEXT J

END

!基本行列を求める
EXTERNAL SUB P(A(,),I,J) !I行とJ行を入れ替える基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,I)=0
LET A(J,J)=0
LET A(I,J)=1
LET A(J,I)=1
END SUB

EXTERNAL SUB Q(A(,),I,C) !I行をC倍する基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,I)=C
END SUB

EXTERNAL SUB R(A(,),I,J,C) !I行にJ行のC倍を加える基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,J)=C
END SUB

  ・飛び先番号100の削除 山中和義 2007/10/07 20:09:02  ツリーへ

Re: 基本行列による行列の基本変形 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/10/07 20:09:02
・飛び先番号100の削除
・筆算の参考になるように、掃き出し法の「変形」を記述
の修正



OPTION ARITHMETIC RATIONAL !有理数モード

!!!DIM A(4,5) !基本変形される行列
!!!DATA 1, 1, 1,-2,-1
!!!DATA 1, 2, 3,-4,-4
!!!DATA 3, 0,-3, 1, 7
!!!DATA 0,-1,-2,-1, 0
DIM A(3,4) !連立方程式 Ax=b
DATA 0, 3, 4, 7 !3y+4z=7
DATA 3, 5,-7,10 !3x+5y-7z=10
DATA -1,-1, 2,-3 !-x-y+2z=-3
!DIM A(3,6) !逆行列
!DATA 1,1,1, 1,0,0 !前半分は該当する行列、後半分は単位行列
!DATA 1,2,3, 0,1,0
!DATA 2,4,5, 0,0,1
MAT READ A
MAT PRINT A

LET gyo=SIZE(A,1) !行数
LET retu=SIZE(A,2) !列数

DIM X(gyo,gyo) !基本行列を入れるためのもの

DECLARE EXTERNAL SUB P !2つの行を入れ替える基本行列
DECLARE EXTERNAL SUB Q !ある行を定数倍する基本行列
DECLARE EXTERNAL SUB R !ある行に他の行の定数倍を加える基本行列

LET K=1 !Kは階段の行

FOR J=1 TO retu !Jは列

FOR I=K TO gyo !A(K,J)が0以外の行を探す
LET p=A(I,J)
IF p<>0 THEN EXIT FOR
NEXT I !K行以降がすべて0ならば、次の列へ
IF I<=gyo THEN !そうでなければ

IF I<>K THEN !交換してA(K,J)を0以外にする
CALL P(X,I,K)
MAT A=X*A
MAT PRINT A
END IF

IF p<>1 THEN !A(K,J)で割る(1にする)
CALL Q(X,K,1/p)
MAT A=X*A
MAT PRINT A
END IF

FOR I=1 TO gyo !ピボット列の掃き出し(0にする)
IF I<>K THEN !ピボットは除く
IF A(I,J)<>0 THEN !既に0なら何もしない
CALL R(X,I,K,-A(I,J))
MAT A=X*A
MAT PRINT A
END IF
END IF
NEXT I

LET K=K+1 !次の行へ

END IF

NEXT J

END


!行に関する基本変形を行う基本行列を求める
EXTERNAL SUB P(A(,),I,J) !I行とJ行を入れ替える基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,I)=0
LET A(J,J)=0
LET A(I,J)=1
LET A(J,I)=1

PRINT I;"行と";J;"行を入れ替える"
END SUB

EXTERNAL SUB Q(A(,),I,C) !I行をC倍する基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,I)=C

PRINT I;"行 ×";
IF C<0 THEN PRINT " ( ";C;")" ELSE PRINT C
END SUB

EXTERNAL SUB R(A(,),I,J,C) !I行にJ行のC倍を加える基本行列Aを作る
OPTION ARITHMETIC RATIONAL !有理数モード
MAT A=IDN
LET A(I,J)=C

PRINT I;"行 +";J;"行 ×";
IF C<0 THEN PRINT " ( ";C;")" ELSE PRINT C
END SUB

  │└行番号はそのようにして消すのですか。私は... リウ 2007/10/08 11:57:05  ツリーへ

Re: ・飛び先番号100の削除 返事を書く ノートメニュー
リウ <lphmnuwytg> 2007/10/08 11:57:05
行番号はそのようにして消すのですか。私はまだまだ未熟ですね。

自分でも気付かなかったところがわかったので、参考になりました。

  有理数モード素晴らしい 島村1243 2007/10/08 10:55:21  ツリーへ

Re: 基本行列による行列の基本変形 返事を書く ノートメニュー
島村1243 <bjllmpcujp> 2007/10/08 10:55:21
有理数モード素晴らしい

リウさんのプログラムを実行して、有理数モードと言う機能を初めて知りました。
ExcelVBA等での行列計算ではすべて浮動小数点数値でしか答えが出なかったので、
分数表示で正確な答えが得られるこの機能は素晴らしいですね。


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