如何使用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
相关产品推荐
相关产品推荐

