我在Sympy中创建了两个未定义的函数。当我使用两个未定义函数的乘积的log
时,我应用log_expand()
,我得不到两个未定义函数的日志总和。
最小工作示例(MWE):
class A(Function):
nargs = 1
def fdiff(self, argindex=1):
if argindex == 1:
return -1*self.args[0]*A(self.args[0])
else:
raise ArgumentIndexError(self, argindex)
class B(Function):
nargs = 1
def fdiff(self, argindex=1):
if argindex == 1:
return self.args[0]*B(self.args[0])
else:
raise ArgumentIndexError(self, argindex)
x = Symbol('x', real=True)
expr = A(x)*B(x)
pprint(expr) # Outputs: A(x)⋅B(x)
pprint(log(expr)) # Outputs: log(A(x)⋅B(x))
pprint(expand_log(log(expr))) # Outputs: log(A(x)⋅B(x))
最后一行的预期输出为log(A(x)) + log(B(x))
,但我得到log(A(x)⋅B(x))
。
我是否需要在每个类中定义属性或方法?
请注意,MWE中的未定义函数仅用于演示目的。实际函数更复杂,并且使用eval
类方法(@classmethod
)。
答案 0 :(得分:1)
如果为每个功能设置属性is_positive=True
,它们将展开。使用SymPy函数,我这样做:
>>> f,g=symbols('f g', cls=Function, positive=True)
>>> expand_log(log(f(x)*g(x)))
log(f(x)) + log(g(x))