用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)