Это ошибка симпатии?

#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:

Обсуждение продолжается до следующего.

https://github.com/sympy/sympy/issues/22033?fbclid=IwAR3oPgk-sLipSDWe7lsRmqG_hpw0fEEgED5XU5K96IKDi-UnVyOzqQqjSYY

Комментарии:

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