next up previous
: BASICの場合 : プログラミング例 : プログラミング例

FORTRANの場合


      PROGRAM shot
      DIMENSION r(2),v(2),a(2)
      CALL init(t,r,v,a,dt,ncalc,g,c)
      CALL prtout(t,r,v,a,0)
      CALL euler(t,r,v,a,0.0,1,g,c)
      CALL prtout(t,r,v,a,1)
      DO 10 i = 1,100
        CALL euler(t,r,v,a,dt,ncalc,g,c)
        CALL prtout(t,r,v,a,1)
        IF(r(2) .LE. 0.0) GOTO 999
   10 CONTINUE
  999 END
C
      SUBROUTINE init(t,r,v,a,dt,ncalc,g,c)
      DIMENSION r(2),v(2),a(2)
      g = 9.81
      t = 0
      prper = 0.2
      dt = 0.001
*      WRITE(*,*) 'プリントの間隔(s), 時間の刻み巾(s) = '
*      READ(*,*) prper,dt
      ncalc = prper/dt + 0.5
      height = 10
      v0 = 20
      th = 40
*      WRITE(*,*) '初期条件: 高さ(m), 速さ(m/s), 角度(degree) = '
*      READ(*,*) height,v0,th
      th = th/180*3.141592
      WRITE(*,*) '空気抵抗の係数 (1/m) = '
      READ(*,*) c
      v(1) = v0*cos(th)
      v(2) = v0*sin(th)
      r(1) = 0
      r(2) = height
      END
C
      SUBROUTINE prtout(t,r,v,a,n)
      DIMENSION r(2),v(2),a(2)
      IF(n.EQ.0) THEN
        WRITE(*,'(/2(1X,2A/))') 
     +   '   t       x       y      v       a   ',
     +   '    vx      vy      ax      ay  ',
     +   '  (s)     (m)     (m)   (m/s)  (m/s^2)',
     +   '  (m/s)   (m/s)  (m/s^2) (m/s^2)'
      ELSE
        va = sqrt(v(1)**2+v(2)**2)
        aa = sqrt(a(1)**2+a(2)**2)
        WRITE(*,'(1X,F5.2,8F8.2)') t,r,va,aa,v,a
      ENDIF
      END
C
      SUBROUTINE euler(t,r,v,a,dt,ncalc,g,c)
      DIMENSION r(2),v(2),a(2)
      DO 10 i = 1, ncalc
        r(1) = r(1) + v(1)*dt
        r(2) = r(2) + v(2)*dt
        vv = sqrt(v(1)**2 + v(2)**2)
        a(1) = - c*vv*v(1)
        a(2) = - g -c*vv*v(2)
        v(1) = v(1) + a(1)*dt
        v(2) = v(2) + a(2)*dt
        t = t + dt
        IF(r(2) .LE. 0.0) RETURN
   10 CONTINUE
      END



tamari@spdg1.sci.shizuoka.ac.jp 平成14年2月12日