Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- def f(x): #функция, принимает значние x и возвращает f(x)
- return math.cos(math.exp(x/3) + 0.1*x)
- a = int(input('a? '))
- b = int(input('b? '))
- eps = float(input('eps? '))
- '''
- a, b - введённая пользователем строка преобразовывается в целое число (integer) и сохраняется в переменные
- eps - введённая пользователем строка преобразовывается в вещественное число и сохраняется в переменную eps.
- '''
- #Вычисление первого значения интеграла вне цикла. Метод средних прямоугольников описан тут: http://www.mathprofi.ru/metod_prjamougolnikov.html
- n = 2 #начальное число разбиений (минимальное, на 1 мы разбить не можем)
- h = (b-a)/n #шаг функции
- s = 0 #переменная, в которой будет храниться сумма
- integral = 0 #переменная, которая получит значение интеграла после того, как будет найдена сумма
- i = a #в этом случае i=x0, левому пределу интегрирования
- while i < b: #цикл ПОКА. Если бы питон поддерживал не-целочисленный шаг в range(), можно было бы вот так: for i in range(a, b+h, h): ...
- s += f(i + h/2) #к переменной суммы добавляем f(x+h/2) (смотри функцию выше, работаем по формуле http://www.mathprofi.ru/b/metod_prjamougolnikov_clip_image070.gif)
- i += h #добавляем к переменной шаг функции (т.е. каждый следующий_x = предыдущий_x + h)
- integral = s*h #умножаем сумму [f(x0 + h/2) + f(x1 + h/2) + ... + f(xn + h/2)] на h и записываем в переменную integral
- while True: #в питоне нет цикла с постусловием (т.е. цикла, который выполняется хотя бы один раз перед проверкой условия), поэтому используется бесконечный цикл, условие выхода которого находится ниже
- integral_pr = integral #integral_pr хранит предыдущее (менее точное) значение интеграла
- integral = 0 #обнуляем ранее использовавшуюся пременную
- s = 0 #обнуляем ранее использовавшуюся пременную
- n *= 2 #умножаем число разбиений на 2, чтобы получить более точный результат
- h = (b-a) / n #подсчёт нового шага
- i = a
- while i < b:
- s += f(i + h)
- i += h
- integral = s*h
- if not (abs(integral - integral_pr) > eps): #логическая конструкция выхода из цикла. Если условие модуль(значение_интеграла - пред_значение_интеграла) > точность НЕ выполняется, то break.
- break #выход из цикла
- print(integral)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement