如何用Python绘制指定函数的梯度矢量图?代码问题排查
代码问题分析与修复
问题点
np.gradient返回值顺序错误
当传入二维数组给np.gradient时,它的返回顺序是沿y轴(行方向)的梯度、沿x轴(列方向)的梯度,但你代码里把第一个返回值赋值给了Gx(x方向梯度),第二个给了Gy(y方向梯度),完全搞反了,这是导致矢量图方向错误的核心原因。数值梯度的局限性
np.gradient是数值近似方法,对于能直接推导解析解的函数,用数值梯度没必要,还可能引入误差。对于函数$f(x,y)=\frac{1}{20}x2+y2$,其梯度的解析解可以直接算出:
$$\nabla f = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right) = \left( \frac{x}{10}, 2y \right)$$
修复方案
方案1:修正np.gradient的返回值顺序
如果坚持用数值梯度,只需要调换Gx和Gy的赋值顺序:
import numpy as np import matplotlib.pyplot as plt def func(x, y): return 1/20 * x**2 + y**2 def gradient(x, y): return np.gradient(func(x, y)) x = np.linspace(-20, 20, 20) y = np.linspace(-10, 10, 20) X, Y = np.meshgrid(x, y) # 调换返回值顺序,第一个是Gy,第二个是Gx Gy, Gx = gradient(X, Y) plt.quiver(X, Y, Gx, Gy) plt.show()
方案2:使用解析梯度(推荐)
直接用推导出来的梯度公式,结果更准确且逻辑清晰:
import numpy as np import matplotlib.pyplot as plt def func(x, y): return 1/20 * x**2 + y**2 # 直接定义解析梯度 def gradient(x, y): Gx = x / 10 Gy = 2 * y return Gx, Gy x = np.linspace(-20, 20, 20) y = np.linspace(-10, 10, 20) X, Y = np.meshgrid(x, y) Gx, Gy = gradient(X, Y) plt.quiver(X, Y, Gx, Gy) # 可选:添加等高线让图更直观 plt.contour(X, Y, func(X,Y), levels=10, colors='gray') plt.show()
内容的提问来源于stack exchange,提问作者chong zhao
相关产品推荐
相关产品推荐

