用Python(Symphy)定义抽象交换函数

用Python(Symphy)定义抽象交换函数,python,sympy,Python,Sympy,假设我定义了一个函数H from sympy import Function H = Function('H') 我怎样才能使H在其参数中可交换,从而 >>> H(x,y)+H(y,x) 2*H(x,y) 其中x和y是符号 我当前的解决方法是定义一个附加函数H1,它通过首先对参数排序返回H(x,y)。然后Python完成剩下的工作: >>> H1(x,y)+H1(y,x) 2*H(x,y) 您可以定义Symphy的函数类的扩展以添加此属性,类似于示例:

假设我定义了一个函数
H

from sympy import Function
H = Function('H')
我怎样才能使
H
在其参数中可交换,从而

>>> H(x,y)+H(y,x)
2*H(x,y)
其中
x
y
是符号

我当前的解决方法是定义一个附加函数
H1
,它通过首先对参数排序返回
H(x,y)
。然后Python完成剩下的工作:

>>> H1(x,y)+H1(y,x)
2*H(x,y)

您可以定义Symphy的
函数
类的扩展以添加此属性,类似于示例:

如果
order(arg1,arg2)
True
,则交换参数,否则保持原样。这样,如果使用相同但交换的参数调用
H
,则输出应始终相同

现在,我们只需要一个好的
order
函数。最简单的方法是将各个符号转换为字符串并进行比较:

order = lambda arg1,arg2: str(arg1)>str(arg2)
但是,如果参数在符号表示中是等效的,但不完全相同,则这可能无法按预期工作。下面是一个更复杂的
订单
版本,通过使用SymPy的
equals
(这比
=
更彻底,因为它使用了简化):

请注意,
order
将经常执行,因此可能需要保持快速和简单

函数
H
现在具有所需的属性:

from sympy.abc import a,b
print( H(a,b) + H(b,a) )
# 2*H(a, b)

您可以定义Symphy的
函数
类的扩展以添加此属性,类似于示例:

如果
order(arg1,arg2)
True
,则交换参数,否则保持原样。这样,如果使用相同但交换的参数调用
H
,则输出应始终相同

现在,我们只需要一个好的
order
函数。最简单的方法是将各个符号转换为字符串并进行比较:

order = lambda arg1,arg2: str(arg1)>str(arg2)
但是,如果参数在符号表示中是等效的,但不完全相同,则这可能无法按预期工作。下面是一个更复杂的
订单
版本,通过使用SymPy的
equals
(这比
=
更彻底,因为它使用了简化):

请注意,
order
将经常执行,因此可能需要保持快速和简单

函数
H
现在具有所需的属性:

from sympy.abc import a,b
print( H(a,b) + H(b,a) )
# 2*H(a, b)