数値解析法及び演習 第五回

行列の掛け算
  1. 今日の目標
  2. 二次元データの入出力
  3. 行列の掛け算
  4. 今日の宿題

[1] 今日の目標

  1. 二次元データを読む
  2. 行列の掛け算を行なう
  3. サブルーチンを使う

[2] 二次元データの入出力

[2.0]配列にデータを格納

1.D0
2.D0
3.D0
4.D0
5.D0

と縦に並んだデータをファイル(retsu.datとする)から読み, 配列a(5)に格納するプログラム例:

       implicit none 
       integer i
       real*8 a(5)
       open(1,file='retsu.dat')
       do i=1,5
         read(1,*) a(i)
	 write(*,*) a(i)
       enddo
       end
1.D0 2.D0 3.D0 4.D0 5.D0

と横に並んだデータをファイル(gyou.datとする)から読み, 配列a(5)に格納するプログラム例:

      implicit none 
      real*8 a(5)
      integer i

      open(1,FILE='gyou.dat')
      read(1,*) (a(i),i=1,5)
      write(*,*) (a(i),i=1,5)
      end

[2.1]二次元配列

配列の要素を指定する番号は複数あってもよい. 二つになると二次元配列となり, 三つになると三次元配列となる. FORTRANでは7次元の配列まで使用可能である.

二次元配列の宣言:
宣言文 配列名(寸法の下限:寸法の上限, 寸法の下限:寸法の上限)



例1
real*8 a(10,10) 

a(1,1)からa(10,10)まで要素を100個持つ倍精度実数型二次元配列を宣言



例2
integer i(2,-1:8)

i(1,-1)からi(2,8)まで要素を20個もつ実数型二次元配列を宣言

二次元配列を使ったプログラム例:
      implicit none 
      integer a(5,5),b(5,5),c(5,5),n,i,j
      
      n=0

      do i=1,5
         do j=1,5

            n=n+1

            a(i,j)=0
            b(i,j)=n

         enddo
      enddo

      do i=1,5
         do j=1,5
            c(i,j)=b(i,j)
         enddo
      enddo

      do i=1,5
         write(*,*) (a(i,j),j=1,5)
      enddo
      write(*,*)

      do i=1,5
         write(*,*) (b(i,j),j=1,5)
      enddo
      write(*,*)

      do i=1,5
         write(*,*) (c(i,j),j=1,5)
      enddo




      end

[2.2]二次元データの読み取り

以下の数値をファイル matrix.dat にコピーし, それぞれの数値を二次元配列a(2,3)に格納するプログラムを作成せよ. 確認のため画面に値を表示させること.

1.D0 2.D0 3.D0
4.D0 5.D0 6.D0

[3] 行列の掛け算

[3.1]行列を取り扱う際のポイント

[3.2]行列の掛け算

hai1.dat
2.D0 3.D0 4.D0         
5.D0 6.D0 7.D0        
8.D0 9.D0 10.D0       
hai2.dat
1.D0 2.D0 3.D0 
4.D0 5.D0 6.D0
2.D0 4.D0 6.D0 
上の二つの3行3列の行列をそれぞれ hai1.dat,hai2.dat とする.
  1. ファイルから数値を読み込み,それぞれ配列a(3,3),b(3,3)に値を格納しなさい.
  2. それぞれの行列の対角和を求めなさい.
  3. この行列の掛け算を行い,結果を画面に出力するプログラムをつくりなさい.
  4. 配列aに格納された行列(hai1.dat)を10乗して結果を画面に出力するプログラムをつくりなさい.

[5] 今日の宿題

練習問題3のプログラム, 答えを送ること. 〆切は11/4.


日程表へ戻る <<