10

どのように機能するか知りたいnumpy.gradientです。勾配を使用して群速度を計算しようとしました(波束の群速度は、速度のグループではなく、波数に対する周波数の導関数です)。最初の 2 列は x 座標と y 座標で、3 列目はそのポイント (x,y) の頻度です。勾配を計算する必要があり、勾配定義である 2d ベクトルを期待していました

df/dx*i+df/dy*j+df/dz*k 

そして、私の関数はxとyiの関数のみが次のようなものを期待していました

df/dx*i+df/dy*j 

しかし、それぞれ 3 つの列を持つ 2 つの配列、つまり 2 つの 3D ベクトルを取得しました。最初は、2 つの合計が検索対象のベクトルになると思っていましたが、z 成分は消えません。私の説明が十分に明確であったことを願っています。どのようにnumpy.gradient機能するか、それが私の問題にとって正しい選択であるかどうかを知りたいです。それ以外の場合は、使用できる他の Python 関数があるかどうかを知りたいです。

つまり、値の配列の勾配を計算したいのです:

data=[[x1,x2,x3]...[x1,x2,x3]]

ここで、x1、x2 は均一グリッド上のポイント座標 (ブリルアン ゾーン上の私のポイント) であり、x3 はそのポイントの周波数の値です。2 つの方向の導出手順も入力します。

stepx=abs(max(unique(data[:,0])-min(unique(data[:,0]))/(len(unique(data[:,0]))-1)

y 方向も同様です。私はグリッド上にデータを構築しませんでした。私はすでにグリッドを持っています。これが、回答でここに示されているような例が役に立たない理由です。より適切な例には、私が持っているような点と値のグリッドが必要です:

data=[]
for i in range(10):
  for j in range(10):
    data.append([i,j,i**2+j**2])

data=array(data,dtype=float)

gx,gy=gradient(data)

私が追加できるもう1つのことは、私のグリッドは正方形ではなく、2Dクリスタルのブリルアンゾーンである多角形の形をしていることです.

私がnumpy.gradient探しているものではなく、値の正方形のグリッドでのみ適切に機能することを理解しました。元のデータのポリゴンの外側にゼロがたくさんあるグリッドとしてデータを作成しても、勾配に非常に高いベクトルが追加され、計算の精度に (マイナスに) 影響します。このモジュールは、私にはツールというよりおもちゃのように思えますが、厳しい制限があります。

辞書を使用して問題を解決しました。

4

1 に答える 1

30

gradientポイントの角周波数値を説明する行列を与える必要があります(x,y)。例えば

def f(x,y):
    return np.sin((x + y))
x = y = np.arange(-5, 5, 0.05)
X, Y = np.meshgrid(x, y)
zs = np.array([f(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)

gx,gy = np.gradient(Z,0.05,0.05)

Z を曲面としてプロットすると、次のようになることがわかります。

シンスパイ

グラデーションを解釈する方法は次のとおりです。

gxdz/dxすべての点で変化を与える行列です。たとえば、gx[0][0] はdz/dxat(x0,y0です)。視覚化gxは理解に役立ちます:

gx

私のデータはf(x,y) = sin(x+y)gyから生成されたので、同じように見えます。

を使用したより明白な例を次に示しf(x,y) = sin(x)ます...

f(x,y) ここに画像の説明を入力

そしてグラデーション

g2

g1

update xy ペアを見てみましょう。

これは私が使用したコードです:

def f(x,y):
    return np.sin(x)
x = y = np.arange(-3,3,.05)
X, Y = np.meshgrid(x, y)
zs = np.array([f(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
xy_pairs = np.array([str(x)+','+str(y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)
xy_pairs = xy_pairs.reshape(X.shape)

gy,gx = np.gradient(Z,.05,.05)

今、私たちは何が起こっているのかを正確に見ることができます。の値に関連付けられているポイントを知りたいとしZ[20][30]ましょう。それで...

>>> Z[20][30]
-0.99749498660405478

そしてポイントは

>>> xy_pairs[20][30]
'-1.5,-2.0'

そうですか?確認しよう。

>>> np.sin(-1.5)
-0.99749498660405445

はい。

そして、その時点での勾配成分は何ですか?

>>> gy[20][30]
0.0
>>> gx[20][30]
0.070707731517679617

それらはチェックアウトしますか?

dz/dy always 0小切手。 dz/dx = cos(x)と...

>>> np.cos(-1.5)
0.070737201667702906

いいね。

それらが正確ではないことに気付くでしょう。それは、私の Z データが連続的でなく、ステップ サイズが0.05ありgradient、変化率を概算することしかできないためです。

于 2013-07-27T21:04:27.167 に答える