Advertisement
Guest User

Untitled

a guest
May 17th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program num_integrate
  2.   implicit none
  3.   double precision, external:: seval, lagint
  4.  
  5.   integer :: outputunit = 0, nofun, index
  6.   double precision :: startvalue = 2.0, step = 0.1, q8input(11), q8results(11), errest, flag
  7.   double precision :: splineA(11), splineB(11), splineC(11)
  8.   double precision ::  evalX(10), evalq8(10), evalSpline(10), evalLagrange(10)
  9.   double precision :: splineQ8Diff(10), lagrangeQ8Diff(10)
  10.   character(len=255) outfile
  11.  
  12.   call get_command_argument(1, outfile)
  13.  
  14.   if(len_trim(outfile) > 0) then
  15.      
  16.      call process_data()
  17.  
  18.      open(newunit = outputunit, file = outfile, status="replace", action="write")
  19.      write(outputunit, *) "Значения интеграла, вычисленные через QUANC8"
  20.      write(outputunit, *) "(от 2 до 3 с шагом 0.1)"
  21.      write(outputunit, *) "----------------------------------"
  22.      write(outputunit, *) q8results
  23.      write(outputunit, *) "----------------------------------"
  24.  
  25.      write(outputunit, *) "Коэффициенты сплайна, построенные в точках (x, a, b, c):"
  26.      write(outputunit, *) "----------------------------------"
  27.      do index = 1, 11
  28.         write(outputunit, *) q8input(index), splineA(index), splineB(index), splineC(index)
  29.      end do
  30.      write(outputunit, *) "----------------------------------"
  31.      
  32.      write(outputunit, *) "Сравнение точного интеграла и сплайна (x, q8, spline, diff):"
  33.      write(outputunit, *) "----------------------------------"
  34.      do index = 1, 10
  35.         write(outputunit, *) evalX(index), evalq8(index), evalSpline(index), splineQ8Diff(index)
  36.      end do
  37.      write(outputunit, *) "----------------------------------"
  38.      
  39.      write(outputunit, *) "Сравнение точного интеграла и п. Лагранжа (x, q8, lagrange, diff)"
  40.      write(outputunit, *) "----------------------------------"
  41.      do index = 1, 10
  42.         write(outputunit, *) evalX(index), evalq8(index),  evalLagrange(index), lagrangeQ8Diff(index)
  43.      end do
  44.      close(outputunit)
  45.      
  46.   else
  47.      print "(a)", "Укажите имя входного и выходного файла"
  48.   end if
  49.  
  50. contains
  51.  
  52.   pure double precision function to_integrate(t)
  53.     double precision, intent(in) :: t
  54.     to_integrate = (1 - cos(t)) / t
  55.   end function to_integrate
  56.  
  57.   subroutine process_data()
  58.     double precision:: current_x
  59.  
  60.     ! генерируем значения в основных точках
  61.     do index = 0, 10
  62.        current_x = startvalue + index * step
  63.        q8input(index + 1) = current_x
  64.        call quanc8(to_integrate, 0, current_x, 0.88, 0.0, q8results(index + 1), errest, nofun, flag)
  65.        if(flag > 0) then
  66.           WRITE(0,*) "Error"
  67.           write(0,*) current_x
  68.           write(0, *) flag
  69.           write(0, *) errest
  70.           write(0, *) nofun
  71.        end if
  72.     end do
  73.    
  74.     ! генерируем значения для сплайна
  75.     call spline(11, q8input, q8results, splineA, splineB, splineC)
  76.     ! сравниваем сплайн с точными значениями
  77.     do index = 0, 9
  78.        current_x = startvalue + 0.05 + 0.1 * index
  79.        evalX(index + 1) = current_x
  80.  
  81.        call quanc8(to_integrate, 0, current_x, 0.88, 0.0, evalq8(index + 1), errest, nofun, flag)
  82.        if(flag > 0) then
  83.           WRITE(0,*) "Error"
  84.           write(0,*) current_x
  85.           write(0, *) flag
  86.           write(0, *) errest
  87.           write(0, *) nofun
  88.        end if
  89.  
  90.        evalSpline(index + 1) = seval(11, current_x, q8input, q8results, splineA, splineB, splineC)
  91.     end do
  92.     splineQ8Diff = abs(evalq8 - evalSpline)
  93.    
  94.     ! генерируем значения для полинома Лагранжа
  95.     ! и сравниваем их с точными
  96.     do index = 1, 10
  97.        current_x = evalX(index)
  98.        evalLagrange(index) = lagint(current_x, q8input, q8results, 11, 10)
  99.     end do
  100.  
  101.     lagrangeQ8Diff = abs(evalq8 - evalLagrange)
  102.    
  103.   end subroutine process_data
  104.  
  105. end program num_integrate
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement