数学の考え方参照。
ベクトルの計算を数値計算で考えよう。。
Ruby の 1 次元配列で、ベクトルを表し、表現してみよう。
#!/usr/koeki/bin/ruby
x = [1,2]
p x
for i in 0 .. x.length - 1
x[i] *= 2
end
p x
for i in 0 .. x.length - 1
x[i] /= 4
# x[i] /= 4.0
end
p x
Ruby では、型を宣言する必要がないが、中に何が入っているのか、 気にする必要があることを確かめよう。
Ruby では数学者が開発した Math module および mathn class が知られている。
#!/usr/koeki/bin/ruby
require 'mathn'
v = Vector[1,2]
p v* 2
p v *= 0.25
#p x = 1 / 4.0
#p v *= x
4.0 など小数点をつけてから割ると、自動的に to_f 変換する。
0.5 倍してみよう。
をそれぞれ調べてみる。
mathn class を使うとき、 割り算の記号は使えないことを確かめよう。
計算機が苦手な細かい数字を取り扱うことと人間の目から見て分かりやすい形との違いを見るために、 整数型と倍精度型で、いくつか配列の定義の仕方を見てみる。 gfortran は、Fortran 90/95 に対応しており、 新しい記法が可能となっている。
program vector
implicit none
integer :: i
real(8) x(2)
!integer x(2)
x(0) = 1.0d0
x(1) = 2.0d0
!x(0) = 1
!x(1) = 2
write(*,*) (x(i), i = 0, 1)
do i = 0, 1
x(i) = x(i) * 2
enddo
write(*,*) (x(i), i = 0, 1)
do i = 0, 1
x(i) = x(i) / 4
enddo
write(*,*) (x(i), i = 0, 1)
end program vector
また、下のように :: を導入することにより、初期値を代入することもできる。
program vector
implicit none
real(8) :: x(0:1) = (/ 1.0d0, 2.0d0 /)
!integer :: x(0:1) = (/ 1, 2 /)
integer i
write(*,*) (x(i), i = 0, 1)
:
:
end program vector
コメントを変更し、倍精度の実数と整数型の違いを調べておこう。
Ruby 言語で Array.new があるように、Fortran でも割付け配列という概念がある。
program dotproduct
implicit none
integer, allocatable :: u(:), v(:)
integer :: i, n = 4
integer dotprod
allocate (u(0:n-1), v(0:n-1))
do i = 0, n
u(i) = i - 1
v(i) = i + 1
end do
write(*,*) (u(i), i = 0, n-1)
write(*,*) (v(i), i = 0, n-1)
do i = 0, n - 1
dotprod = dotprod + u(i) * v(i)
end do
write(*,*) dotprod
deallocate(u,v)
end program dotproduct
宣言時に allocatable 属性をつけ、次元を実行文中で決定することができる。 次元を与えた直後に配列を allocate 文を用いて、配列の大きさを決める。 解除する必要があれば、deallocate 文を用いて、解除する。