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

如何使用NumPy计算给定二维函数的梯度?附一维示例

NumPy二维数组梯度计算问题

我对NumPy在N维数组上的梯度用法感到十分困惑。为理解其一维数组的用法,我编写了如下代码片段:

import numpy as np
import matplotlib.pyplot as plt

# 1-d
t = np.linspace(0, 0.04, 101)
w = 2*np.pi*50
y = np.sin(w*t)

dy = w * np.cos(w*t)
dy_numeric = np.gradient(y, 0.0004, edge_order=1)

plt.plot(t, y, label='f')
plt.plot(t, dy, label='df')
plt.plot(t, dy_numeric, label='df_num')
plt.legend()
plt.show()

上述示例展示了NumPy梯度的工作原理及内在关联,但我无法对如下给定的二维函数完成同样的操作:

x = np.linspace(-10, 10, 201)
y = np.linspace(-10, 10, 201)
f = x ** 2  + y ** 2
df_dx = 2 * x
df_dy = 2 * y

# the exact gradient expression of this 2-d function is [2*x, 2*y]
# but how can I use np.gradient to compute its numeric values?
# df_vals = np.gradient(?,?) 

该二维函数的精确梯度表达式为[2*x, 2*y],请问如何使用np.gradient计算其数值?


解决方案

你的问题核心是未生成二维网格数据:当前x和y是一维数组,计算出的f也是一维数组,无法体现二维函数的空间分布。需要先通过np.meshgrid生成二维坐标网格,再计算对应二维函数值,最后用np.gradient计算梯度:

import numpy as np

x = np.linspace(-10, 10, 201)
y = np.linspace(-10, 10, 201)
# 生成二维坐标网格,将一维x、y扩展为二维矩阵
X, Y = np.meshgrid(x, y)
# 计算每个(x,y)点对应的函数值
f = X ** 2 + Y ** 2

# 计算梯度:返回两个数组,分别对应x轴和y轴方向的偏导
dx = x[1] - x[0]  # x轴步长
dy = y[1] - y[0]  # y轴步长
df_dx_num, df_dy_num = np.gradient(f, dx, dy, edge_order=1)

# 验证数值解与精确解的一致性
print(np.allclose(df_dx_num[100, :], 2*x))  # 输出True,x方向梯度匹配
print(np.allclose(df_dy_num[:, 100], 2*y))  # 输出True,y方向梯度匹配

关键点说明:

  • np.meshgrid(x, y):将一维的x和y转换成二维网格数组X和Y,X的每一行都是x,Y的每一列都是y,确保f能表示所有(x,y)点的函数值。
  • np.gradient(f, dx, dy, edge_order=1):第一个参数是二维函数数组,后续的dx、dy指定各轴的步长,edge_order=1指定边缘点用一阶精度计算,和你一维示例的参数逻辑保持一致。
  • 返回值:df_dx_num是所有点对x的偏导数组,df_dy_num是所有点对y的偏导数组,二者维度均与f一致。

内容的提问来源于stack exchange,提问作者Coneain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:35:00