同情中的 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)
即可获得与上述类似的结果。
是否可以在 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)
即可获得与上述类似的结果。