ベクトルからcosθを求めるプログラムについて

このQ&Aのポイント
  • ベクトルからcosθを求めるプログラムを作ってみましたが、実行結果の値が期待通りではありません。
  • プログラム上に問題があるのか、教えてください。
  • 実行結果のcosθは0.9601163787292428です。
回答を見る
  • ベストアンサー

fortran cosθをベクトリから求めるプログラム

ベクトルからcosθを求めるペログラムを作ってみたのですが、実際計算した値と実行結果の値が一致しないのですが。プログラム上に問題があるのでしょうか?教えて下さい。よろしくお願いします。 module subprogs implicit none contains function vec_cos(a,b) result(vcos) real(8), intent(in) :: a(:), b(:) real(8) ab, vcos if (size(a) /= size(b)) stop ' er : size(a) /= size(b) ' ab = dot_product(a,a) * dot_product(b,b) if (ab == 0.0d0) then vcos = 0.0d0 else vcos = dot_product(a,b)/sqrt(ab) endif end function vec_cos end module subprogs program main use subprogs implicit none real(8) :: x(1:2) = (/1.2d0, 3.4d0/), y(1:2) = (/5.6d0, 7.8d0/) write(*,*) 'cos = ', vec_cos(x,y) end program main 実行結果 cos = 0.9601163787292428

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「実際計算した値」というのはどのように計算したもので値はいくつになったのでしょうか?

528612
質問者

お礼

cos = ( 1.2*5.6+3.4*7.8)/sqrt((1.2*1.2+3.4*3.4)*(5.6*5.6+7.8*7.8))=0.9531.... 再度計算し直したらちゃんと実行結果の値と同じになりました。こちらのケアレスミスでした。ありがとうございました。

