sympy中公式的递归替换
Recursive substitution of formulas in sympy
我推导出了一个公式,以后想递归代入。
例如:
f = Function("f")
expr=f(x,y).diff(x) + f(x,y).diff(x).diff(x)
expr.subs(f(x,y).diff(x),f(x,y+1))
这给了我
f(x, y + 1) + Derivative(f(x, y + 1), x)
但我想要的是
f(x,y+1) + f(x,y+2)
如何以一种好的方式做到这一点?
最好的方法是使您想要的 属性 f(x, y).diff(x) == f(x, y + 1)
成为函数声明的一部分。
class f(Function):
def fdiff(self, argindex):
if argindex == 1:
return f(self.args[0], self.args[1] + 1)
else:
raise ArgumentIndexError(self, argindex)
现在直接f(x,y).diff(x) + f(x,y).diff(x).diff(x)
returnsf(x, y + 1) + f(x, y + 2)
,没有任何替换。顺便说一句,请注意 f(x,y).diff(x, 2)
是多重导数的较短表示法。
说明:方法fdiff
实现了一个函数的一阶导数,它必须处理所有变量的导数。你没有说关于第二个变量的导数应该如何工作,所以我必须通过提高 ArgumentIndexError 来默认它,这将在 SymPy 中处理得更高。
例如,f(x,y).diff(x, 3) + f(x,y).diff(x, y)
现在是
f(x, y + 3) + Subs(Derivative(f(x, _xi_2), _xi_2), (_xi_2,), (y + 1,))
因为 fdiff
没有实现偏导数,所以生成了带有未计算导数的 Subs。
我推导出了一个公式,以后想递归代入。 例如:
f = Function("f")
expr=f(x,y).diff(x) + f(x,y).diff(x).diff(x)
expr.subs(f(x,y).diff(x),f(x,y+1))
这给了我
f(x, y + 1) + Derivative(f(x, y + 1), x)
但我想要的是
f(x,y+1) + f(x,y+2)
如何以一种好的方式做到这一点?
最好的方法是使您想要的 属性 f(x, y).diff(x) == f(x, y + 1)
成为函数声明的一部分。
class f(Function):
def fdiff(self, argindex):
if argindex == 1:
return f(self.args[0], self.args[1] + 1)
else:
raise ArgumentIndexError(self, argindex)
现在直接f(x,y).diff(x) + f(x,y).diff(x).diff(x)
returnsf(x, y + 1) + f(x, y + 2)
,没有任何替换。顺便说一句,请注意 f(x,y).diff(x, 2)
是多重导数的较短表示法。
说明:方法fdiff
实现了一个函数的一阶导数,它必须处理所有变量的导数。你没有说关于第二个变量的导数应该如何工作,所以我必须通过提高 ArgumentIndexError 来默认它,这将在 SymPy 中处理得更高。
例如,f(x,y).diff(x, 3) + f(x,y).diff(x, y)
现在是
f(x, y + 3) + Subs(Derivative(f(x, _xi_2), _xi_2), (_xi_2,), (y + 1,))
因为 fdiff
没有实现偏导数,所以生成了带有未计算导数的 Subs。