5 専用チップでの過程 29
c p w (k)
c
p (23)
(24)
(23)TC
2 C
1
CP T
wの計算(実はこれはスカラー です。)
(24)AC
1 S
0
CP T
wの計算終了
w (k)
- 1 2 cp w T
p (25) (26)
(27)
(25) IS
1 (0
1
2 )
(26) TS
1 S
0 0
1
2 cp
T
wをつくる。
(27) CC
2 C
1
w (k)
cp w T
w (k)
1 - 2
1 - 2 p (28)
(29)
5 専用チップでの過程 30
w (k) q p - 1 2 cwp w T
(30)
(30)AM
1 C
1
q = p0 c
2 wP
T
w の計
算終了。
w (k)
w (k)
(34)
(32) (31)
(33)
q q
(30-2)CLR M
1
(31)CC
1 M
1
(1列目)
qをM1上へ入れる
(32)CC
2 C
1
(33)CC
1 R
1
(34)CM
1 (1)C
1
w (k)
w (k)
-1 (38)
- q (35)
(37) (36)
(40)
(35)IS
0 (01)
(36)TS
0 C
1
-q できる
(37)CC
1 M
1
(38)TR
1 M
1 0qw
T の計算終了。
(39)AM
1 M
2
A 0 qw
T の計算終
了。
5 専用チップでの過程 31
w (k) w (k)
(36)
-q (43)
(41) (42)
(40)
(44)
(40)CC
1 R
1
(41)CC
2 C
1
(42)CC
1 M
1 (all)
(43)TR
1 M
1 0wq
T の計算終了。
(44)AM
1 M
2
以上をN 02回繰り返すことによりM2 の行列が対角化され三重対角化は完成され る。4
4
/home2/students/mizuki/xg/no1.eps〜no18.eps
5 専用チップでの過程 32
5.2 二分法の過程
ここでkは1から25 まで動きkkは 1からN まで動く。なぜkが25なのかとい うと 2分法では1回ごとに幅が 1
2
ずつ狭くなるのでこの回数が精度に影響する。い まは 25回としているが50回以上(できれば64回くらい)がよい。
kkはN 回でこれは行列の行数(または列数)である。
A ~
(0)M
1
;M
2に三重対角化されたA~ が入る。
α 1
α n β n-1
α n-1 β n-1 β 1
α 2 β 2
β 2 α 3 β 1
β 2
β n-1
β 1
0
2 2
- 2
-- 0
0
(1) (2)(3)
(4)
(1)(FM
1 )C
2 副対角成分をC2に 入れる。
(2)TC
2 C
2
(3)T(01)C
2
01をC2に掛け結果 をC2に入れる。
(4)ZM
1 M
1の絶対値をとる。
5 専用チップでの過程 33
α 1
α n β n-1 α n-1
β n-1
β 1
α 2 β 2
β 2 α 3
β 1 0
0
0 0
(5)
r r max (6)
(5)AM
1 C
1
(6-1)Max(C
1 )S
0 C
1の最大値をと りS0に入れる。
α 1 α 2 α 3
α n
α n-1 β n-1
β n-1 β 1
α n
α n-1 α 2
β 2 β 2 α 3 β 1
α 1
0 0
(6-2)
(6-2)(TM
1 )C
1
ここ(7)からは仮にR3
;R
4
;R
5を 用いている。これは 2分法の上限 下限を表している。
(7-1)CS
0 R
4
(7-2)InputS
1 (01)
(7-3)TS
1 R
4
(7-4)MS
0 R
3
(7-5)AR
3 R
4
α 1 α 2 α 3
α n
α n-1 β n-1
β n-1 β 1
α n α n-1 α 2
β 2 β 2 α 3 β 1
α 1
0 0
(7-6)MR
4 R
5
(7-7)InputS
1 (0:5)
(7-8)TS
1 R
5
(7-9)MR
3 R
4
(7-10)T(01)R
4
012R
4の計算
以 上 で は じ め の 範 囲(0rか らr) が確定する。
5 専用チップでの過程 34
α 1 α 2 α 3
α n
α n-1 β n-1
β n-1
β 1
α n α n-1 α 2
β 2 β 2 α 3 β 1
α 1
0 0
(8-0)T(01)R
5 (all)
(8-1)MC
1 i(1)M
1
(1;k)k は移動す る。
(8-2)AR
5 (1)M
1
(1;kk) kk は移動 する。
(9)MM
1
(k01;kk)R
1 (kk)
(10)MC
1 (k)M
1
(k;kk)
(11)GR
1
(kk)R
1の逆数をとる
(12)TC
2
(k-1)R
1
(kk)kkは列です
(13)AR
5 (1)M
1
(1;kk) kkは列で 移動する。
(14)MM
1
(k-1,kk)R
1
(kk)M
1の(k-1 行kk列)の値をR1のkk列に入れる。
なお(9)〜(14)まではN 回繰り返す。(これは1列目からN 列目までといること である。)
(15)MC
1 (k)M
1
(k;kk)
(16)CountこれはM1のそれぞれの列ベクトルの値が正である数を数えて結果をR1
に入れる。
(17)Compare R
1とR2の比較をする。R2 には左から1、2、3、と順に値が入って いる。この結果
r1j[j]>= r2j[j]なら
r4j[j]=r5j[j]そしてr5j[j]= r4[j]+r3[j]
2
となり、
そうでないならr3j[j]=r5j[j]そして r5j[j]= r4j[j]+r3j[j]
2
となる。
5 専用チップでの過程 35 このあと
(18)MR
5 R
6
(kk) kkは移動する。
(19)InputR
4 (0)
(20)MR
6 R
3
(21) R
3
(kk+1)+R
4
(kk+1)
2
をR5
(kk+1)へ(kkは列を表す。)
このあと(8-0)へいきkk回繰り返す。
そしてそれぞれの列で計算するのでN 回繰り返す。
以上の過程でR6に固有値が入る。
(ただし2分法はR6まであるのでさらに改良する可能性がある。) 5
5
/home2/students/mizuki/xg2/no1.eps〜no6.eps
5 専用チップでの過程 36
5.3 逆反復法の過程
µ
(0)M
1に行列を入れる。この行列 をAとする。
µ -1 -1 -1
(1) (2)
(3)
-A
(1)IS
0 (01)
(2)CS
0 R
1
(3)TR
1 M
1
M
1 には0Aがはいる
nn
-a -a
-a
-a
11 22
33
-a -a -a
-a
11 22 33
nn
µ -1 -1
(4) µ
(5-1)
(4)MTM
1 C
1 M
1 の対角成分をC1 に入れる。
(5-1)CS
1 S
0
5 専用チップでの過程 37
11 22
µ -a µ -a
33
-a
-a nn
µ
µ
µ-a 22
33
µ -a
-a nn
µ µ
µ -a 11
(6) (5-2)
(5-2)AS
0 C
1
(6)C
1 をM1 の対角成分に入れる。
X 11
X n1
X 1n
X nn
x 1
x n
x 2
N
N+1
ここでX =I 0Aとおき成分を
X
11で表す。
また
x= 0
B
B
B
B
B
B
B
@ x
1
x
2
.
.
.
x
n 1
C
C
C
C
C
C
C
A
を任意の初期ベクトルとする。
X nn
X 11
X n1 x n
x 2
X 1n x 1
X 11
N
N+1 -X 11
-X n1
-1 X
1n x X 11 1
(10)
(8)
(9) (7)
(7)IS
0 (01)
(8)CM
1
(j列)C1 (9)CM
1
(i行)R1 (10)TS
0 C
1
5 専用チップでの過程 38
X nn x n x 2
X 1n x 1
X
11
X n1
N
N+1 -X 11
-X n1
X 1n x X 1
11 1
X
11
(12) (11)
(13)
(11)CR
1
(j列)S0
(12)GS
0
X nn x n
11
1 X X 12
11
x 1
X X 1n X 11
x 2 11
1 X X 12
11
x 1
X X 1n X 11
X n1
-X n1 1 X
11
X 22 X 21
0 X 21
(14)
(17) M 2 (15)
(16)
(13)
(18)
(13)TS
0 R
1
(14)CR
1 M
1 (j列)
(15)IS
0 (0)
(16)CS
0 C
1 (i行)
(17)CM
1 M
2
11
1 X X 12
11
x 1
X X 1n X 11
X 21
- X
- 21 X X
12 11
X 21
- X 11 x 1
-X n1 0 X 21
(18)
(19)
0 0 0 0
(18)CC
1 M
1
(19)TR
1 M
1
(20)AM
2 M
1
5 専用チップでの過程 39
U k 1
1
1 1
0 0
(7)〜(21)をN 回繰り返す。この 結果n+1 列目にできるベクトル
U
kが固有ベクトルとなる。
結果n + 1列目にできるベクトルUkが固有ベクトルとなり、これをとりだせば良 い。6
6以上の図は/home2/students/mizuki/xg3/no1.epsからno10.eps
6 考察 40
6
考察
前章までで述べたように多くの機能を現段階では用いねばならないが実現できる ことがわかった。しかしまだ問題点が多くあり改良しなければならない。
まずシミュレーションプログラムについてはさらなる検討の余地がある。特に無 駄な部分を取りシミュレーションプログラム自体の時間の短縮が必要である。
実際に計算させたところハウスホルダー変換では1282 128行列で7.12秒なのに 対し 逆行列での計算(逆反復法)がかなりの時間(1282128行列で 284秒)を要し、
改良しなければならない。(しかしこれはファイルアクセスの時間も含んでいる。) また2分法でのプログラムはレジスターの数が多く定義(R1からR6の6つ)して いる。これは途中結果を1回1回格納しなければならないためだか、なるべくレジ スターを有効に利用し少なくなるようにしなければならない。あまりに多過ぎると チップをつくるのが困難になってしまう可能性がある。
7 結論 41
7
結論
この専用チップを用いた結果、現段階では多くの過程が必要だが専用チップを用 いて固有値固有ベクトルを求めることが可能である。
そしてチップのさらなる効率化を考えハード化することにより固有値固有ベクト ルを求める際専用チップを用い計算時間が短縮すると考えられる。
7 結論 42
謝辞
本研究及び論文作成に当たり、終始御懇切なる御指導、御鞭撻を賜わりました指 導教官である齋藤理一郎助教授に衷心より御礼の言葉を申しあげます。
また、本研究を進めるにあたり、熱心な御指導をいただくとともに種々の御高配を 賜わりました木村忠正教授、湯郷成美助教授に深謝の意を表します。
また、研究活動をともにし、多くの援助をいただいた八木将志氏に深謝いたします。
そして、数々の御援助、御助言をしていただいた中平政男氏、竹谷隆夫氏、はじめ 木村1齋藤研究室の大学院生、卒研生の方々、高田さんをはじめ(株)画像技研の方々 に感謝します。
参考文献 43
参考文献
[1] 数値計算の手順と実際 高田勝 春海佳三朗 コロナ社
[2] FORTRAN77 数値計算プログラミング 森正武 岩波書店
[3] C言語によるプログラミング(基礎編・応用編) 内田智史 オーム社
[4] C言語による最新アルゴリズム辞典 奥村春彦 技術評論社
A 付録・シミュレーションプログラム 44
A
付録・シミュレーションプログラム
このプログラムは hhc.c , 2bun.c ,gyaku.c の 3つのプログラムからな り,hhc.c はハウスホルダー変換の実行 2bun.c は 2分法の実行
gyaku.c は逆反復法を実行する。
なおhhc.c の実行ファイルを実行するとal.dat ,be.dat というファイルができる。
これは三重対角行列の対角成分(al.dat)副対角成分(be.dat)が入っている。
2bun.c の実行ファイルを実行するとal.datとbe.dat を読み込み
koyuu.dat という固有値がはいったファイルができる。
最後にgyaku.c の実行ファイルを実行するとkoyuu.dat を読んで
koyuuvec.dat という固有ベクトルが入ったファイルができる。
/*---ハウスホルダー変換プログラム
hhc.c 1997 1 23 Mizuki Nakajima
---*/
/*---include
---*/
#include<stdio.h>
#include<math.h>
#include<time.h>
#define N 4 /* 行列N 行 N 列 の配列を定義する */
#include"register.h" /* 専用チップのレジスタの定義 */
/* #define DBGPRN */ /* 途中経過を出力するか?
#define DBGPRN をコメントアウトすると出力しない */
/*---*/
int i,j ; /* i行 j列 */
int k ;
int s = 1; /* s = start */
/*---プロトタイプ宣言
---*/
void input ( void );/* この関数を用いる */
void input_m2 ( void );
void input_test ( void ); /* test */
/*---以下は
input_c1i などの関数はc1iに値0を入れる関数
print_m1 などの関数はm1に値0を入れる関数
_ の後には格納場所が入る
これは後の2分法、逆反復法も同様である
---*/
void input_c1i( void );
void input_c2i( void );
void input_r1j( void );
void input_r2j( void );
void print_m1( void );
void print_m2( void );
void print_c1i( void );
void print_c2i( void );
void print_r1j( void );
void print_r2j( void );
/*---以下は
ハウスホルダー変換により三重対角化するため 一つの過程を一つの関数として表示し
関数を組み合わせてハウスホルダー変換を実現している
---*
void m1_c1i ( int j ); /* (1) jは列 */
void s0_c1i ( int i ); /* (3) iは行 */
void c1i_c2i( void ); /* (4) */
void tc2_c1 ( void ); /* (5) */
double ac1i_s0 ( void );/* (6) (13) */
void sqrt_s0( void ); /* (7) */
void mc2i_s1 ( int i ); /* (8) iは行*/
void as1_s0 ( void ); /* (9) */
void ms0_c2i( int i ); /* (10) */
void mc1i_c2i( void ); /* (11-1) */
void mc2i_r1j( void ); /* (11-2) */
void tc2i_c1i( void ); /* (12) */
void ts1_s0 ( void ); /* (16) */
void ts0_r1j ( void ); /* (17) */
void tr1j_m1 ( void ); /* (18) (38) */
double am1_c1i ( int i ); /* (19) */
double am1_c1i_2 ( int i ); /* (30) */
void clr_m1 ( void ); /* (20) */
void mc1i_m1 ( int j ); /* (21) (29) (31)(37)(51)*/
void ts0_c1i ( void ); /* (22) (36) */
/* (23)はある */
A 付録・シミュレーションプログラム 45
void mc2i_c1i ( void ); /* (11-1)(27)(32) (50)*/
void mc1i_r1j( void ); /* (33) (40)*/
void mm1_c1i ( int j ); /* (34) */
void am1_m2 ( void ); /* (35) */
void mm2_m1( void ); /* end */
void mm2_m3( void );
void mm3_m2( void );
void mr1j_m2 ( void ); /* Qの計算 */
void tc1i_m2 ( void );
void ms0_c1i( int i );
void ts2_m2 ( void ) ;
void ar2j_m2 ( int a );
/*---main ( )
---*/
void main( void )
{
FILE *q ;
FILE *fp ;
FILE *fp1;
#ifdef DBGPRN
time_t t;
t = time( NULL );
printf("%s\n",ctime( &t ));
#endif
/* 専用レジスタ clear */
s0 = 0;
s1 = 0;
s2 = 0;
/* 専用レジスタに数値代入 */
input( ); /* m1 m2 に数値代入 */
input_c1i( );
input_c2i( );
input_r1j( );
input_r2j( );
#ifdef DBGPRN
printf("もとの行列表示\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
/*---3重対角化 start
---*/
/* kを動かす k=1 から k を用いるのは 1,3,です */
for ( k = 1 ; k <= (N-2) ; k++){
m1_c1i ( k ); /* (1) m1_c1移動 kは列*/
s0 = 0 ; /* (2) clr_s0 */
s0_c1i( k ); /* (3)-1 */
#ifdef DBGPRN /* 確認 */
printf("(3)終了後 \n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
c1i_c2i( ); /* (4) mc1i_c2i */
tc2_c1 ( ); /* (5) tc2_c1 */
s0 = ac1i_s0( );/* (6) ac1_s0 */
#ifdef DBGPRN /* 確認 */
printf("(6)終了後 \n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
A 付録・シミュレーションプログラム 46
print_r1j( );
print_r2j( );
#endif
sqrt_s0( ); /* (7) */
#ifdef DBGPRN /* 確認 */
printf("(7)\n");
printf("s0 = %f (sの答え)\n",s0);
printf("(8)start\n");
printf("k= %d \n",k);
#endif
mc2i_s1( k+1 ); /* (8) */
as1_s0( ); /* (9) */
#ifdef DBGPRN
printf("(9) \n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
#ifdef DBGPRN
printf("符号確認 \n");
printf("s0 = %f\n",s0);
#endif
ms0_c2i( k+1 ); /* (10) */
#ifdef DBGPRN
printf(" w の値\n");
print_c2i( );
#endif
mc2i_c1i( ); /* (11-1) */
mc2i_r1j( ); /* (11-2) */
#ifdef DBGPRN /* 確認 */
printf("(11-2)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
/*---Q の計算 (No 1) ---*/
mr1j_m2( ); /* Q の計算 (1) */
tc1i_m2( ); /* Q の計算 (2) w * w^T の計算終了 */
/*---Q の計算 end (No 1) ---*/
tc2i_c1i( ); /* (12-1) */
s0 = ac1i_s0( );/* (13) w^T * w の計算終了 */
#ifdef DBGPRN /* 確認 */
printf("(13)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( ) ;
print_m2( ) ;
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
s1 = 2 ; /* (14) */
if ( s0 == 0 ){
printf("s0 = 0 です。0で割れません!! \n");
}
else{
s0 = 1 / s0 ; /* (15) */
}
#ifdef DBGPRN /* 確認 */
printf("(15)\n");
printf("s0 = %f\n",s0);
#endif
ts1_s0( ); /* (16) c の計算 終了 */
/*---Q の計算 (No 2) ---*/
A 付録・シミュレーションプログラム 47
for ( i = 1 ; i <= N ; i++){
ms0_c1i( i ); /* (3) */
}
tc1i_m2( ); /* (4) */
s2 = -1 ; /* (5) */
ts2_m2( ); /* (6)*/
for ( i = 1 ; i <= N ; i++ ){
r2j[i] = 1 ; /* (7) */
ar2j_m2( i ); /* (8) */
#ifdef DBGPRN
printf(" (7) Input r2j(%d) \n ",i);
printf(" (8) ar2j(%d)_m2(%d) \n ",i,i);
print_r2j( );
#endif
for( j = 1 ; j <= N ; j++){
r2j[j] = 0 ;
}
}
/* printf(" result \n");
* print_m1( );
* print_m2( );
*/
/*---Q の計算 (No 2) end---*/
if((q=fopen("q.dat","a")) == NULL){
printf("Can not open file q.dat!! \n");
exit(1);
}
fprintf (q," k = %d\n",k);
for ( i = s; i <= N ; i++ ){
for ( j = s ; j <= N ; j++ ){
fprintf( q, "%10.6lf",m2[i][j] );
}
fprintf(q,"\n");
}
fclose(q);
ts0_r1j( ); /* (17) */
#ifdef DBGPRN /* 確認 */
printf("(17)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
tr1j_m1( ); /* (18) */
for ( i = s; i <= N; i++){
c1i[i] = am1_c1i( i ); /* (19) P=cAW の計算終了 */
/* printf(" c1i[%d]= %f \n",i,c1i[i]); */
}
#ifdef DBGPRN /* 確認 */
printf("(19)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
clr_m1( ); /* (20) */
j = s; /* jは固定 (一番左端の列) */
mc1i_m1 ( j ); /* (21 ) */
ts0_c1i ( ); /* (22) */
#ifdef DBGPRN /* 確認 */
printf("(22)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
A 付録・シミュレーションプログラム 48
print_c2i( );
print_r1j( );
print_r2j( );
#endif
tc2i_c1i ( ); /* (23) */
s0 = ac1i_s0_2( ) ;
#ifdef DBGPRN /* 確認 */
printf("(24)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
s1 = -0.5 ; /* (25) */
ts1_s0( ) ; /* (26) */
mc2i_c1i ( ); /* (27) */
#ifdef DBGPRN /* 確認 */
printf("(27)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
ts0_c1i( ) ; /* (28) */
#ifdef DBGPRN /* 確認 */
printf("(28)終了後\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
j=s+1; /* jは任意 (ただしjは(21)でいれた値+1です!!)(一番左端の列) */
mc1i_m1( j ); /* (29) */ /* 注意 jの値 */
#ifdef DBGPRN /* 確認 */
printf("(29)終了後\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
for( i= s; i <=N ; i++){
c1i[i] = am1_c1i_2(i ); /* (30-1) */
/* printf(" c1i[%d] = %f \n",i,c1i[i]); */
}
#ifdef DBGPRN /* 確認 */
printf("(30-1)終了後\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
A 付録・シミュレーションプログラム 49
clr_m1( );/* (30-2) */
j = s ; /* jは固定 (一番左端の列) */
mc1i_m1( j ); /* (31) */
mc2i_c1i( );/* (32) */
mc1i_r1j( );/* (33) */
#ifdef DBGPRN /* 確認 */
printf("(33)end \n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
j = s ;
mm1_c1i( j ); /* (34) j 固定 */
#ifdef DBGPRN /* 確認 */
printf("(34)\n");
print_m1( );
print_c1i( );
#endif
s0 = -1; /* (35) */
ts0_c1i ( ); /* (36) */
#ifdef DBGPRN /* 確認 */
printf("(36)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
for ( j =s; j <=N ; j++){
mc1i_m1( j ); /* (37) */
}
#ifdef DBGPRN /* 確認 */
printf("(37)\n");
print_c1i( );
print_m1( );
#endif
tr1j_m1( ) ;/* (38) */
#ifdef DBGPRN /* 確認 */
printf("(38)\n");
print_r1j( );
print_m1( );
#endif
if ( k == 1 ) {
input_m2( );
}
else {
mm3_m2( );
}
am1_m2 ( ) ; /* (39) */
#ifdef DBGPRN /* 確認 */
printf("(39)\n");
print_m1( );
print_m2( );
#endif
#ifdef DBGPRN /* 確認 */
printf("(39)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
A 付録・シミュレーションプログラム 50
mc1i_r1j( ); /* (40) */
#ifdef DBGPRN /* 確認 */
printf("(40)\n");
print_c1i( );
print_r1j( );
#endif
mc2i_c1i( ); /* (50) or (41)*/
#ifdef DBGPRN /* 確認 */
printf("(50) -->(41)\n");
print_c2i( );
print_c1i( );
#endif
for ( j =s; j <=N ; j++){
mc1i_m1 ( j ); /* (51) 本当は(42)*/
}
#ifdef DBGPRN /* 確認 */
printf("(51) -->(42)\n");
print_c1i( );
print_m1 ( );
#endif
tr1j_m1( ); /* (52) */
#ifdef DBGPRN /* 確認 */
printf("(52) -->(43)\n");
print_r1j( );
print_m1 ( );
#endif
am1_m2 ( ); /* (53)本当は(44) */
#ifdef DBGPRN /* 確認 */
printf("(53)-->(44)\n");
printf("s0 = %f\n",s0);
printf("s1 = %f\n",s1);
printf("s2 = %f\n",s2);
print_m1( );
print_m2( );
print_c1i( );
print_c2i( );
print_r1j( );
print_r2j( );
#endif
#ifdef DBGPRN
printf("結果\n");
print_m2( );
#endif
for ( i = s; i<=N ;i++){
al[i] = m2[i][i] ;
/* printf ("al[%d]= %lf \n",i,al[i]); */
}
for ( i =s; i<=N-1 ;i++){
be[i] = m2[i+1][i] ;
/* printf ("be[%d]= %lf \n",i,be[i]); */
}
mm2_m3( );
mm2_m1( ); /* m2 m1 copy */
#ifdef DBGPRN /* 確認 m2 and m1 */
print_m2( );
print_m1( );
#endif
s = s + 1 ;
/* 専用レジスタ clear */
s0 = 0;
s1 = 0;
s2 = 0;
input_c1i( );
input_c2i( );
input_r1j( );
input_r2j( );
} /* for end */
if((fp=fopen("al.dat","w")) == NULL){
printf("Can not open flie al.dat!! \n");
exit(1);
}
if((fp1=fopen("be.dat","w")) == NULL){
printf("Can not open file be.dat!! \n");
exit(1);
}
for ( i = 1; i <=N ; i++ ){
A 付録・シミュレーションプログラム 51
fprintf(fp1,"%f \n ",be[i]);
}
fclose(fp);
fclose(fp1);
} /* main end */
/*********************************************************
* 行列 input 関数
*********************************************************/
void input ( void )
{
m1[1][1] = 4; m1[1][2] = 3; m1[1][3] = 2; m1[1][4] = 1;
m1[2][1] = 3; m1[2][2] = 3; m1[2][3] = 2; m1[2][4] = 1;
m1[3][1] = 2; m1[3][2] = 2; m1[3][3] = 2; m1[3][4] = 1;
m1[4][1] = 1; m1[4][2] = 1; m1[4][3] = 1; m1[4][4] = 1;
m2[1][1] = 4; m2[1][2] = 3; m2[1][3] = 2; m2[1][4] = 1;
m2[2][1] = 3; m2[2][2] = 3; m2[2][3] = 2; m2[2][4] = 1;
m2[3][1] = 2; m2[3][2] = 2; m2[3][3] = 2; m2[3][4] = 1;
m2[4][1] = 1; m2[4][2] = 1; m2[4][3] = 1; m2[4][4] = 1;
}
/*********************************************************
* 行列 input_m2 関数
*********************************************************/
void input_m2 ( void )
{
m2[1][1] = 4; m2[1][2] = 3; m2[1][3] = 2; m2[1][4] = 1;
m2[2][1] = 3; m2[2][2] = 3; m2[2][3] = 2; m2[2][4] = 1;
m2[3][1] = 2; m2[3][2] = 2; m2[3][3] = 2; m2[3][4] = 1;
m2[4][1] = 1; m2[4][2] = 1; m2[4][3] = 1; m2[4][4] = 1;
}
/*********************************************************
* 行列 input 関数
*********************************************************/
void input_test ( void )
{
for ( i=1;i<=N ;i++){
for(j=i;j<=N;j++){
m1[i][j]=(i+j)*(i+j);
m2[i][j]=(i+j)*(i+j);
}
}
for ( i=2;i<=N;i++){
for (j =1; j <=i-1;j++){
m1[i][j]=m1[j][i];
m2[i][j]=m2[j][i];
}
}
#ifdef DBGPRN
for ( i=1;i<=N ;i++){
for(j=i;j<=N;j++){
print_m1( );
print_m2( );
}
}
#endif
}
/*********************************************************
* < 行列 r1j input 関数 > *
*********************************************************/
void input_r1j ( void )
{
int a,b;
for(a=1;a<=N;a++){
for(b=1;b<=N;b++){
r1j[a]= 0;
}
}
}
/*********************************************************
* < 行列 r2j input 関数 > *
*********************************************************/
void input_r2j ( void )
{
int a,b;
for(a=1;a<=N;a++){
for(b=1;b<=N;b++){
r2j[a]= 0;
}
}
}
/*********************************************************
< 行列 c1i input 関数 >
A 付録・シミュレーションプログラム 52
*********************************************************/
void input_c1i ( void )
{
int a,b;
for(a=1;a<=N;a++){
for(b=1;b<=N;b++){
c1i[a]=0;
}
}
}
/*********************************************************
* < 行列 c2i input 関数 > *
*********************************************************/
void input_c2i ( void )
{
int a,b;
for(a=1;a<=N;a++){
for(b=1;b<=N;b++){
c2i[a]=0;
}
}
}
/*************************************************************
* < print_r1j 関数 > *
**************************************************************/
void print_r1j ( void )
{
int a;
for(a=s;a<=N;a++){
printf(" r1j[%d]=%f ",a,r1j[a]);
}
printf("\n\n");
}
/*************************************************************
* < print_r2j 関数 > *
**************************************************************/
void print_r2j ( void )
{
int a;
for(a=s;a<=N;a++){
printf(" r2j[%d]=%f ",a,r2j[a]);
}
printf("\n\n");
}
/*************************************************************
* < print_c1i 関数 > *
**************************************************************/
void print_c1i ( void )
{
int a;
for(a=s;a<=N;a++){
printf(" c1i[%d]=%f \n",a,c1i[a]);
}
printf("\n");
}
/*************************************************************
* < print_c2i 関数 > *
**************************************************************/
void print_c2i ( void )
{
int a;
for(a=s;a<=N;a++){
printf(" c2i[%d]=%f \n",a,c2i[a]);
}
printf("\n");
}
/*************************************************************
* < print_m1 関数 > *
**************************************************************/
void print_m1 ( void )
{
int a,b;
for(a=s;a<=N;a++){
for(b=s;b<=N;b++){
printf("m1[%d][%d]=%f ",a,b,m1[a][b]);
}
printf("\n");
}
printf("\n");
}
/*************************************************************
* < print_m2 関数 > *
**************************************************************/
void print_m2 ( void )
A 付録・シミュレーションプログラム 53
int a,b;
for(a=s;a<=N;a++){
for(b=s;b<=N;b++){
printf("m2[%d][%d]=%f ",a,b,m2[a][b]);
}
printf("\n");
}
printf("\n");
}
/*---関数---*/
/******************************************************
(1) m1_c1i ( int b ) m1からc1iへ移す(copy)
******************************************************/
void m1_c1i ( int b )
{
int a;
for(a=s;a<=N;a++){
c1i[a]=m1[a][b];
}
}
/*****************************************************
(3) s0_c1i ( int a ) 移動(copy)
/*****************************************************/
void s0_c1i ( int a )
{
c1i[a] = s0;
}
/*****************************************************
(4) c1i_c2i ( ) 移動
*****************************************************/
void c1i_c2i ( void )
{
int a;
for ( a = s; a <=N ; a++ ){
c2i[a] = c1i[a];
}
}
/***********************************************
(5) tc2_c1( ) (times( )) 掛け算関数
***********************************************/
void tc2_c1( )
{
int a; /* aは行 */
for( a = s ; a <=N ; a++ ){
c1i[a] = c2i[a] * c1i[a] ;
}
}
/*************************************************************
< c1iの1行目からN行目まで足しあわせる。>
(6) double ac1i_s0( ) ( sum_gyou( ) )
**************************************************************/
double ac1i_s0( )
{
int a;
double t = 0 ; /* t = total */
for ( a = s ; a <=N ; a++){
t = t + c1i[a];
}
return t;
}
/******************************************************
(7) sqrt_s0( )
******************************************************/
void sqrt_s0 ( void )
{
s0 = sqrt( s0 );
}
/*****************************************************
(8) mc2i_s1 ( int a ) 移動 (copy)
*****************************************************/
void mc2i_s1 ( int a )
{
#ifdef DBGPRN
printf(" (8) \n");
printf("a = %d \n",a);
#endif
s1 = c2i[a];
if ( s1 < 0 ){
s0 = -s0 ;
}
#ifdef DBGPRN
printf("s1 = %f\n",s1);
#endif
}