Scipy не будет выполнять аналитическую интеграцию для вас, так как он предназначен для решения численных задач. SymPy, с другой стороны, может обрабатывать простые символические проблемы именно:
>>> import sympy as sym
>>> x = sym.symbols('x')
>>> f = sym.Piecewise((x*(x+3),x<3), (x*(-2*x+2),True))
>>> sym.integrate(f,(x,0,6))
-153/2
Сравнить
>>> import scipy.integrate as integrate
>>> integrate.quad(lambda x:x*(x+3),0,3)[0] + integrate.quad(lambda x:x*(-2*x+2),3,6)[0]
-76.5
>>> -153/2.
-76.5
Вы также можете определить исходную функцию кусочно-первых, а затем умножить его с символическим x
, затем интегрировать этот новая функция аналитически.
Другая альтернатива, возможно, ближе к духу вашего вопроса, может заключаться в том, чтобы определить кусочную функцию численно и использовать scipy в конце концов. Это будет по-прежнему сохранять вашу работу, но не будет строго аналитический:
>>> f = lambda x: x*(x+3) if x<3 else x*(-2*x+2)
>>> integrate.quad(f,0,6)[0]
-76.5
Наиболее полная установка с этим подходом:
>>> f = lambda x: x+3 if x<3 else -2*x+2
>>> xf = lambda x: x*f(x)
>>> first_mom = integrate.quad(xf,0,6)[0]
>>> print(first_mom)
-76.5
Сначала определим кусочно лямбда для f
, то подынтегральное первого момента, умножив его на x
. Тогда мы выполняем интеграцию.
Обратите внимание, что многие не могут привязать лямбда к переменным.Если вы хотите, чтобы сделать это правильно, вы, вероятно, следует определить функцию с именем для функции кусочно-, и использовать только лямбда внутри интеграции (если иначе вы бы не использовать эту подынтегральное):
import scipy.integrate as integrate
def f(x):
return x+3 if x<3 else -2*x+2
first_mom = integrate.quad(lambda x: x*f(x),0,6)[0]
"Analytical" и «SciPy «не будет смешиваться очень хорошо. Если вам нужна аналитическая интеграция, используйте 'sympy'. Напротив, 'scipy' предназначен для численных задач и численного интегрирования. –
Что вы подразумеваете под «аналитическим»? 'quad' - это числовая интеграция. Он не вычисляет выражение '1/3 * x ** 3 + 3/2 * x ** 2'. 'np.polyint' может выполнять неопределенное полиномиальное интегрирование этих двух выражений. – hpaulj
Хорошо, так что аналитику или использование чего-то типа quad отлично там, где функция передается для интеграции. – user2520932