用于操纵多元多项式的库

时间:2010-06-22 21:58:57

标签: python math matlab numpy scipy

我需要编写一些处理生成和操作多元多项式的代码。我将用简化的例子概述我的任务。

假设我有三个表达式:2x ^ 2,3y + 1和1z。然后我需要将这些相乘,这将给我6x ^ 2yz + 2x ^ 2z。然后我想找到关于x,y和z的这个表达式的偏导数。这将给我12xyz + 4xz,6x ^ 2z和6x ^ 2y + 2x ^ 2.

我的问题涉及对包含数千个变量的表达式进行这样的简单操作,我需要一种简单的方法来系统地执行此操作。我真的很想使用python,因为我已经使用numpy / scipy / matplotlib完成了许多与项目相关的功能,但如果有另一种语言的强大工具箱,我也可以使用它。我正在做大学研究,所以我也愿意使用Matlab。

我无法找到任何可以轻松完成此任务的优秀python库,并且理想情况下需要类似于可以在多维多项式上工作的scipy polynomial routines。有没有人知道一个好的库似乎适合这个问题,并且很容易集成到现有的python代码中?

谢谢!

跟进:我花了几天时间与sympy一起工作,结果很容易使用。但是,对于我正在处理的问题的大小来说,这很慢,所以我现在将探索matlab。为了使用小样本量对速度进行极其粗略的估计,计算包含250个变量的2阶多项式的每个偏导数花费大约5秒钟。

跟进#2:当我还在处理这个问题时,我可能应该这样做了,但我不妨让大家都知道matlab符号库的速度非常可比sympy。换句话说,它对于大型计算来说是非常慢的。这两个库都非常容易使用,因此对于小型计算,我强烈推荐。

为了解决我的问题,我手工计算了渐变,简化了它们,然后使用我发现的模式来硬编码我的代码中的一些值。这是更多的工作,但使我的代码指数级更快,最终可用。

3 个答案:

答案 0 :(得分:9)

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)

答案 1 :(得分:2)

如果你正在使用MATLAB,那么象征性的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

请注意,这指出您在问题中区分结果时出错了。

答案 2 :(得分:1)

您提到的Matlab和其他工具通常会进行数值计算。您应该考虑使用Mathematica或替代Computer Algebra System(CAS)进行符号计算。有关各种CAS的比较,请参阅wiki链接:http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems