同情中的 Delta 运算符

Delta operator in sympy

是否可以在 sympy 中创建这样的 delta 运算符?我不太确定如何编码。如果存在一种方法,应该真的很容易。

我不知道 SymPy 是否公开了一些可能对您有用的东西。如果没有,我们可以创建一些原始的东西。

注意:以下方法需要一些面向对象编程和 SymPy 处理事物的方式的知识。这是一个 5 分钟的尝试,并不打算在生产中使用(事实上,尚未对此代码进行任何测试)。有很多事情可能无法按预期工作。但是,对于您的情况,它可能有效:)

一种可能的方法是定义一个“梯度”class,像这样:

class Grad(Expr):
    def __mul__(self, other):
        return other.diff(*self.args)
    def _latex(self, printer):
        # create a latex representation to be visualize in Jupyter Notebook
        return r"\frac{\partial}{%s}" % " ".join([r"\partial %s" % latex(t) for t in self.args])

我们可以通过写 gx = Grad(x) 来创建相对于 x 的渐变。一旦 gx 与其他东西相乘,它 returns 那个东西相对于 x 的偏导数。

然后你会像这样定义你的 symbols/functions 和矩阵:

from sympy import *
init_printing()
var("x, y")
N1, N2, N3 = [s(x, y) for s in symbols("N1:4", cls=Function)]
A = Matrix(3, 2, [Grad(x), 0, 0, Grad(y), Grad(x), Grad(y)])
B = Matrix(2, 6, [N1, 0, N2, 0, N3, 0, 0, N1, 0, N2, 0, N3])
display(A, B)

最后,将矩阵相乘以获得符号结果:

A * B

最后,您可能想要创建一个函数:

def delta_operator(x, y, N1, N2, N3):
    A = Matrix(3, 2, [Grad(x), 0, 0, Grad(y), Grad(x), Grad(y)])
    B = Matrix(2, 6, [N1, 0, N2, 0, N3, 0, 0, N1, 0, N2, 0, N3])
    return A * B

因此,无论何时必须应用该运算符,只需执行 delta_operator(x, y, N1, N2, N3) 即可获得与上述类似的结果。