Advertisement
jmchich

Untitled

Dec 24th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.32 KB | None | 0 0
  1. import math
  2.  
  3. def f(x): #функция, принимает значние x и возвращает f(x)
  4.     return math.cos(math.exp(x/3) + 0.1*x)
  5.  
  6. a = int(input('a? '))
  7. b = int(input('b? '))
  8. eps = float(input('eps? '))
  9. '''
  10. a, b - введённая пользователем строка преобразовывается в целое число (integer) и сохраняется в переменные
  11.  
  12. eps - введённая пользователем строка преобразовывается в вещественное число и сохраняется в переменную eps.
  13. '''
  14.  
  15. #Вычисление первого значения интеграла вне цикла. Метод средних прямоугольников описан тут: http://www.mathprofi.ru/metod_prjamougolnikov.html
  16.  
  17. n = 2 #начальное число разбиений (минимальное, на 1 мы разбить не можем)
  18. h = (b-a)/n #шаг функции
  19. s = 0 #переменная, в которой будет храниться сумма
  20. integral = 0 #переменная, которая получит значение интеграла после того, как будет найдена сумма
  21. i = a #в этом случае i=x0, левому пределу интегрирования
  22. while i < b: #цикл ПОКА. Если бы питон поддерживал не-целочисленный шаг в range(), можно было бы вот так: for i in range(a, b+h, h): ...
  23.     s += f(i + h/2) #к переменной суммы добавляем f(x+h/2) (смотри функцию выше, работаем по формуле http://www.mathprofi.ru/b/metod_prjamougolnikov_clip_image070.gif)
  24.     i += h #добавляем к переменной шаг функции (т.е. каждый следующий_x = предыдущий_x + h)
  25. integral = s*h #умножаем сумму [f(x0 + h/2) + f(x1 + h/2) + ... + f(xn + h/2)] на h и записываем в переменную integral
  26.  
  27. while True: #в питоне нет цикла с постусловием (т.е. цикла, который выполняется хотя бы один раз перед проверкой условия), поэтому используется бесконечный цикл, условие выхода которого находится ниже
  28.     integral_pr = integral #integral_pr хранит предыдущее (менее точное) значение интеграла
  29.     integral = 0 #обнуляем ранее использовавшуюся пременную
  30.     s = 0 #обнуляем ранее использовавшуюся пременную
  31.     n *= 2 #умножаем число разбиений на 2, чтобы получить более точный результат
  32.     h = (b-a) / n #подсчёт нового шага
  33.     i = a
  34.     while i < b:
  35.         s += f(i + h)
  36.         i += h
  37.     integral = s*h
  38.  
  39.     if not (abs(integral - integral_pr) > eps): #логическая конструкция выхода из цикла. Если условие модуль(значение_интеграла - пред_значение_интеграла) > точность НЕ выполняется, то break.
  40.         break #выход из цикла
  41.  
  42. print(integral)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement