使用 Sympy 在 Python 中进行符号集成

Posted

技术标签:

【中文标题】使用 Sympy 在 Python 中进行符号集成【英文标题】:Symbolic Integration in Python using Sympy 【发布时间】:2012-08-23 14:05:30 【问题描述】:

我想使用 sympy 库将 exp(-(x^2 + y^2)) 集成到 python 中。 我可以找到 exp(-(x^2))

的积分
>>> B1 = sympy.exp(-alpha1 * (r1_x**2))
>>> p = integrate(B1,r1_x)
>>> p
pi**(1/2)*erf(alpha1**(1/2)*r1_x)/(2*alpha1**(1/2))

但是当我想尝试积分 exp(-(x^2 + y^2))

>>> B1 = sympy.exp(-alpha1 * (r1_x**2 + r1_y**2))
>>> p = integrate(B1,r1_x)
>>> p
Integral(exp(-alpha1*(r1_x**2 + r1_y**2)), r1_x)

没有输出,python不能取积分!

【问题讨论】:

一般来说,这个积分没有闭式解。 【参考方案1】:

(我是 SymPy 的首席开发人员)

DSM 是正确的,您可以通过调用 expand 来使其工作,并且没有通用的方法可以做到这一点(因为通常,积分没有封闭形式)。

我只是想指出,如果 SymPy 无法进行具有封闭形式的积分,我们认为这是一个错误,您可以随时通过 http://code.google.com/p/sympy/issues 报告它。

【讨论】:

其实我尝试用python、matlab和mathematica解决,我感觉这些软件有不同的算法来评估积分。无论如何,我更喜欢使用 python,因为我想从我的 c++ 程序中调用它。【参考方案2】:

sympy 并不总是能识别每一种形式,所以有时你必须给它一点帮助:

>>> import sympy
>>> alpha1, r1_x, r1_y = sympy.var("alpha1 r1_x r1_y")
>>> B1 = sympy.exp(-alpha1 * (r1_x**2 + r1_y**2))
>>> B1.integrate(r1_x)
Integral(exp(-alpha1*(r1_x**2 + r1_y**2)), r1_x)
>>> B1.expand(alpha1)
exp(-alpha1*r1_x**2)*exp(-alpha1*r1_y**2)
>>> B1.expand(alpha1).integrate(r1_x)
sqrt(pi)*exp(-alpha1*r1_y**2)*erf(sqrt(alpha1)*r1_x)/(2*sqrt(alpha1))

【讨论】:

谢谢,有通用的方法吗?既然这里的方程很简单,那么对于微妙的方程我该怎么办? 我不知道;并准备好进行实验。很抱歉成为坏消息的承担者! B1.expand(alpha1) 应该只是 B1.expand()。 expand 的参数只是提示。

以上是关于使用 Sympy 在 Python 中进行符号集成的主要内容,如果未能解决你的问题,请参考以下文章

python系列22:sympy概述

Python - 将符号表达式(sympy)写入txt文件

使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式

Python的代数符号运算Sympy库的入门文章

Python圈中的符号计算库-Sympy(转载)

python sympy evalf()函数