在Python中计算矢量场的卷曲并使用matplotlib

时间:2015-05-21 15:52:43

标签: python matplotlib sympy

我需要计算矢量场的卷曲并用matplotlib绘制它。我正在寻找的一个简单例子可以这样说:

如何计算和绘制matplotlib库中quiver3d_demo.py中矢量场的卷曲?

3 个答案:

答案 0 :(得分:9)

您可以使用sympy.curl()来计算矢量场的卷曲。

示例

假设你有:
F =(y 2 z,-xy,z 2 )= y 2 z x < / strong> - xy y + z 2 z ,然后yR[1],{{1} } xR[0]z,而3轴的向量是R[2]R.xR.y,代码计算矢量场curl 是:

R.z

在这种情况下,G将等于from sympy.physics.vector import ReferenceFrame from sympy.physics.vector import curl R = ReferenceFrame('R') F = R[1]**2 * R[2] * R.x - R[0]*R[1] * R.y + R[2]**2 * R.z G = curl(F, R) 或换句话说,为 G =(0,y 2 , - 2yz-y)。

要绘制,您需要将上述结果转换为3个单独的函数; U,V,W

(以下示例改编自matplotlib example on this link):

R_y**2*R.y + (-2*R_y*R_z - R_y)*R.z

最终结果如下:

enter image description here

答案 1 :(得分:3)

这是基于Octave / Matlab implementation的Python代码,

import numpy as np

def curl(x,y,z,u,v,w):
    dx = x[0,:,0]
    dy = y[:,0,0]
    dz = z[0,0,:]

    dummy, dFx_dy, dFx_dz = np.gradient (u, dx, dy, dz, axis=[1,0,2])
    dFy_dx, dummy, dFy_dz = np.gradient (v, dx, dy, dz, axis=[1,0,2])
    dFz_dx, dFz_dy, dummy = np.gradient (w, dx, dy, dz, axis=[1,0,2])

    rot_x = dFz_dy - dFy_dz
    rot_y = dFx_dz - dFz_dx
    rot_z = dFy_dx - dFx_dy

    l = np.sqrt(np.power(u,2.0) + np.power(v,2.0) + np.power(w,2.0));

    m1 = np.multiply(rot_x,u)
    m2 = np.multiply(rot_y,v)
    m3 = np.multiply(rot_z,w)

    tmp1 = (m1 + m2 + m3)
    tmp2 = np.multiply(l,2.0)

    av = np.divide(tmp1, tmp2)

    return rot_x, rot_y, rot_z, av

答案 2 :(得分:2)

要计算向量函数的卷曲,您还可以使用numdifftools进行自动数值微分,而无需通过符号区分来绕行。 Numdifftools不提供curl()函数,但它确实计算了一个或多个变量的向量值函数的雅可比矩阵,并且它提供了关于所有变量的向量字段的所有分量的导数;这就是计算卷曲所必需的。

import import scipy as sp
import numdifftools as nd

def h(x):
    return sp.array([3*x[0]**2,4*x[1]*x[2]**3, 2*x[0]])

def curl(f,x):
    jac = nd.Jacobian(f)(x)
    return sp.array([jac[2,1]-jac[1,2],jac[0,2]-jac[2,0],jac[1,0]-jac[0,1]])

x = sp.array([1,2,3)]
curl(h,x)

这会返回x处的卷曲值:array([-216., -2., 0.]) 绘图如上所述。