Sympy 失败,wxMaxima 没有
Sympy fails, wxMaxima not
我正在尝试用 wxMaxima 和 sympy 求解以下不定积分:
integrate(r^2*sqrt(R^2-r^2),r)
在 Maxima 中,我确实得到了答案,但不是在同情中。我不懂为什么。我是 Python 的重度用户,并且喜欢在 Python 中进行符号数学运算,但是由于 sympy 没有解决这个问题,我仍然坚持使用 Maxima。
是我做错了什么还是 Maxiam 更好?
(我也在 Mathematica 中解决了同样的问题)
我在wxMaxima中得到了如下答案:
f:r^2*sqrt(R^2-r^2);
g:integrate(f,r);
给出了这个答案:
g:(R^4*asin(r/abs(R)))/8-(r*(R^2-r^2)^(3/2))/4+(r*R^2*sqrt(R^2-r^2))/8
它看起来很难看,但算了。这里的重点是 sympy 不能解决这个积分。试图用这段代码解决同样的问题:
import sympy as sy
import math
R,r = sy.symbols('R r')
g = sy.integrate(r**2*(R**2-r**2)**0.5,r)
print g
给出此错误消息:
Traceback (most recent call last):
File "E:\UD\Software\BendStiffener\calculate-moment\moment-calculation-equations\sympy-test.py", line 4, in <module>
g = sy.integrate(r**2*(R**2-r**2)**0.5,r)
File "C:\Python27\lib\site-packages\sympy\utilities\decorator.py", line 35, in threaded_func
return func(expr, *args, **kwargs)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 1232, in integrate
risch=risch, manual=manual)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 487, in doit
conds=conds)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 876, in _eval_integral
h = meijerint_indefinite(g, x)
File "C:\Python27\lib\site-packages\sympy\integrals\meijerint.py", line 1596, in meijerint_indefinite
res = _meijerint_indefinite_1(f.subs(x, x + a), x)
File "C:\Python27\lib\site-packages\sympy\integrals\meijerint.py", line 1646, in _meijerint_indefinite_1
r = hyperexpand(r.subs(t, a*x**b))
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2482, in hyperexpand
return f.replace(hyper, do_replace).replace(meijerg, do_meijer)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1351, in replace
rv = bottom_up(self, rec_replace, atoms=True)
File "C:\Python27\lib\site-packages\sympy\simplify\simplify.py", line 4082, in bottom_up
rv = F(rv)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1336, in rec_replace
new = _value(expr, result)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1280, in <lambda>
_value = lambda expr, result: value(*expr.args)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2479, in do_meijer
allow_hyper, rewrite=rewrite)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2375, in _meijergexpand
t, 1/z0)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2335, in do_slater
resid = residue(integrand, s, b_ + r)
File "C:\Python27\lib\site-packages\sympy\series\residues.py", line 57, in residue
s = expr.series(x, n=0)
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2435, in series
rv = self.subs(x, xpos).series(xpos, x0, n, dir, logx=logx)
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2442, in series
s1 = self._eval_nseries(x, n=n, logx=logx)
File "C:\Python27\lib\site-packages\sympy\core\mul.py", line 1446, in _eval_nseries
terms = [t.nseries(x, n=n, logx=logx) for t in self.args]
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2639, in nseries
return self._eval_nseries(x, n=n, logx=logx)
File "C:\Python27\lib\site-packages\sympy\functions\special\gamma_functions.py", line 168, in _eval_nseries
return super(gamma, self)._eval_nseries(x, n, logx)
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 598, in _eval_nseries
term = e.subs(x, S.Zero)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 892, in subs
rv = rv._subs(old, new, **kwargs)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1006, in _subs
rv = fallback(self, old, new)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 983, in fallback
rv = self.func(*args)
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 382, in __new__
return result.evalf(mlib.libmpf.prec_to_dps(pr))
File "C:\Python27\lib\site-packages\sympy\core\evalf.py", line 1317, in evalf
result = evalf(self, prec + 4, options)
File "C:\Python27\lib\site-packages\sympy\core\evalf.py", line 1217, in evalf
re, im = x._eval_evalf(prec).as_real_imag()
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 486, in _eval_evalf
v = func(*args)
File "C:\Python27\lib\site-packages\sympy\mpmath\ctx_mp_python.py", line 993, in f
return ctx.make_mpf(mpf_f(x._mpf_, prec, rounding))
File "C:\Python27\lib\site-packages\sympy\mpmath\libmp\gammazeta.py", line 1947, in mpf_gamma
raise ValueError("gamma function pole")
ValueError: gamma function pole
只要稍稍重写方程式,您就会得到一个解:
import sympy as sy
import math
R, r = sy.symbols('R r')
g = sy.integrate(r**2 * sy.sqrt((R**2 - r**2)), r)
print g.simplify()
所以我没有使用 expr**0.5
,而是使用 sy.sqrt(expr)
。这给
Piecewise((I*R*(-R**3*acosh(r/R) - R**2*r*sqrt((-R**2 + r**2)/R**2) + 2*r**3*sqrt((-R**2 + r**2)/R**2))/8, Abs(r**2/R**2) > 1), (R*(R**3*asin(r/R) - R**2*r*sqrt(1 - r**2/R**2) + 2*r**3*sqrt(1 - r**2/R**2))/8, True))
很难判断这是否与 Maxima 的结果相同,因为 sympy 为您提供了两部分的解决方案,这取决于 sqrt
中的参数是大于还是小于 0。您可以尝试使用实际边界并检查您是否获得了 Maxima 解决方案的相同结果以及 sympy 给您的结果的第二部分。
您可以像这样访问解决方案的第二部分:
g.args[1][0]
这给你:
R**4*asin(r/R)/8 - R**3*r/(8*sqrt(1 - r**2/R**2)) + 3*R*r**3/(8*sqrt(1 - r**2/R**2)) - r**5/(4*R*sqrt(1 - r**2/R**2))
您还可以通过以下方式获取简化版本:
g.args[1][0].simplify()
这给你:
R*(R**3*asin(r/R) - R**2*r*sqrt(1 - r**2/R**2) + 2*r**3*sqrt(1 - r**2/R**2))/8
现在看起来与 Maxima 获得的结果非常相似。
一般来说,SymPy 在处理有理数时比处理浮点数时表现更好,尤其是 当这些数字是幂时。
这是因为 "nice" 封闭形式的解决方案通常只存在于精确的权力。例如,考虑 this
之间的区别
In [39]: integrate(r**2*sqrt(R**2-r**2), r)
Out[39]:
⎧ 4 ⎛r⎞
⎪ ⅈ⋅R ⋅acosh⎜─⎟ 3 3 5 │ 2│
⎪ ⎝R⎠ ⅈ⋅R ⋅r 3⋅ⅈ⋅R⋅r ⅈ⋅r │r │
⎪- ───────────── + ───────────────── - ───────────────── + ─────────────────── for │──│ > 1
⎪ 8 _________ _________ _________ │ 2│
⎪ ╱ 2 ╱ 2 ╱ 2 │R │
⎪ ╱ r ╱ r ╱ r
⎪ 8⋅ ╱ -1 + ── 8⋅ ╱ -1 + ── 4⋅R⋅ ╱ -1 + ──
⎪ ╱ 2 ╱ 2 ╱ 2
⎪ ╲╱ R ╲╱ R ╲╱ R
⎨
⎪ 4 ⎛r⎞
⎪ R ⋅asin⎜─⎟ 3 3 5
⎪ ⎝R⎠ R ⋅r 3⋅R⋅r r
⎪ ────────── - ──────────────── + ──────────────── - ────────────────── otherwise
⎪ 8 ________ ________ ________
⎪ ╱ 2 ╱ 2 ╱ 2
⎪ ╱ r ╱ r ╱ r
⎪ 8⋅ ╱ 1 - ── 8⋅ ╱ 1 - ── 4⋅R⋅ ╱ 1 - ──
⎪ ╱ 2 ╱ 2 ╱ 2
⎩ ╲╱ R ╲╱ R ╲╱ R
还有这个
In [40]: integrate(r**2*(R**2-r**2)**0.5001, r)
Out[40]:
⎛ │ 2 2⋅ⅈ⋅π⎞
1.0002 3 ┌─ ⎜-0.5001, 3/2 │ r ⋅ℯ ⎟
0.333333333333333⋅R ⋅r ⋅ ├─ ⎜ │ ─────────⎟
2╵ 1 ⎜ 5/2 │ 2 ⎟
⎝ │ R ⎠
幂差不多是0.5,但是答案需要用特殊的函数来表示。 SymPy 可能没有注意到 0.5 应该是 1/2(浮点数的不精确性对此无济于事)。
话虽如此,我认为这是一个 SymPy 错误,尤其是因为它 可以 计算 integrate(r**2*(R**2-r**2)**0.5001, r)
。
我正在尝试用 wxMaxima 和 sympy 求解以下不定积分:
integrate(r^2*sqrt(R^2-r^2),r)
在 Maxima 中,我确实得到了答案,但不是在同情中。我不懂为什么。我是 Python 的重度用户,并且喜欢在 Python 中进行符号数学运算,但是由于 sympy 没有解决这个问题,我仍然坚持使用 Maxima。
是我做错了什么还是 Maxiam 更好? (我也在 Mathematica 中解决了同样的问题)
我在wxMaxima中得到了如下答案:
f:r^2*sqrt(R^2-r^2);
g:integrate(f,r);
给出了这个答案:
g:(R^4*asin(r/abs(R)))/8-(r*(R^2-r^2)^(3/2))/4+(r*R^2*sqrt(R^2-r^2))/8
它看起来很难看,但算了。这里的重点是 sympy 不能解决这个积分。试图用这段代码解决同样的问题:
import sympy as sy
import math
R,r = sy.symbols('R r')
g = sy.integrate(r**2*(R**2-r**2)**0.5,r)
print g
给出此错误消息:
Traceback (most recent call last):
File "E:\UD\Software\BendStiffener\calculate-moment\moment-calculation-equations\sympy-test.py", line 4, in <module>
g = sy.integrate(r**2*(R**2-r**2)**0.5,r)
File "C:\Python27\lib\site-packages\sympy\utilities\decorator.py", line 35, in threaded_func
return func(expr, *args, **kwargs)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 1232, in integrate
risch=risch, manual=manual)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 487, in doit
conds=conds)
File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 876, in _eval_integral
h = meijerint_indefinite(g, x)
File "C:\Python27\lib\site-packages\sympy\integrals\meijerint.py", line 1596, in meijerint_indefinite
res = _meijerint_indefinite_1(f.subs(x, x + a), x)
File "C:\Python27\lib\site-packages\sympy\integrals\meijerint.py", line 1646, in _meijerint_indefinite_1
r = hyperexpand(r.subs(t, a*x**b))
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2482, in hyperexpand
return f.replace(hyper, do_replace).replace(meijerg, do_meijer)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1351, in replace
rv = bottom_up(self, rec_replace, atoms=True)
File "C:\Python27\lib\site-packages\sympy\simplify\simplify.py", line 4082, in bottom_up
rv = F(rv)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1336, in rec_replace
new = _value(expr, result)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1280, in <lambda>
_value = lambda expr, result: value(*expr.args)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2479, in do_meijer
allow_hyper, rewrite=rewrite)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2375, in _meijergexpand
t, 1/z0)
File "C:\Python27\lib\site-packages\sympy\simplify\hyperexpand.py", line 2335, in do_slater
resid = residue(integrand, s, b_ + r)
File "C:\Python27\lib\site-packages\sympy\series\residues.py", line 57, in residue
s = expr.series(x, n=0)
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2435, in series
rv = self.subs(x, xpos).series(xpos, x0, n, dir, logx=logx)
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2442, in series
s1 = self._eval_nseries(x, n=n, logx=logx)
File "C:\Python27\lib\site-packages\sympy\core\mul.py", line 1446, in _eval_nseries
terms = [t.nseries(x, n=n, logx=logx) for t in self.args]
File "C:\Python27\lib\site-packages\sympy\core\expr.py", line 2639, in nseries
return self._eval_nseries(x, n=n, logx=logx)
File "C:\Python27\lib\site-packages\sympy\functions\special\gamma_functions.py", line 168, in _eval_nseries
return super(gamma, self)._eval_nseries(x, n, logx)
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 598, in _eval_nseries
term = e.subs(x, S.Zero)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 892, in subs
rv = rv._subs(old, new, **kwargs)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 1006, in _subs
rv = fallback(self, old, new)
File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 983, in fallback
rv = self.func(*args)
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 382, in __new__
return result.evalf(mlib.libmpf.prec_to_dps(pr))
File "C:\Python27\lib\site-packages\sympy\core\evalf.py", line 1317, in evalf
result = evalf(self, prec + 4, options)
File "C:\Python27\lib\site-packages\sympy\core\evalf.py", line 1217, in evalf
re, im = x._eval_evalf(prec).as_real_imag()
File "C:\Python27\lib\site-packages\sympy\core\function.py", line 486, in _eval_evalf
v = func(*args)
File "C:\Python27\lib\site-packages\sympy\mpmath\ctx_mp_python.py", line 993, in f
return ctx.make_mpf(mpf_f(x._mpf_, prec, rounding))
File "C:\Python27\lib\site-packages\sympy\mpmath\libmp\gammazeta.py", line 1947, in mpf_gamma
raise ValueError("gamma function pole")
ValueError: gamma function pole
只要稍稍重写方程式,您就会得到一个解:
import sympy as sy
import math
R, r = sy.symbols('R r')
g = sy.integrate(r**2 * sy.sqrt((R**2 - r**2)), r)
print g.simplify()
所以我没有使用 expr**0.5
,而是使用 sy.sqrt(expr)
。这给
Piecewise((I*R*(-R**3*acosh(r/R) - R**2*r*sqrt((-R**2 + r**2)/R**2) + 2*r**3*sqrt((-R**2 + r**2)/R**2))/8, Abs(r**2/R**2) > 1), (R*(R**3*asin(r/R) - R**2*r*sqrt(1 - r**2/R**2) + 2*r**3*sqrt(1 - r**2/R**2))/8, True))
很难判断这是否与 Maxima 的结果相同,因为 sympy 为您提供了两部分的解决方案,这取决于 sqrt
中的参数是大于还是小于 0。您可以尝试使用实际边界并检查您是否获得了 Maxima 解决方案的相同结果以及 sympy 给您的结果的第二部分。
您可以像这样访问解决方案的第二部分:
g.args[1][0]
这给你:
R**4*asin(r/R)/8 - R**3*r/(8*sqrt(1 - r**2/R**2)) + 3*R*r**3/(8*sqrt(1 - r**2/R**2)) - r**5/(4*R*sqrt(1 - r**2/R**2))
您还可以通过以下方式获取简化版本:
g.args[1][0].simplify()
这给你:
R*(R**3*asin(r/R) - R**2*r*sqrt(1 - r**2/R**2) + 2*r**3*sqrt(1 - r**2/R**2))/8
现在看起来与 Maxima 获得的结果非常相似。
一般来说,SymPy 在处理有理数时比处理浮点数时表现更好,尤其是 当这些数字是幂时。
这是因为 "nice" 封闭形式的解决方案通常只存在于精确的权力。例如,考虑 this
之间的区别In [39]: integrate(r**2*sqrt(R**2-r**2), r)
Out[39]:
⎧ 4 ⎛r⎞
⎪ ⅈ⋅R ⋅acosh⎜─⎟ 3 3 5 │ 2│
⎪ ⎝R⎠ ⅈ⋅R ⋅r 3⋅ⅈ⋅R⋅r ⅈ⋅r │r │
⎪- ───────────── + ───────────────── - ───────────────── + ─────────────────── for │──│ > 1
⎪ 8 _________ _________ _________ │ 2│
⎪ ╱ 2 ╱ 2 ╱ 2 │R │
⎪ ╱ r ╱ r ╱ r
⎪ 8⋅ ╱ -1 + ── 8⋅ ╱ -1 + ── 4⋅R⋅ ╱ -1 + ──
⎪ ╱ 2 ╱ 2 ╱ 2
⎪ ╲╱ R ╲╱ R ╲╱ R
⎨
⎪ 4 ⎛r⎞
⎪ R ⋅asin⎜─⎟ 3 3 5
⎪ ⎝R⎠ R ⋅r 3⋅R⋅r r
⎪ ────────── - ──────────────── + ──────────────── - ────────────────── otherwise
⎪ 8 ________ ________ ________
⎪ ╱ 2 ╱ 2 ╱ 2
⎪ ╱ r ╱ r ╱ r
⎪ 8⋅ ╱ 1 - ── 8⋅ ╱ 1 - ── 4⋅R⋅ ╱ 1 - ──
⎪ ╱ 2 ╱ 2 ╱ 2
⎩ ╲╱ R ╲╱ R ╲╱ R
还有这个
In [40]: integrate(r**2*(R**2-r**2)**0.5001, r)
Out[40]:
⎛ │ 2 2⋅ⅈ⋅π⎞
1.0002 3 ┌─ ⎜-0.5001, 3/2 │ r ⋅ℯ ⎟
0.333333333333333⋅R ⋅r ⋅ ├─ ⎜ │ ─────────⎟
2╵ 1 ⎜ 5/2 │ 2 ⎟
⎝ │ R ⎠
幂差不多是0.5,但是答案需要用特殊的函数来表示。 SymPy 可能没有注意到 0.5 应该是 1/2(浮点数的不精确性对此无济于事)。
话虽如此,我认为这是一个 SymPy 错误,尤其是因为它 可以 计算 integrate(r**2*(R**2-r**2)**0.5001, r)
。