Advertisement
Guest User

pendulum

a guest
Feb 22nd, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. !==============================================================================
  2. ! This program use Runge-Kutta method to calculate  dynamics system
  3. !                         of double pendulum
  4. !==============================================================================
  5. subroutine runge_kutt
  6.   implicit none
  7.   real*16, external :: F1, F2, F3, F4
  8.   integer :: i, j, m = 4, n = 5*10e3
  9.   real*16, allocatable :: k1(:), k2(:), k3(:), k4(:)
  10.   real*16 :: h = 0.0005d0, x1, y1, x2, y2
  11. ! matrix (n * m) with solution
  12.   real*16, allocatable :: y(:,:)
  13.   write(*,101)
  14. 101 format(1x,'System of differential equation of first order is solved'/&
  15.               ' due runge-kutta method of 4-th order')
  16. !  write(*,"(A)", advance = 'no') ' due runge-kutta method of 4-th order'
  17.   write(*,'(a36, i5)') 'Number of rows (sampling rate) is  ', n
  18.  
  19.   allocate(k1(m), k2(m), k3(m), k4(m))
  20.   if (m==0) stop 'Allocation error, m = 0'
  21.  
  22.   allocate(y(n,m))
  23.   if (n==0) stop 'Allocation error, n = 0'
  24.  
  25.   write(*,100) h
  26. 100 format(1x,'Step:  ', e10.4)
  27.   write(*,10)
  28. 10 format(1x,'Solution:  '/&
  29.          ' +----------------+-----------------+'/&
  30.          ' |    analitic    |  interpolation  |'/&
  31.          ' +----------------+-----------------+'/&
  32.          ' |    not exist   |  xypendulum.txt |'/&
  33.          ' +----------------+-----------------+')
  34. !----------------------------------------------------------------------------
  35. ! assignment decart coordinates  
  36.   x1 = 0.0d0
  37.   y1 = 0.0d0
  38.   x2 = 0.0d0
  39.   y2 = 0.0d0
  40. ! assignment  matrix solution
  41.   y = 0.0d0  
  42.   open(unit = 1, file = 'xypendulum.txt')
  43. ! Algorithm Runge-Kutta
  44.   do i = 1, n-1, 1          ! inception condition for:
  45.      y(1,1) = 1.7d0         !  alpha1 (0) = angle1 in rad
  46.      y(1,2) = 1.15d0         !  alpha2 (0) = angle2 in rad
  47.      y(1,3) = 1.0d0         !  p1 (0) = 0
  48.      y(1,4) = 1.0d0         !  p2 (0) = 0
  49.      ! K_{ij} = (k11 & k12 & k13 & k14\\ ...)
  50.      k1(1) = F1(y(i,1), y(i,2), y(i,3), y(i,4))*h
  51.      k1(2) = F2(y(i,1), y(i,2), y(i,3), y(i,4))*h
  52.      k1(3) = F3(y(i,1), y(i,2), y(i,3), y(i,4))*h
  53.      k1(4) = F4(y(i,1), y(i,2), y(i,3), y(i,4))*h
  54.      k2(1) = F1(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  55.      k2(2) = F2(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  56.      k2(3) = F3(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  57.      k2(4) = F4(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  58.      k3(1) = F1(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  59.      k3(2) = F2(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  60.      k3(3) = F3(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  61.      k3(4) = F4(y(i,1) + k1(1)/2, y(i,2) + k1(2)/2, y(i,3) + k1(3)/2, y(i,4) + k1(4)/2)*h
  62.      k4(1) = F1(y(i,1) + k3(1), y(i,2) + k3(2), y(i,3) + k3(3), y(i,4) + k3(4))*h
  63.      k4(2) = F2(y(i,1) + k3(1), y(i,2) + k3(2), y(i,3) + k3(3), y(i,4) + k3(4))*h
  64.      k4(3) = F3(y(i,1) + k3(1), y(i,2) + k3(2), y(i,3) + k3(3), y(i,4) + k3(4))*h
  65.      k4(4) = F4(y(i,1) + k3(1), y(i,2) + k3(2), y(i,3) + k3(3), y(i,4) + k3(4))*h
  66.      do j = 1, m
  67.         y(i + 1,j) = y(i,j) + (k1(j) + 2*k2(j) + 2*k3(j) + k4(j))/6
  68.      end do
  69.   end do
  70.   do i = 1, n
  71.      x1 = sin(y(i,1))
  72.      y1 = -cos(y(i,1))
  73.      x2 = x1 + sin(y(i,2))
  74.      y2 = y1 - cos(y(i,2))
  75.      write(1,'(1x, 4e20.12)') x2, y2, x1, y1 ! output
  76.   end do
  77.   close(1)
  78. end subroutine runge_kutt
  79. !-----------------------------------------------------------------------------
  80. ! Function's
  81. function F1(alpha1, alpha2, p1, p2)
  82.   implicit none
  83.   real*16 :: m1, l, p1, p2, alpha1, alpha2, mu, F1
  84.   m1 = 1.0d0
  85.   l = 1.0d0
  86.   mu = 1.0d0
  87.   F1 = (p1 - p2) * cos(alpha1 - alpha2) / ( m1 * l*l * (1 + mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2)))
  88.   return
  89. end function F1
  90.  
  91. function F2(alpha1, alpha2, p1, p2)
  92.   implicit none
  93.   real*16 :: m1, l, p1, p2, alpha1, alpha2, F2, mu
  94.   m1 = 1.0d0
  95.   mu = 1.0d0
  96.   l = 1.0d0
  97.   F2 = (p2 * (1 + mu) - p1 * mu * cos(alpha1 - alpha2)) / (m1 * l*l * (1 + mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2)))
  98.   return
  99. end function F2
  100.  
  101. function F3(alpha1, alpha2, p1, p2)
  102.   implicit none
  103.   real*16 :: m1, mu, g, l, alpha1, alpha2, p1, p2, A1, A2, F3
  104.   m1 = 1.0d0
  105.   mu = 1.0d0
  106.   g = 9.8d0
  107.   l = 1.0d0
  108.   A1 = (p1 * p2 * sin(alpha1 - alpha2)) / (m1 * l*l * (1 + mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2)))
  109.   A2 = ((p1*p1 * mu - 2 * p1 * p2 * mu * cos(alpha1 - alpha2) +&
  110.        p2*p2 * (1 + mu)) * sin(2*(alpha1 -alpha2)))/(2 * m1 * l*l * (1 +  mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2))**2)
  111.   F3 = -m1 * (1 + mu) * g * l * sin(alpha1) - A1 + A2
  112.   return
  113. end function F3
  114.  
  115. function F4(alpha1, alpha2, p1, p2)
  116.   implicit none
  117.   real*16 :: m1, mu, g, l, alpha1, alpha2, p2, A1, A2, F4, p1
  118.   m1 = 1.0d0
  119.   mu = 1.0d0
  120.   g = 9.8d0
  121.   l = 1.0d0
  122.   A1 = (p1 * p2 * sin(alpha1 - alpha2)) / (m1 * l*l * (1 + mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2)))
  123.   A2 = ((p1*p1 * mu - 2 * p1 * p2 * mu * cos(alpha1 - alpha2) +&
  124.        p2*p2 * (1 + mu)) * sin(2*(alpha1 -alpha2)))/(2 * m1 * l*l * (1 +  mu * sin(alpha1 - alpha2)*sin(alpha1 - alpha2))**2)
  125.   F4 = -m1 * mu * g * l * sin(alpha2) + A1 - A2
  126.   return
  127. end function F4
  128.  
  129. program pendulum
  130.   implicit none
  131.   call runge_kutt
  132. end program pendulum
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement