sympy张量导数、梯度、散度

2024-01-03 09:48:52

偏导数

sympy中实现了derive_by_array函数,这个函数可以作用在普通的标量函数表达式上,示例如下

from sympy import print_latex
from sympy import derive_by_array
from sympy.abc import x, y, z, t
from sympy import sin, exp
expr = derive_by_array(sin(x*y), x)
print_latex(expr)

计算结果可以表示为

? sin ? ( x y ) ? x = y cos ? ( x y ) \frac{\partial\sin (xy)}{\partial x} = y \cos{\left(x y \right)} ?x?sin(xy)?=ycos(xy)

梯度

如果被求导的是一个向量,那么结果如下

expr = derive_by_array(sin(x*y), [x, y, z])
print_latex(expr)

[ y cos ? ( x y ) x cos ? ( x y ) 0 ] \left[\begin{matrix}y \cos{\left(x y \right)} & x \cos{\left(x y \right)} & 0\end{matrix}\right] [ycos(xy)?xcos(xy)?0?]

如果把 sin ? ( x y ) \sin(xy) sin(xy)想象成一个标量场场,那么上面的导数计算的实则是其梯度,一般表示为 ? f = [ ? f ? x , ? f ? z , ? f ? z ] \nabla f=[\frac{\partial f}{\partial x}, \frac{\partial f}{\partial z}, \frac{\partial f}{\partial z}] ?f=[?x?f?,?z?f?,?z?f?]

张量求导

下面定义一阶张量 A m = [ e x , sin ? ( y z ) , t ] A^m=[e^x, \sin(yz), t] Am=[ex,sin(yz),t],以及 x n = [ x , y , z ] x^n=[x,y,z] xn=[x,y,z],则 B n m = ? A m ? x n B^{nm}=\frac{\partial A^m}{\partial x^n} Bnm=?xn?Am?,可以计算如下

xn = [x, y, z]
Am = [exp(x), sin(y*z), 0]
Bnm = derive_by_array(Am, xn)
print_latex(Bnm)

结果如下

[ e x 0 0 0 z cos ? ( y z ) 0 0 y cos ? ( y z ) 0 ] \left[\begin{matrix}e^{x} & 0 & 0\\0 & z \cos{\left(y z \right)} & 0\\0 & y \cos{\left(y z \right)} & 0\end{matrix}\right] ?ex00?0zcos(yz)ycos(yz)?000? ?

如果对运算结果进行缩并,那么就可以得到 A m A^m Am场的散度

from sympy import tensorcontraction
div = tensorcontraction(Bnm, (0,1))
print_latex(div)

z cos ? ( y z ) + e x z \cos{\left(y z \right)} + e^{x} zcos(yz)+ex

? ( e x , sin ? ( y z ) , t ) = ? e x ? x + ? sin ? ( y z ) ? y + 0 ? z = z cos ? ( y z ) + e x \nabla (e^x, \sin(yz), t)=\frac{\partial e^x}{\partial x}+\frac{\partial \sin(yz)}{\partial y}+\frac{0}{\partial z}=z \cos{\left(y z \right)} + e^{x} ?(ex,sin(yz),t)=?x?ex?+?y?sin(yz)?+?z0?=zcos(yz)+ex

文章来源:https://blog.csdn.net/m0_37816922/article/details/135153718
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。