You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python绘制指定函数的梯度矢量图?代码问题排查

代码问题分析与修复

问题点

  1. np.gradient返回值顺序错误
    当传入二维数组给np.gradient时,它的返回顺序是沿y轴(行方向)的梯度、沿x轴(列方向)的梯度,但你代码里把第一个返回值赋值给了Gx(x方向梯度),第二个给了Gy(y方向梯度),完全搞反了,这是导致矢量图方向错误的核心原因。

  2. 数值梯度的局限性
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:43:23