Решить интеграл тремя разными способами

У меня получается бесконечный цикл в этом моменте

if abs((tulemus-tulemus2)/(2**2 - 1)) <= eps:
        return [tulemus, n]
else:
       return ristkylik(a,b,f,n*2,eps)

и я не знаю, как это исправить. Суть задания в том, чтобы решить интеграл тремя разными методами и закончить процесс, когда runge.

Эпсилон равен 1e-07. Буду очень благодарна за помощь.

import math

n = 2
def f(x):
    return x*math.exp(x)

def h(a, b, n):
    return (b-a)/n

def ristkylik(a,b,f,n,eps):
    h1 = h(a, b, n)
    h2 = 2 * h(a, b, n)
    integraal = 0
    for j in range(n):
        integraal += f(a + h1*(j + 0.5))
    tulemus =  integraal * h1
    integraal2 = 0
    for i in range(n):
        integraal2 += f(a + h2*(i + 0.5))
    tulemus2 =  integraal2 * h2
    if abs((tulemus-tulemus2)/(2**2 - 1)) <= eps:
        return [tulemus, n]
    else:
        return ristkylik(a,b,f,n*2,eps)

def trapets(a,b,f,n,eps):
    h1 = h(a, b, n)
    h2 = 2 * h(a, b, n)
    x = a
    x2 = a
    s = f(x) - f(b)
    for k in range(1, n+1):
        x = x + h1
        s = s + 2*f(x)
    integraal = h1/2 * s
    s2 = f(x2) - f(b)
    for l in range(1, n+1):
        x2 = x2 + h2
        s2 = s2 + 2*f(x2)
    integraal2 = h2/2 * s2
    if abs((integraal-integraal2)/(2**2 - 1)) <= eps:
        return [integraal, n]
    else:
        return trapets(a,b,f,n*2,eps)

def simpson(a,b,f,n,eps):
    h1 = h(a, b, n)
    integraal = 0
    x = a + h1
    for i in range(1, int(n/2 + 1)):
        integraal += 4*f(x)
        x += 2*h1    
    y = a + 2*h1
    for i in range(1, int(n/2)):
        integraal += 2*f(y)
        y += 2*h1
    tulemus = h1/3 * (f(a) + f(b) + integraal)
    h2 = 2 * h(a, b, n)
    integraal2 = 0
    x2 = a + h2
    for i in range(1, int(n/2 + 1)):
        integraal2 += 4*f(x2)
        x2 += 2*h2
    y2 = a + 2*h2
    for i in range(1, int(n/2)):
        integraal2 += 2*f(y2)
        y2 += 2*h2
    tulemus2 = h2/3 * (f(a) + f(b) + integraal2)
    if abs((tulemus-tulemus2)/(2**4 - 1)) <= eps:
        return [tulemus, n]
    else:
        return simpson(a,b,f,n*2,eps)

def runge(a,b,f,valem,eps):
    if valem == "ristkylik":
        return ristkylik(a,b,f,n, eps)
    if valem == "trapets":
        return trapets(a,b,f,n,eps)
    if valem == "simpson":
        return simpson(a,b,f,n,eps)
    
print(runge(1,2,f,"ristkylik",1e-08))

Ответы (1 шт):

Автор решения: Андрюха

у вас h2 это удвоенное h1 следовательно второй цикл for должен идти с половинчатым n, ведь n это насколько частей мы делим отрезок. Логично, что когда мы увеличиваем шаг интегрирования, то количество узлов в сетке меняется. Я поменял второй for на

for i in range(int(n/2)):

и у меня интегрирование завершилось. Другие способы интегрирования не смотрел. Вероятно, там такой же нюанс.

→ Ссылка