0

3D空間に次の点のセットがあり、Dはどこでも勾配を計算したい、つまりベクトル場を返します。

points = []
for i in np.linspace(-20,20,100):   
    for j in np.linspace(-20,20,100):
        points.append([i,j,i**2+j**2])
points = np.array(points)

楕円放物面です。

を使用してnp.gradient(points)http://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html

正しい値も、期待する寸法も得られません。誰かが私にヒントを与えることができますか?

4

1 に答える 1

2

「ポイント」のインデックスと値を混ぜ合わせているため、グラデーションによって間違った結果が得られます。numpy を使用してポイントを構築し、勾配を計算するより良い方法を次に示します。

x, y = np.mgrid[-20:20:100j, -20:20:100j]
z = x**2 + y**2
grad = np.gradient(z)

結果のグラデーションは、2 つの配列を持つタプルです。1 つは最初の方向のグラデーション用で、もう 1 つは 2 番目の方向のグラデーション用です。この勾配はポイント間の分離 (つまり、デルタ x とデルタ y) を考慮していないことに注意してください。そのため、導関数を取得するには、それで割る必要があります。

deriv = grad/(40./100.)

以前のように「ポイント」を再構築したい場合は、次のことを行う必要があります。

points = np.array([x.ravel(), y.ravel(), z.ravel()]).T

指定された軸に沿って離散的な差を与えるnumpy のdiff関数にも興味があるかもしれません。

于 2012-08-22T22:40:57.047 に答える