我尝试使用automatic differentiation的扩充代数在python(3.7.4)中实现dual numbers,这是对实数进行实数和对偶(类似于复数)的扩展。我现在需要将浮点运算符(例如+-* / ^)扩展到它们。加法,减法,乘法和除法易于实现(我以与here相同的方式进行操作),但是,在求幂时遇到了问题。
我有这样实现的DualNumber类:
class DualNumber:
def __init__(self, real, dual):
self.real = real
self.dual = dual
# definitions of __add__, __sub__, __mul__ etc. ...
def __pow__(self, other):
if isinstance(other, DualNumber):
return DualNumber(self.real ** other.real,
self.dual * other.real * self.real ** (other.real - 1) + self.real ** other.real * other.dual * log(self.real))
else:
return DualNumber(self.real**other,
self.dual * other * self.real**(other - 1))
def auto_diff(f, x):
return f(DualNumber(x, 1.)).dual
这仅允许对DualNumber的实例求幂。当没有类似于其他运算符的反向变体的__rpow__时,如何定义浮点数到DualNumber实例的输出?这样我就可以执行
之类的操作a = DualNumber(1,2)
5 ** a
注意:“浮点数”是指实数的任何表示形式。
答案 0 :(得分:1)
有一个__rpow__
。可以在Python data model page
class X:
def __rpow__(self, other):
return "rpow"
x = X()
print(1**x) # rpow