Интеграция на питоне
Привет, мой лектор задал вопрос об интеграции функции через python, и он дал нам очень мало информации. границы + бесконечность и бесконечность и функция
(cos a*x) * (e**-x**2)
пока у меня есть
def gauss_cosine(a, n):
sum=0.0
dx = ((math.cosine(a*x)*math.exp(-x**2)))
return
for k in range (0,n):
x=a+k*dx
sum=sum+f(x)
return dx*sum
не уверен, правильно ли это вообще. С уважением
3 ответа
Ну, у вашего интеграла есть аналитическое решение, и вы можете вычислить его с помощью sympy, как @Bill указал +1.
Тем не менее, я думаю, что вопрос был в том, как численно рассчитать этот интеграл, и это то, что я обсуждаю здесь.
Интегрант четный. Мы уменьшаем домен до [0,+inf]
и будет умножаться на 2
результат.
У нас еще есть колебательный интеграл в неограниченной области. Это часто отвратительный зверь, но мы знаем, что он сходится и хорошо ведет себя в +- inf
, Другими словами, exp(-x**2)
распадается на ноль достаточно быстро.
Хитрость заключается в том, чтобы изменить переменную интеграции, x=tan(t)
, чтобы dx=(1+x**2)dt
, Домен становится [0,pi/2]
, он ограничен, и численное интегрирование является тогда кусочком пирога.
Пример с правилом Симпсона из scipy
, с a=2
, С просто 100
Точки дискретизации у нас есть 5
точность цифр!
from scipy.integrate import simps
from numpy import seterr, pi, sqrt, linspace, tan, cos, exp
N = 100
a = 2.
t = linspace(0, pi / 2, N)
x = tan(t)
f = cos(a * x) * exp(-x ** 2) * (1 + x ** 2)
print "numerical solution = ", 2 * simps(f, t)
print "analytical solution = ",sqrt(pi) * exp(-a ** 2 / 4)
Я не вижу, чтобы это рекомендовало много на этом сайте, но вы можете попробовать sympy:
In [1]: import sympy as sp
In [2]: x, a = sp.symbols(('x', 'a'))
In [3]: f = sp.cos(a*x) * sp.exp(-x**2)
In [4]: res = sp.integrate(f, (x, -sp.oo, sp.oo))
In [5]: res
Out[5]: sqrt(pi) * exp
In [6]: sp.pprint(res)
Out[6]:
2
-a
────
___ 4
╲╱ π ⋅ℯ
Для численного интегрирования попробуйте пакет scipy.
Вашему компьютеру будет очень трудно представить эти границы.
Начните с построения вашей функции.
Это также помогает узнать ответ, прежде чем начать.
Я бы рекомендовал разбить его на два интеграла: один от минус-бесконечности до нуля, а другой от нуля до плюс-бесконечности. Как отмечает flebool ниже, это четная функция. Убедитесь, что вы знаете, что это значит и последствия для вашего решения.
Далее вам понадобится схема интеграции, которая может иметь дело с граничными условиями на бесконечности. Ищите схему квадратурного бревна.
Наивная интеграция Эйлера не будет моей первой мыслью.