Ошибка IndexError: list index out of range в Python

Рейтинг: 1Ответов: 0Опубликовано: 02.04.2023

Создал код

import math
def f(x):
    return math.pow(math.log(x), 4.5)

a = 2
b = 4
exact_value = 0.3077347286 # значение интеграла, найденное с помощью формулы Ньютона-Лейбница

def newton_cotes(a, b, n):
    h = (b - a) / n
    x = [a + i * h for i in range(n+1)]
    y = [f(x_i) for x_i in x]
    integral = 0
    for i in range(n):
        integral += (y[i] + y[i+1]) / 2 * h
    return integral
def rectangle(a, b, n):
    h = (b - a) / n
    x = [a + i * h for i in range(n)]
    y = [f((x[i]+x[i+1])/2) for i in range(n)]
    integral = h * sum(y)
    return integral
def trapezoid(a, b, n):
    h = (b - a) / n
    x = [a + i * h for i in range(n+1)]
    y = [f(x_i) for x_i in x]
    integral = h/2 * (y[0] + 2 * sum(y[1:-1]) + y[-1])
    return integral
def simpson(a, b, n):
    h = (b - a) / n
    x = [a + i * h for i in range(n+1)]
    y = [f(x_i) for x_i in x]
    integral = h/3 * (y[0] + 4 * sum(y[1:-1:2]) + 2 * sum(y[2:-2:2]) + y[-1])
    return integral

n = 4
# метод Ньютона-Котеса
integral_nc = newton_cotes(a, b, n)
abs_error_nc = abs(exact_value - integral_nc)
rel_error_nc = abs_error_nc / exact_value
# метод прямоугольников
integral_rect = rectangle(a, b, n)
abs_error_rect = abs(exact_value - integral_rect)
rel_error_rect = abs_error_rect / exact_value
# метод трапеций
integral_trap = trapezoid(a, b, n)
abs_error_trap = abs(exact_value - integral_trap)
rel_error_trap = abs_error_trap / exact_value
# метод Симпсона
integral_simp = simpson(a, b, n)
abs_error_simp = abs(exact_value - integral_simp)
rel_error_simp = abs_error_simp / exact_value
# вывод результатов
print("Метод Ньютона-Котеса:")
print("Приближенное значение интеграла:", round(integral_nc, 8))
print("Абсолютная погрешность:", round(abs_error_nc, 8))
print("Относительная погрешность:", round(rel_error_nc, 8))
print()
print("Метод прямоугольников:")
print("Приближенное значение интеграла:", round(integral_rect, 8))
print("Абсолютная погрешность:", round(abs_error_rect, 8))
print("Относительная погрешность:", round(rel_error_rect, 8))
print()
print("Метод трапеций:")
print("Приближенное значение интеграла:", round(integral_trap, 8))
print("Абсолютная погрешность:", round(abs_error_trap, 8))
print("Относительная погрешность:", round(rel_error_trap, 8))
print()
print("Метод Симпсона:")
print("Приближенное значение интеграла:", round(integral_simp, 8))
print("Абсолютная погрешность:", round(abs_error_simp, 8))
print("Относительная погрешность:", round(rel_error_simp, 8))

В результате выдаёт данные ошибки:

    Traceback (most recent call last):
  File "C:\Users\petrr\Desktop\ККРИТ\Алгоритмизация\1.py", line 42, in <module>
    integral_rect = rectangle(a, b, n)
  File "C:\Users\petrr\Desktop\ККРИТ\Алгоритмизация\1.py", line 20, in rectangle
    y = [f((x[i]+x[i+1])/2) for i in range(n)]
  File "C:\Users\petrr\Desktop\ККРИТ\Алгоритмизация\1.py", line 20, in <listcomp>
    y = [f((x[i]+x[i+1])/2) for i in range(n)]
IndexError: list index out of range

Process finished with exit code 1

Ответы

Ответов пока нет.