• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fortran 配列)

fortran配列の割付けと計算方法

このQ&Aのポイント
  • fortranを勉強している方に質問です。割付け配列について理解できていません。具体的には、自作のプログラムで正しい値を得ることができません。どこが間違っているのか教えてください。
  • プログラムでは割付け配列を使用していますが、dot product(内積)の計算が正しく行われていません。なぜ正しい値が得られないのでしょうか?ご教示いただければ幸いです。
  • fortranの配列の割付けに関して分からないことがあります。自作のプログラムで割付け配列を使用していますが、正しい値が得られません。どの部分が間違っているのか教えていただけませんか?

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

  • ベストアンサー
  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

演算処理部分に、 dotp = dotp + u(n) * v(n) というコードが書かれていますが、 n は、常に 2 では?

noname#96313
質問者

お礼

すみません。こちらのケアレスミスで本来n(i),v(i)とするところをiをnにしていました。 書き直して実行したらちゃんと答えがでました、ありがとうございました。

noname#96313
質問者

補足

nには2が与えられて計算されるのではないのですか? doループで n=2 u(2),v(2)で計算されないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fortran おそらく二重解法のエラー

    以下のようなプログラム(速度ベレル法による時間発展)を書いたのですが,エラーがでてしまいます. どこが悪いのかを教えていただけたらと思います. PROGRAM verlet implicit none integer::i,n,p real(8)::dt,k,m,ratio,ti real(8),allocatable::x(:),v(:),f(:) allocate(x(0:n)) allocate(v(0:n)) allocate(f(0:n)) dt=0.01d0 n=1000 k=1.0d0 m=1.0d0 ratio=k/m p=4 ti=0.0d0 x(0)=0.0d0 v(0)=1.0d0 f(0)=-k*(x(0))**(p-1) do i=0,45 x(i+1)=x(i)+dt*v(i)+f(i)/(2.0d0*m)*dt**2.0d0 f(i+1)=-k*(x(i+1))**(p-1) v(i+1)=v(i)+dt*(f(i)+f(i+1))/(2.0d0*m) end do do i=0,n ti=i*dt write(6,*) ti,x(i),v(i) end do deallocate(x) deallocate(v) deallocate(f) END PROGRAM verlet

  • 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 上三角行列

    一様乱数を要素とする上三角行列を設定するプログラミングを行ったのですが以下のプログラムで call random_number(a(1 : j , j)) a(j+1 : n , j ) = 0.0d0 の部分を理解した上で実行したのですが、実行結果がそれぞれの列に同じ一様乱数が表示されました。プログラム内容と実行結果が納得のいく物ではないのですが、果たして以下のプログラムは上三角行列を設定する正しく実行される物となっているのでしょうか?教えて下さい。よろしくお願いします。 program list2_8 implicit none real(8), allocatable :: a(:,:) integer n, i, j write(*,'(a)', advance ='no') ' input n (1<=n<=100) :' read(*,*) n if (n < 1 .or. 100 < n) stop 'stop, n is invalid' allocate (a(n,n)) call random_seed do j = 1, n call random_number(a(1:j,j)) a(j+1:n,j) =0.0d0 enddo do i = 1, n write(*,'(100e12.4)') a(1, 1:n) enddo end program list2_8

  • fortran90 の簡単なコード

    初めて質問させていただきます。 fortran を使い15を任意の数で割るプログラムを作成しようとしているのですが 実行時に n を read し結果を書き出すとn+1個の数値が書き出されてしまいます。かつ、n+1個目の数が全く予想しない数値になってしまいます… コンパイルエラーは発生しません。 初心者なりにひとつひとつ精査したのですが原因がわかりません。 お助けください、よろしくお願いいたします。 画像:実行時n=10としたときの例 PROGRAM work6 IMPLICIT NONE REAL , ALLOCATABLE :: x(:) REAL :: dx INTEGER :: n PRINT *,' How many numbers do you separate it? ' READ(*,*) n ALLOCATE (x(n)) dx=15.0/REAL(n) do n=1,n x(n)=dx*REAL(n) enddo  PRINT *,x(1:n)  READ (*,*) ENDPROGRAM work6

  • fortran 行列ベクトル積

    行列ベクトル積を計算するプログラムを下のように書いたのですが、実行した結果の答えが実際計算した答えと異なります。初期の要素の設定がおかしいのでしょうか?教えて下さい。よろしくお願いします。 program list2_14 implicit none integer , parameter :: n = 2 real(8) a(n,n), x(n), y(n) integer i, j, k, l a(1,1:2) = (/1.2d0,3.4d0/) a(2,1:2) = (/5.6d0,7.8d0/) x(:) = (/9.0d0,10.0d0/) do i = 1, n y(i) = 0.0d0 do j = 1, n y(i) = y(i) + a(i,j) * x(j) enddo enddo do k = 1, n write(*,*) (a(k,l), l = 1, n) enddo write(*,*) x(:) write(*,*) y(n) end program list2_14 実行結果 1.2 3.4 5.6 7.8 9. 10. 128.4

  • fortran モンテカルロ法

    モンテカルロ法により円周率πを計算するプログラムを作ったのですが、以下のプログラムでモンテカルロ法から推定された円周率piの値が実行すると大きな数字になってしまって、うまく計算できてない見たです。式に問題があるのでしょうか?教えて下さい。 rogram list1_9 implicit none real(8) x, y, pi, pi0 integer :: n, i, im = 2**20 pi0 = 2.0d0*acos(0.0d0) n = 0 do i = i, im call random_number(x) call random_number(y) if(x ** 2 + y ** 2 <= 1.0d0) n = n + 1 enddo pi = 4.0d0*dble(n)/dble(im) write(*,*) ' pi, pi0, er = ', pi, pi0, pi-pi0 end program list1_9

  • fortran 配列宣言

    以下のプログラムの中でeth(n), eph(n)は、配列なのですが、配列宣言はどのようにしたらよいのでしょうか?doループでnが決まるのでどのように配列宣言したらよいかわかりません。いろいろと試してはみたのですがコンパイルの際エラーがでてしまいます。わかる方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine far_output use consts use fdtd implicit none integer :: n, i, td real(8) :: s real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph real(8) :: eth(1000), eph(1000) open(10,file="far_field.dat") ! s = pi/180.0d0 phi = 0.0d0 ! do i = 0, 180 ! td = i ! theta = s*td theta = pi/3.0d0 sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth write(10,*) eth, eph enddo ! enddo close(10) return end subroutine

  • fortran 3次元座標

    四面体の4頂点の3次元座標を設定するプログラムを例にならって以下のように書いたのですが、doループの内容がいまいちよくわかりません。p(1:3,m),p(1:3,n)が表されている値は理解できるのですが、出力されたファイルの内容が2行3列の答えが6つあって、なぜそのように答えが出てくるのかがわかりません。教えて下さい。よろしくお願いします。 rogram list2_11 implicit none integer :: m, n, fno = 10 real(8) p(3,4) call random_seed call random_number(p(1:3,1:4)) open(fno, file = 'tetra.d') do m = 1, 3 do n = m+1, 4 write(fno,*) p(1:3,m) write(fno,*) p(1:3,n) write(fno,*) '' enddo enddo close(fno) end program list2_11

  • 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 配列実行結果

    以下のように実行結果のプログラムを書いたのですが、実行結果の値の(配列)の内容がどのようになっているのか混乱しています。実行結果の値は、 n = 1, l = 1, 2, 3,...,180, n = 2, l = 1, 2, 3, .....180 ...... n = ntime, l = 1, 2, 3, ...180 と書き出されているのでしょうか?どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine far_output use consts use fdtd implicit none integer :: n, i, td real(8) :: s real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph real(8) :: eth(1000), eph(1000) open(10,file="far_field_eth.dat") open(20,file="far_field_eph.dat") open(30,file="far_field.dat") ! s = pi/180.0d0 theta = 0.0d0 ! do i = 0, 360 ! td = i ! phi = s*td phi = 0.0d0 sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime ! s = pi/180.0d0 ! theta = 0.0d0 ! do i = 0, 360 ! td = i ! phi = s*td wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth write(10,*) eth write(20,*) eph write(30,*) wx(l,n) enddo ! enddo l(エル)は前の(別の)プログラムで l = 1, 180 のdoループで計算させています。

iPhoneのオーディオ出力について
このQ&Aのポイント
  • iPhone13でハイレゾ音源の再生に苦労している方への解決方法
  • iPhone13のLightning端子を3.5mmアンバランス4極(3極)ステレオミニプラグに変換するケーブルで音声出力可能
  • 安価な変換ケーブルを使用しても音声は出力されるが、24bit 48kHzにダウンコンバートされる
回答を見る