在sympy中递归替换公式

时间:2018-01-17 15:19:30

标签: python sympy symbolic-math

我已经推导出一个我希望以后递归替代的公式。 举个例子:

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)

我如何以一种很好的方式做到这一点?

1 个答案:

答案 0 :(得分: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)直接返回f(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没有实现该偏导数,因此产生具有未评估衍生产品的子公司。