处理多元多项式的库
我需要写一些代码来生成和处理多变量的多项式。让我用一个简单的例子来说明我的任务。
假设我有三个表达式:2x²、3y + 1和1z。我需要把它们相乘,这样就会得到6x²yz + 2x²z。然后,我想要对这个表达式分别对x、y和z求偏导数。这样我会得到12xyz + 4xz、6x²z和6x²y + 2x²。
我的问题是,如何在包含成千上万变量的表达式上进行这样的简单操作,我需要一个系统化的简单方法。我很想用Python,因为我已经用numpy/scipy/matplotlib完成了很多相关的项目功能,但如果其他语言有好的工具箱,我也愿意尝试。我在做大学研究,所以我也愿意使用Matlab。
我还没找到任何好的Python库能轻松做到这一点,我理想中的工具是类似于scipy的多项式例程,能够处理多维多项式。有没有人知道适合这个问题的好库,并且容易与现有的Python代码集成?
谢谢!
后续:我花了几天时间使用sympy,发现它非常好用。不过,对于我正在处理的问题的规模来说,它的速度太慢了,所以我现在打算去探索Matlab。为了给出一个非常粗略的速度估计,计算一个包含250个变量的二阶多项式的每个偏导数大约花了5秒。
后续 #2:我可能应该在还在处理这个问题的时候就这样做,但我还是想告诉大家,Matlab的符号库在速度上与sympy非常接近。换句话说,对于大规模计算来说,它们都非常慢。这两个库都非常容易使用,所以对于小规模计算,我强烈推荐其中任意一个。
为了解决我的问题,我手动计算了梯度,简化了它们,然后用我发现的模式在代码中硬编码了一些值。这虽然工作量更大,但让我的代码速度提高了很多,最终变得可用。
3 个回答
你提到的Matlab和其他工具通常是用来做数字计算的。如果你需要进行符号计算,建议你考虑使用Mathematica或者其他的计算机代数系统(CAS)。你可以查看这个维基链接:http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems,里面对各种CAS进行了比较。
如果你在用MATLAB的话,符号工具箱(symbolic TB)用起来很不错,前提是你有这个工具箱。如果没有的话,可以试试我的sympoly工具包。只需要从文件交换区下载就可以了。
sympoly x y z
A = 2*x^2; B = 3*y + 1;C = 1*z;
gradient(A*B*C)
ans =
Sympoly array has size = [1 3]
Sympoly array element [1 1]
4*x*z + 12*x*y*z
Sympoly array element [1 2]
6*x^2*z
Sympoly array element [1 3]
2*x^2 + 6*x^2*y
注意,这里提到你在对结果进行关于z的微分时犯了个错误。
Sympy非常适合这个需求:http://code.google.com/p/sympy/
文档说明在这里:http://docs.sympy.org/
关于求导的教程示例可以在这里找到:http://docs.sympy.org/tutorial.html#differentiation
import sympy
x, y, z = sympy.symbols('xyz')
p1 = 2*x*x
p2 = 3*y + 1
p3 = z
p4 = p1*p2*p3
print p4
print p4.diff(x)
print p4.diff(y)
print p4.diff(z)
输出结果:
2*z*x**2*(1 + 3*y)
4*x*z*(1 + 3*y)
6*z*x**2
2*x**2*(1 + 3*y)