有没有可能在同一个反交互性中构建符号?

2024-05-12 20:47:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在python中实现一些Grassmann变量(即反交换变量)。换言之,我想要一些行为如下

>>> from sympy import *
>>> x, y = symbols('x y')
>>> y*x
-x*y
>>> y*y
0

我需要的另一个特性是能够对变量进行规范排序。当我输入>>> y*x时,在-x*y上输出{}肯定是有效的。但是,我希望能够选择x应该出现在y的左边(也许只有在调用函数simplify(y*x)之后)。在

SymPy或其他图书馆有这种能力吗?如果没有,那最好的方法是什么来实现它(例如,我应该自己创建一个符号库,扩展SymPy等等)?在


Tags: 方法fromimport规范图书馆排序能力特性
1条回答
网友
1楼 · 发布于 2024-05-12 20:47:40

您可以创建一个继承自Symbol的新类,并将其乘法(__mul__)的行为更改为所需的行为。 为了使其有用,您无论如何都需要一个规范化的排序,它应该与SymPy的(一眼望去似乎是按名称命名的,即Symbol.name)相同,以避免出现问题。在

from sympy import Symbol, S

class AnticomSym(Symbol):
    def __new__(cls,*args,**kwargs):
        return super().__new__(cls,*args,**kwargs,commutative=False)

    def __mul__(self,other):
        if isinstance(other,AnticomSym):
            if other==self:
                return S.Zero
            elif other.name<self.name:
                return -Symbol.__mul__(other,self)

        return super().__mul__(other)

    def __pow__(self,exponent):
        if exponent>=2:
            return S.Zero
        else:
            return super().__pow__(exponent)


x = AnticomSym("x")
y = AnticomSym("y")

assert y*x == -x*y
assert y*y == 0
assert y**2 == 0
assert y**1 == y
assert ((x+y)**2).expand() == 0
assert x*y-y*x == 2*x*y

现在,这仍然不能正确地解析复杂的产物,如x*y*x*y。 为此,我们可以编写一个对任意产品排序的函数(使用气泡排序):

^{pr2}$

最后,我们可以编写一个函数,通过迭代表达式树并将sort_product应用于它遇到的每个产品,从而对表达式中的所有产品进行排序:

^{3}$

请注意,我可能还没有解释所有可能发生的事情。在

相关问题 更多 >