Трапецеидальное интегрирование
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.1)
f = x**2
F = [-333.35]
for i in range(1, len(x) - 1):
F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)
fig, ax = plt.subplots()
ax.plot(x, f)
ax.plot(x[1:], F)
plt.show()
Здесь я применил теоретическую формулу (f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1]
, а интегрирование выполняется в блоке:
F = [-333.35]
for i in range(1, len(x) - 1):
F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)
Обратите внимание на , что для построения x
и F
они должны иметь одинаковое количество элементов; поэтому я игнорирую первый элемент x
, поэтому они оба имеют элемент 199
. Это результат метода трапеции d: если вы интегрируете массив f
из n
элементов, вы получите массив F
из n-1
элементов. Более того, я установил начальное значение F
на -333.35
на x = -10
, это произвольная константа из процесса интегрирования, я решил это значение, чтобы передать функцию около начала координат.
Аналитическая интеграция
import sympy as sy
import numpy as np
import matplotlib.pyplot as plt
x = sy.symbols('x')
f = x**2
F = sy.integrate(f, x)
xv = np.arange(-10, 10, 0.1)
fv = sy.lambdify(x, f)(xv)
Fv = sy.lambdify(x, F)(xv)
fig, ax = plt.subplots()
ax.plot(xv, fv)
ax.plot(xv, Fv)
plt.show()
Здесь я использую модуль symboli c math через sympy
. Интеграция выполняется в блоке:
F = sy.integrate(f, x)
Обратите внимание , что в этом случае F
и x
уже имеют одинаковое количество элементов. Тем более что код проще.