繁体   English   中英

使用 sympy 查找梯度和 plot 向量场

[英]use sympy to find gradient and plot vector field

我写了一些代码来使用 sympy 从梯度中找到 function f(x,y) = x*y**2 的梯度,然后到 plot 的向量场。 见下文:

%matplotlib inline
import matplotlib.pyplot as plt
import sympy as sp
import numpy as np

sp.init_printing()
x,y = sp.symbols('x y')

def gradient(f):
    return (f.diff(x), f.diff(y))

f = x*y**2
g = gradient(f)
g

X,Y = np.meshgrid(np.linspace(-3,3,15), np.linspace(-3,3,15))

U=[g[0].subs({x:x1, y:y1}) for (x1,y1) in zip(X,Y)]
V=[g[1].subs({x:x1, y:y1}) for (x1,y1) in zip(X,Y)]

plt.quiver(X,Y,U,V, linewidth=1)
plt.title("vector field")
plt.show()

我想知道的是为什么 sympy “subs” function 在此代码中不起作用。 它只是返回表达式而不插入 X 和 Y 的值来评估为数值,而不是只返回 sympy object 而没有任何替代。

矢量场

您的代码的问题是您需要访问meshgrid作为二维数组。

示例:U [i,j]不是U [i]

%matplotlib inline
import matplotlib.pyplot as plt
import sympy as sp
import numpy as np

sp.init_printing()
x,y = sp.symbols('x y')

def gradient(f):
    return (f.diff(x), f.diff(y))

f = x*y**2
g = gradient(f)
g

xrange = np.linspace(-3,3,15)
yrange = np.linspace(-3,3,15)
X,Y = np.meshgrid(xrange, yrange)

U=X
V=Y

for i in range(len(xrange)):
    for j in range(len(yrange)):
        x1 = X[i,j]
        y1 = Y[i,j]
        U[i,j] = g[0].subs({x:x1, y:y1})
        V[i,j] = g[1].subs({x:x1, y:y1})

plt.quiver(X,Y,U,V, linewidth=1)
plt.title("vector field")
plt.show()

作为 subs 的替代方案,可以使用 sympy.utilities 中的 lambdify,如下面的参考: https://docs.sympy.org/latest/modules/utilities/lambdify.html

%matplotlib inline
import matplotlib.pyplot as plt
import sympy as sp
import numpy as np
from sympy.utilities.lambdify import lambdify

sp.init_printing()
x,y = sp.symbols('x y')

def gradient(f):
    return (f.diff(x), f.diff(y))

f = x*y**2
g = gradient(f)


X,Y = np.meshgrid(np.linspace(-3,3,15), np.linspace(-3,3,15))

f1 = lambdify([x, y], g[0])
f2 = lambdify([x, y], g[1])

U=[f1(x1, y1) for x1,y1 in zip(X,Y)]
V=[f2(x1,y1) for x1,y1 in zip(X,Y)]


plt.quiver(X,Y,U,V, linewidth=1)
plt.title("vector field")
plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM