【问题标题】:How do I get SymPy to collect partial derivatives?如何让 SymPy 收集偏导数?
【发布时间】:2020-03-01 04:24:27
【问题描述】:

我一直在使用 SymPy 来扩展复杂偏微分方程的项,并想使用 collect 函数来收集项。但是,在处理微分变量不同的二阶(或更高阶)导数时似乎存在问题。

在下面的代码示例中 collect(expr6... 有效,但 collect(expr7 ... 无效,返回错误消息 "NotImplementedError: Improve MV Derivative support in collect"。该错误显然与两种情况下的psi.diff(x,y) 差异有关。我需要做什么才能让collect(expr7 ... 工作对任何人来说都很明显吗?

干杯

理查德

例子:

from sympy import *

psi = Function("psi") (x,y,z,t)

expr6=2*psi.diff(x,x)+3*U*psi.diff(x)+5*psi.diff(y)
expr7=2*psi.diff(x,y)+3*U*psi.diff(x)+5*psi.diff(y)

collect(expr6, psi.diff(x),evaluate=False, exact=False)  # works
#collect(expr7, psi.diff(x),evaluate=False, exact=False)
   # throws an error: NotImplementedError: Improve MV Derivative support in collect

【问题讨论】:

    标签: python sympy partial derivative collect


    【解决方案1】:

    我遇到了这个问题,我的解决方法是首先使用简单的虚拟变量执行替换,collect 基于这些简单变量,然后替换回更高级的变量。可能有一些极端情况,但它似乎对我有用。

    from sympy import symarray, collect
    def mycollect(expr, var_list, evaluate=True, **kwargs):
        """ Acts as collect but substitute the symbols with dummy symbols first so that it can work with partial derivatives. 
            Matrix expressions are also supported. 
        """
        if not hasattr(var_list, '__len__'):
            var_list=[var_list]
        # Mapping Var -> Dummy, and Dummy-> Var
        Dummies=symarray('DUM', len(var_list))
        Var2Dummy=[(var, Dummies[i]) for i,var in enumerate(var_list)]
        Dummy2Var=[(b,a) for a,b in Var2Dummy]
        # Replace var with dummies and apply collect
        expr = expr.expand().doit()
        expr = expr.subs(Var2Dummy)
        if hasattr(expr, '__len__'):
            expr = expr.applyfunc(lambda ij: collect(ij, Dummies, **kwargs))
        else:
            expr = collect(expr, Dummies, evaluate=evaluate, **kwargs)
        # Substitute back
        if evaluate:
            return expr.subs(Dummy2Var)
        d={}
        for k,v in expr.items():
            k=k.subs(Dummy2Var)
            v=v.subs(Dummy2Var)
            d[k]=v
        return d
    

    你的例子:

    mycollect(expr6, psi.diff(x), evaluate=False)
    mycollect(expr7, psi.diff(x), evaluate=False)
    

    返回:

    {Derivative(psi(x, y, z, t), (x, 2)): 2, Derivative(psi(x, y, z, t), x): 3*U, 1: 5*Derivative(psi(x, y, z, t), y)}
    {Derivative(psi(x, y, z, t), x, y): 2, Derivative(psi(x, y, z, t), x): 3*U, 1: 5*Derivative(psi(x, y, z, t), y)}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多