如何在给定的二维函数中演示numpy gradient的用法?

noj0wjuj  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(75)

我对N-D数组上的numpy梯度用法感到困惑。我写了一些代码片段来理解它在一维数组上的用法,如下所示:

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()

上面的例子展示了它是如何工作的以及它的内部关系。但是我不能像下面这样对给定的二维函数做同样的事情:

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(?,?)
tv6aics1

tv6aics11#

2D代码片段的问题在于f根本不是2D代码。如果你尝试print(f.shape),你会得到(201,)
相反,您可以尝试以下方法来获取沿沿着X和Y方向的渐变数值。

# 2-d
x = np.linspace(-10, 10, 201)
y = np.linspace(-10, 10, 201)

def func(x, y):
    return x**2 + y**2
f = func(x[:, None], y[None, :])

df_dx = 2 * x
df_dy = 2 * y
df_dx_numeric, df_dy_numeric = np.gradient(f, 0.0004, edge_order=1)

正如您可以测试的那样,f.shape现在是(201,201)

相关问题