#sympy
Вопрос:
Почему у нас получается странный результат с интеграцией выражения симпатией.
>>> from sympy import *
>>> from sympy import __version__
>>> __version__
'1.8'
>>> x = Symbol('x')
>>> f = (x**2 - Rational(1, 4))**2 * sqrt(1 - x**2); f
sqrt(1 - x**2)*(x**2 - 1/4)**2
>>> integrate(f, (x, -1, 1))
0
Подынтегральное выражение строго положительное, этот результат неверен.
Однако, разделив интервал (x, -1, 1) на (x, -1, 0) и (x, 0, 1), мы получим правильный.
>>> integrate(f, (x, -1, 0))
pi/64
>>> integrate(f, (x, 0, 1))
pi/64
Расширяя подынтегральное выражение, результат также является правильным.
>>> g = f.expand(); g
x**4*sqrt(1 - x**2) - x**2*sqrt(1 - x**2)/2 sqrt(1 - x**2)/16
>>> integrate(g, (x, -1, 1))
pi/32
Это странное явление происходит с версии 1.5 SymPy.
>>> from sympy import *
>>> from sympy import __version__
>>> __version__
'1.4'
>>> x = Symbol('x')
>>> f = (x**2 - Rational(1, 4))**2 * sqrt(1 - x**2); f
sqrt(1 - x**2)*(x**2 - 1/4)**2
>>> integrate(f, (x, -1, 1))
pi/32
Это ошибка?
Комментарии:
1. Да, это ошибка. Пожалуйста, откройте проблему с sympy на github.
2. Большое спасибо. Я так и сделал.
Ответ №1:
Обсуждение продолжается до следующего.
Комментарии:
1. Пожалуйста, укажите дополнительную информацию в своем ответе. Как это написано в настоящее время, трудно понять ваше решение.
Ответ №2:
Я не уверен в коде функции интеграции, но я понимаю следующее. Примитивная функция f = (x**2 - Rational(1,4))**2 * sqrt(1 - x**2)
заключается в следующем.
>>> from sympy import *
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = Symbol('x')
>>> f = (x**2 - Rational(1,4))**2 * sqrt(1 - x**2)
>>> F = integrate(f).simplify(); F
Piecewise((-x**3*(1 - x**2)**(3/2)/6 x*sqrt(1 - x**2)/32 asin(x)/32, (x > -1) amp; (x < 1)))
>>> X = np.linspace(-1, 1, 1000)
>>> Y = np.vectorize(Lambda(x, F))(X)
>>> plt.plot(X, Y)
>>> plt.show()
Это правильно.
Однако в определенном интеграле по отношению к действительному числу fr
xr
в качестве следствий используется другое выражение.
>>> xr = Symbol('xr', real=True)
>>> fr = (xr**2 - Rational(1,4))**2 * sqrt(1 - xr**2)
>>> Fr = integrate(fr).simplify()
>>> Fr
Piecewise((xr**4*sqrt(1 - xr**2)*Abs(xr)/6 - xr**2*sqrt(1 - xr**2)*Abs(xr)/6 sqrt(1 - xr**2)*Abs(xr)/32 - asin(sqrt(1 - xr**2))/32, (xr > -1) amp; (xr < 1) amp; Ne(xr, 0)))
>>> Yr = np.vectorize(Lambda(xr, Fr))(X)
>>> plt.plot(X, Yr)
>>> plt.show()
Это неверно.
Я думаю, что интеграция путем замены с y = x**2
используется неадекватно подобным образом..
>>> y = Symbol('y')
>>> g = (y - Rational(1,4))**2 * sqrt(1 - y)/2/sqrt(y)
>>> G = integrate(g).simplify(); G
Piecewise((y**(5/2)*sqrt(1 - y)/6 - y**(3/2)*sqrt(1 - y)/6 sqrt(y)*sqrt(1 - y)/32 - asin(sqrt(1 - y))/32, (y <= 1) amp; (y > 0)))
>>> Gr = G.subs(y, x**2).simplify(); Gr
Piecewise((sqrt(1 - x**2)*(x**2)**(5/2)/6 - sqrt(1 - x**2)*(x**2)**(3/2)/6 sqrt(1 - x**2)*sqrt(x**2)/32 - asin(sqrt(1 - x**2))/32, (x > -1) amp; (x < 1) amp; Ne(x, 0)))
>>> Z = np.vectorize(Lambda(x, Gr))(X)
>>> plt.plot(X, Z)
>>> plt.show()
Эта функция такая же, как Fr
и выше.
Однако я не знаю, почему x = sin(t)
не используется хорошо известная интеграция путем замены на.
>>> t = Symbol('t')
>>> h = (sin(t)**2 - Rational(1,4))**2 * cos(t)**2
>>> H = integrate(h).simplify()
>>> H = integrate(h)
>>> H
t*sin(t)**6/16 3*t*sin(t)**4*cos(t)**2/16 - t*sin(t)**4/16 3*t*sin(t)**2*cos(t)**4/16 - t*sin(t)**2*cos(t)**2/8 t*sin(t)**2/32 t*cos(t)**6/16 - t*cos(t)**4/16 t*cos(t)**2/32 sin(t)**5*cos(t)/16 - sin(t)**3*cos(t)**3/6 - sin(t)**3*cos(t)/16 - sin(t)*cos(t)**5/16 sin(t)*cos(t)**3/16 sin(t)*cos(t)/32
>>> H1 = H.subs(t, asin(x)).simplify(); H1
x**5*sqrt(1 - x**2)/6 - x**3*sqrt(1 - x**2)/6 x*sqrt(1 - x**2)/32 asin(x)/32
Это то же самое, что и примитивная функция F
f
выше, и имеет другое выражение.
>>> H2 = H.simplify().subs(t, asin(x)); H2
sin(6*asin(x))/192 asin(x)/32
>>> plt.show()
Используя это, мы можем получить следующий правильный определенный интеграл от f
[-1, 1].
>>> H2.subs(x, 1) - H2.subs(x, -1)
pi/32