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