Ошибка IndexError: list index out of range в Python
Создал код
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
Источник: Stack Overflow на русском