関連するQ&A

  • fortran 乱数を用いてcosθをベクトリから求めるプログラム

    乱数を配列に格納してcosθをベクトルから求めるプログラムを書いてみたのですが、コンパイルしてみるとrandom_numberのところの設定がおかしいみたいでうまくコンパイルできません。どこに問題があるのかわからないので困っています。教えて下さい。よろしくお願いします。 module subprogs implicit none contains function vec_cos(a,b) result(vcos) real(8), intent(in) :: a(:), b(:) real(8) ab, vcos if (size(a) /= size(b)) stop ' sr : size(a) /= size(b) ' ab = dot_product(a,a) * dot_product(b,b) if (ab == 0.0d0) then vcos = 0.0d0 else vcos = dot_product(a,b)/sqrt(ab) endif end function vec_cos end module subprogs program main use subprogs implicit none real(8), allocatable :: x(:), y(:) integer n write(*,'(a)', advance = 'no') ' input n : ' read(*,*) n if ( n < 1 .or. n > 100 )stop ' n must be 0 < n < 101 ' allocate(x(n),y(n)) call random_seed call random_number(x,y) write(*,*) 'cos = ', vec_cos(x,y) end program main コンパイル結果 Undefined symbols: "_random_number__", referenced from: _MAIN_ in ccxYbc0C.o ld: symbol(s) not found

  • 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                   ↑                             実計算では-(マイナス)がつく

  • fortran 固有値を求めるプログラム

    2x2の実行列の固有値を求めるモジュール関数の中で、d > 0 のときに出てくる sign(squt(d), -b)の値が示す意味と eval(2) = cmplx(c/e,0.0d0) でなぜ c/eの値が入るのかがわかりません。教えて下さい。よろしくお願いします。 プログラム module subprogs implicit none contains function eval2x2mat(a) result(eval) real(8), intent(in) :: a(:,:) complex(8) eval(2) real(8) b, c, d, e if (size(a,1) /= size(a,2)) stop ' not square ' if (size(a,1) /= 2) stop ' not 2x2 matrix ' b = -0.5d0*(a(1,1)+a(2,2)) c = a(1,1)*a(2,2)-a(1,2)*a(2,1) d = b**2-c if ( d < 0.0d0 ) then eval(1) = cmplx(-b,sqrt(-d)) eval(2) = conjg(eval(1)) else if ( d > 0.0d0 ) then e = -b+sign(sqrt(d),-b) ←ここの部分 eval(1) = cmplx(e,0.0d0) eval(2) = cmplx(c/e,0.0d0) else          ↑ここの部分 eval(1) = cmplx(-b,0.0d0) eval(2) = eval(1) endif end function eval2x2mat end module subprogs program main use subprogs implicit none real(8), allocatable :: a(:,:) integer :: n = 2 allocate(a(n,n)) a(1,1:2) = (/-1,1/) a(2,1:2) = (/-1,-1/) write(*,*) a(:,:), eval2x2mat(a) end program main

  • fortran 実行結果がうまく表示されない

    グローバルモジュールを用いてプログラムを書いたのですが実行結果が表示されません、プログラム中に問題があるのでしょうか?教えて下さい。 module params implicit none integer :: n = 2 end module params module sample implicit none contains subroutine swapvec3(x,y) use params real(8), intent(inout) :: x(n), y(n) real(8) tmp(n) tmp(1:n) = x(1:n) x(1:n) = y(1:n) y(1:n) = tmp(1:n) end subroutine swapvec3 end module sample program main use sample implicit none real(8), allocatable :: a(:), b(:), tmp(:) integer n allocate(a(n),b(n),tmp(n)) call swapvec3(a,b) call random_seed call random_number(a) call random_number(b) call random_number(tmp) write(*,*) ' a = ', a(1:n) write(*,*) ' b = ', b(1:n) write(*,*) ' tmp = ', tmp(1:n) end program main 実行結果  a = b = tmp =

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • fortranのプログラムで困っています。

    implicit real*8(a-h,o-z) dimension h(10,300) h(1,g)=1.0d0 h(2,g)=g*2.0d0 open(6, file='testes-ex.f', status='replace') do 12 n=1,2 do 11 i=1,2 g=2.0d0*i 11 write(6,*) h(n,g) 12 write(6,*) stop end として出力させると値がすべて0になってしまいます。 私としては1.0 2.0  1.0 4.0 と出力させたいのですが、 どこに問題があるのでしょうか? 当方fortran初心者ですのですごく馬鹿げた質問をしているかも しれませんが…気付くことがあればご指摘よろしくお願いします。

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • fortran90

    fortran90 現在 fortran90 で計算プログラムを作っております。 プログラムはかけたのですが、実行画面にエラーが出ます。 解決方法が分かりません。どなたか分かる方いらっしゃいますか。 プログラム implicit real*8 (a-h,o-z) parameter(n=900) open (1,file='004.txt',status='old') do 10 i=1,n read (1,*,end=11)xx,yy,zz,ww theta=acos(zz) phi1=acos(xx/sqrt(1-zz*zz)) phi2=asin(yy/sqrt(1-zz*zz)) write(*,*)theta,phi1,phi2 10 continue 11 end プログラム内容 あるフォルダーに保存してあるテキストファイルから4×4行列のデータを読み込み、そのデータからθの値とφ1、φ2のアタを求めるプログラムです。 実行分のエラー画面には、 acos: DOMAIN error です。

  • FORTRAN77で・・・

    IMPLICIT NONE REAL A(50,50),B(50),X(50),EPS/1E-6/ INTEGER I,KP,N/4/,KPP/50/ DATA (A(1,I),I=1,4)/7.0,2.0,-1.0,1.0/ DATA (A(2,I),I=1,4)/1.0,5.0,1.0,-2.0/ DATA (A(3,I),I=1,4)/2.0,3.0,8.0,1.0/ DATA (A(4,I),I=1,4)/2.0,-2.0,-1.0,10.0/ DATA (B(I),I=1,4)/12.0,6.0,36.0,35.0/ ・・・・ という感じのリストでコンパイルするとREALとINTEGERの行で attempt to give DATAb in type-declaration というエラーが出るのですが、どう対処したらいいのかわかりません。 教えてください。

専門家に質問してみよう