Sympy-积分未评估

时间:2020-03-02 16:33:28

标签: python sympy

我无法用Sympy解决这个不确定的积分。我用Wolfram Alpha进行了检查,它显然收敛了。

import sympy as sp
a, b, C = sp.symbols("a, b, C", real=True)
E = sp.symbols("E", real=True, positive=True)
chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
sp.integrate(chi, E)

我试图用指数函数重写表达式,但是没有运气:

sp.integrate(chi.rewrite(sp.exp).expand().powsimp(), E)

我还尝试指定了不同的算法,即meijerg = True,而不是risch = True ...无效。

可以用Sympy解决它吗?是什么原因导致这种行为?

2 个答案:

答案 0 :(得分:2)

如果integrate返回未求积分,则意味着没有算法知道如何求积分。将各种选项设置为True不会做任何事情,因为它们都是默认情况下都会尝试的(只有在您要尝试特定算法的情况下才存在)。

如果您将双曲线正弦重写为指数(rewrite(exp),进行替换sqrt(E) = x,SymPy可能会集成一些东西(SymPy可以使用Integral.transform(sqrt(E), x)为您完成此工作),然后完成指数的平方。

答案 1 :(得分:0)

感谢@asmeurer建议使用方法transform()。我试图编辑他的答案,以包括解决方案的代码,可惜它被拒绝了。

到代码:

# added positive=True, necessary to solve this integral
a = sp.symbols("a", real=True, positive=True)
b, C = sp.symbols("b, C", real=True)
E = sp.symbols("E", real=True, positive=True)
chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
f = chi.rewrite(sp.exp).expand().powsimp()
x = sp.symbols("x", real=True, positive=True)
r = f.func(*[sp.Integral(a, E).transform(sp.sqrt(E), x).doit() for a in f.args])
r = r.subs(x, sp.sqrt(E))

请注意,我可以使用sp.Integral(f, E).transform(sp.sqrt(E), x).doit(),但至少要花几分钟的时间进行计算。

通过使用积分的线性属性,我使用命令r = f.func(...)将积分应用于表达式的不同项。计算时间减少到几秒钟!

相关问题