python - sympy中公式的递归替换

标签 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)

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

最佳答案

最好的方法是制作你想要的属性,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,))

其中生成具有未评估导数的 Subs,因为 fdiff没有实现偏导数。

关于python - sympy中公式的递归替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304405/

相关文章:

python - 为什么我不能按空格分割?

python - 从桌面文本文件创建一列并在 python tkinter 中将其识别为正面、负面或中性句子

c++ - Cython std::pair of two pointers,期望一个标识符或文字

python - 负实数的立方根

python - Sympy:从表达式获取函数

R:使 Ryacas 包在 Windows 上运行时遇到问题

lisp - 如何提取最大值中的子表达式?

python - 将所有 python 依赖项捆绑到一个类似 fatjar 的 zip 文件中

python - 如何使用 theano 或 autowrap 评估和编译这样的函数?

python-3.x - 如何使用 plt.text() 函数在 python3 生成的图中输入特殊符号?