我试图执行自动微分使用的增强代数在python(3.7.4)的双数,实数的扩展与真正的和双部分(类似于复数)。我现在需要将浮点运算符(如 + - * / ^)扩展到它们。加法、减法、乘法和除法很容易实现(我的方法与这里相同),但是,我在使用幂运算时遇到了问题。
我有像这样实现的 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__ 时,如何定义将 float 提升到 DualNumber 实例的输出?这样我就可以执行类似的操作
a = DualNumber(1,2)
5 ** a
注意:“浮动”是指实数的任何表示。
有一个__rpow__
. 它的文档可以在Python 数据模型页面上找到
class X:
def __rpow__(self, other):
return "rpow"
x = X()
print(1**x) # rpow
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句