我编写了一些代码,使用sympy来找到函数f(x,y)= x * y ** 2的梯度,然后从该梯度绘制矢量场。见下文:
%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”功能在此代码中不起作用。它只是返回表达式而无需插入X和Y的值来计算数值,而是仅返回sympy对象而没有任何替换。
答案 0 :(得分:0)
您的代码存在的问题是,您需要以二维数组的形式访问网格。
示例: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()