Решить интеграл тремя разными способами
У меня получается бесконечный цикл в этом моменте
if abs((tulemus-tulemus2)/(2**2 - 1)) <= eps:
return [tulemus, n]
else:
return ristkylik(a,b,f,n*2,eps)
и я не знаю, как это исправить. Суть задания в том, чтобы решить интеграл тремя разными методами и закончить процесс, когда
.
Эпсилон равен 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)):
и у меня интегрирование завершилось. Другие способы интегрирования не смотрел. Вероятно, там такой же нюанс.