fortran グラムシュミットの直行化
グラムシュミットの直行化を行うプログラムを書いたのですが、実行結果の答えで2列目1行目の答えがマイナスになるはずなのになっていません。自分の計算ではマイナスになったのですが、プログラムに問題があるのでしょうか?教えて下さい。よろしくお願いします。
module subprogs
implicit none
contains
function normal_vec2(v,n) result(nv)
integer, intent(in) :: n
real(8), intent(in) :: v(n)
real(8) nv(n), vl
vl = sqrt(dot_product(v,v))
if (vl == 0.0d0) then
nv(:) = 0.0d0
else
nv(:) = v(:) / vl
endif
end function normal_vec2
end module subprogs
module subprogs2
use subprogs
implicit none
contains
function gs(a,n) result(e)
integer, intent(in) :: n
real(8), intent(in) :: a(n,n)
real(8) e(n,n), dotp
integer k, j
e(1:n,1) = normal_vec2(a(1:n,1:1),n)
do k = 2, n
e(1:n,k) = a(1:n,k)
do j = 1, k-1
dotp = dot_product(a(1:n,k),e(1:n,j))
e(1:n,k) = e(1:n,k)-dotp*e(1:n,j)
enddo
e(1:n,k) = normal_vec2(a(1:n,k:k),n)
enddo
end function gs
end module subprogs2
program main
use subprogs
use subprogs2
implicit none
real(8), allocatable :: q(:,:)
integer :: n = 2
allocate(q(n,n))
q(1,1:2) = (/2.0d0,1.0d0/)
q(2,1:2) = (/1.0d0,2.0d0/)
write(*,*) gs(q,n)
end program main
実行結果
0.8944271909999159 0.4472135954999579 0.4472135954999579 0.8944271909999159 ↑
実計算では-(マイナス)がつく
お礼
確かにそうですね。いろいろ試した結果、私の処理系にrandom_numberという手続きはありました。ただ、プログラム上のrandom_numberのxとyの設定が誤っていたようです。ちゃんと再度設定し直したら、うまくコンパイルできて実行結果も正しく表示されました。ありがとうございました。