我试图用python(3.7.4)实现automatic differentiation,使用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的实例进行指数化。当没有类似于其他操作符的反向变体时,如何定义将float提升到DualNumber实例的输出?这样我就可以像
a = DualNumber(1,2)
5 ** a
注:我所说的“浮点数”是指任何实数的表示
有一个
__rpow__
。它的文档可以在Python data model page上找到相关问题 更多 >
编程相关推荐