Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from math import *
- #Задаем функцию, можно менять
- def func(x):
- return 3 / 2 * pow(x, 2) #возвращает f(x)
- def _rectangle_rule(a, b, nseg, frac):
- """Обобщённое правило прямоугольников."""
- dx = 1.0 * (b - a) / nseg
- sum = 0.0
- xstart = a + frac * dx # 0 <= frac <= 1 задаёт долю смещения точки,
- # в которой вычисляется функция,
- # от левого края отрезка dx
- npoints = nseg
- for i in range(npoints):
- sum += func(xstart + i * dx)
- return sum * dx
- def left_rectangle_rule(a, b, nseg):
- """Правило левых прямоугольников"""
- return _rectangle_rule(a, b, nseg, 0.0)
- def right_rectangle_rule(a, b, nseg):
- """Правило правых прямоугольников"""
- return _rectangle_rule(a, b, npoints, 1.0)
- def midpoint_rectangle_rule(a, b, nseg):
- """Правило прямоугольников со средней точкой"""
- return _rectangle_rule(a, b, nseg, 0.5)
- def Num_1(a, b, rtol = 1e-8, nseg0 = 1):
- """Правило трапеций
- rtol - желаемая относительная точность вычислений
- nseg0 - начальное число отрезков разбиения"""
- nseg = nseg0
- old_ans = 0.0
- dx = 1.0 * (b - a) / nseg #подсчитаем длинну разбиения
- ans = 0.5 * (func(a) + func(b)) #подсчитаем интеграл на границах
- for i in range(1, nseg):
- ans += func(a + i * dx) #в цикле подсчитаем суммарную площадь всех прямоугольников, на которые разбили нушу функцию
- ans *= dx
- err_est = max(1, abs(ans))
- while (err_est > abs(rtol * ans)): #если нам не хватило точности, то воспользуемся методом средних прямоугольников
- old_ans = ans #посмотрим на старый ответ
- ans = 0.5 * (ans + midpoint_rectangle_rule(a, b, nseg)) #подсчитаем новый
- nseg *= 2
- err_est = abs(ans - old_ans) #ычислим ошибку
- return ans
- #аналогично первому пункту (решили задачу в общем виде для элементарных функций)
- def Num_2(a, b, rtol = 1e-8, nseg0 = 1):
- nseg = nseg0
- old_ans = 0.0
- dx = 1.0 * (b - a) / nseg
- ans = 0.5 * (func(a) + func(b))
- for i in range(1, nseg):
- ans += func(a + i * dx)
- ans *= dx
- err_est = max(1, abs(ans))
- while (err_est > abs(rtol * ans)):
- old_ans = ans
- ans = 0.5 * (ans + midpoint_rectangle_rule(a, b, nseg))
- nseg *= 2
- err_est = abs(ans - old_ans)
- return ans
- print(Num_1(0.0, 2.0, nseg0 = 10, rtol= 0.001))
- print(Num_1(-3, 5, nseg0= 10))
- print(Num_2(0, 1))
- print(Num_1(-1000, 1000, nseg0=1000))
- print(Num_2(-1000, 20000, nseg0=10))
- print(Num_2(1.0, 3.0, nseg0 = 1000))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement