https://pastein.ru/t/vrX

  скопируйте уникальную ссылку для отправки


from math import sin, cos, sqrt, pi, inf
import numpy as np

A, B = 6, 9
EPS = 10**-7


def f1(x):
    return sqrt((9-2*x) / (2*x-21))


# метод трапеций
def trapezoidal_rule(f, a, b, n):
    h = (b - a) / n
    s = 0.5 * (f(a) + f(b))
    for i in range(1, n):
        s += f(a + i * h)
    return s * h


# метод Симпсона
def simpson_rule(f, a, b, n):
    h = (b - a) / n
    s = f(a) + f(b)
    for i in range(1, n, 2):
        s += 4 * f(a + i * h)
    for i in range(2, n-1, 2):
        s += 2 * f(a + i * h)
    return s * h / 3


def runge_eps(s1, s2, m):
    return abs(s2 - s1) / (2**m - 1)


def print_row(n, h, i, r):
    add_tab = '\t' if n < 10 else ''
    print(f'N={n}{add_tab}\th={h:.12f}\tI={i:.12f}\tR={r:.12f}')


# метод трапеций с точностью eps
def trapezoidal_rule_eps(f, a, b, eps):
    print('trapezoidal_rule_eps')
    n = 2
    m = 2  # порядок точности
    s1 = inf
    s2 = trapezoidal_rule(f, a, b, 1)
    while runge_eps(s1, s2, m) > eps:
        s1 = s2
        s2 = trapezoidal_rule(f, a, b, n)
        print_row(n, (b-a)/n, s2, runge_eps(s1, s2, m))
        n *= 2
    print()
    return s2, n, runge_eps(s1, s2, m)


# метод Симпсона с точностью eps
def simpson_rule_eps(f, a, b, eps):
    print('simpson_rule_eps')
    n = 2
    m = 4  # порядок точности
    s1, s2 = inf, simpson_rule(f, a, b, 1)
    while runge_eps(s1, s2, m) > eps:
        s1, s2 = s2, simpson_rule(f, a, b, n)
        print_row(n, (b-a)/n, s2, runge_eps(s1, s2, m))
        n *= 2
    print()
    return s2, n, runge_eps(s1, s2, m)


K = 4
gauss_coeff = [
    [sqrt(3/7-2/7*sqrt(6/5)), (18+sqrt(30))/36],
    [-sqrt(3/7-2/7*sqrt(6/5)), (18+sqrt(30))/36],
    [sqrt(3/7+2/7*sqrt(6/5)), (18-sqrt(30))/36],
    [-sqrt(3/7+2/7*sqrt(6/5)), (18-sqrt(30))/36],
]
def nast_rule(f, a, b):
    r = 0
    for x_g, w_g in gauss_coeff:
        # конвертируем x на наш отрезок
        x = (a + b) / 2.0 + (b - a) / 2.0 * x_g
        r += f(x) * w_g
    r *= (b - a) / 2
    return r


def main():
    prec_value = pi
    trapez_res = trapezoidal_rule(f1, A, B, 1000)
    simpson_res = simpson_rule(f1, A, B, 1000)
    trapez_eps_res, trapez_steps, trapez_eps_runge = trapezoidal_rule_eps(f1, A, B, EPS)
    simpson_eps_res, simpson_steps, simpson_eps_runge = simpson_rule_eps(f1, A, B, EPS)

    print(f"Метод трапеций с 1000 разбиениями: {trapez_res}")
    print(f"Реальная погрешность: {abs(prec_value - trapez_res):.12f}")
    print(f"Метод Симпсона с 1000 разбиениями: {simpson_res}")
    print(f"Реальная погрешность: {abs(prec_value - simpson_res):.12f}")
    print()

    print(f"Метод трапеций с точностью {EPS}: {trapez_eps_res}")
    print(f"Количество разбиений: {trapez_steps}")
    print(f"Погрешность по Рунге: {trapez_eps_runge:.12f}")
    print(f"Реальная погрешность: {abs(prec_value - trapez_eps_res):.12f}")
    print(f"Метод Симпсона с точностью {EPS}: {simpson_eps_res}")
    print(f"Количество разбиений: {simpson_steps}")
    print(f"Погрешность по Рунге: {simpson_eps_runge:.12f}")
    print(f"Реальная погрешность: {abs(prec_value - simpson_eps_res):.12f}")
    print()

    nast_res = nast_rule(f1, A, B)
    print(f"КФ НАСТ с k={K}: {nast_res}")
    print(f"Реальная погрешность: {abs(prec_value - nast_res):.12f}")



if __name__ == '__main__':
    main()