2017-03-22 19 views
1

私は、パイソンでvectofieldを持っています。これは、実験ジオメトリ上のパーティクルの速度分布を示しています。各位置の一つは、2つの配列vxvyベクトル場からサーフェスを計算する

一つでxの速度とy方向は説明のためquiverplotを行うことができていますquiverplot of vectorfield

は、今は、この速度分布をもたらす表面を計算するz(x,y )。 zは、後でスケーリング係数によって値を巡回するように再スケーリングすることができます。 中央部分については、たとえば、zの単純な線形増加でなければなりません。他の部分については、私は何か円形につながるはずです。 私はx軸とy軸に沿って累積を行うことを考えました。 しかし、これは期待された結果につながりません。

ご意見やご提案はありますか?

ここ

は、x = [5,15]及びY [0,4]からのいくつかの例示DATASある:ここ

vy=np.array([ 
    [ 0.06145939, 0.0570322 , 0.04584799, 0.01882581, 0.  , 0.  , 0.  , -0.01882581, -0.04584799, -0.0570322 ], 
    [ 0.05489626, 0.04700205, 0.03006774, 0.00924726, 0.  , 0.  , 0.  , -0.00924726, -0.03006774, -0.04700205], 
    [ 0.04715306, 0.03727663, 0.02143105, 0.00589854, 0.  , 0.  , 0.  , -0.00589854, -0.02143105, -0.03727663], 
    [ 0.04019211, 0.03012073, 0.01641931, 0.00433099, 0.  , 0.  , 0.  , -0.00433099, -0.01641931, -0.03012073]]) 


vy=np.array([ 
    [-0.02143105, -0.03006774, -0.04584799, -0.05832448, -0.0665558, -0.0665558 , -0.0665558 , -0.05832448, -0.04584799, -0.03006774], 
    [-0.03727663, -0.04700205, -0.0570322 , -0.06378726, -0.0665558 , -0.0665558, -0.0665558 , -0.06378726, -0.0570322 , -0.04700205], 
    [-0.04715306, -0.05489626, -0.06145939, -0.0653094 , -0.0665558 , -0.0665558, -0.0665558 , -0.0653094 , -0.06145939, -0.05489626], 
    [-0.05314604, -0.05899633, -0.06346224, -0.06585704, -0.0665558 , -0.0665558 , -0.0665558 , -0.06585704, -0.06346224, -0.05899633]]) 
+0

[本](HTTP ://stackoverflow.com/a/16491517/832621)は、あなたにいくつかの洞察力を与えるでしょう –

+0

あなたのサンプルでは正しくないようです。 'vx'の右端の列は負の値を持つべきではありませんか? –

+0

@PaulPanzer、指摘してくれてありがとう。私は間違ったサブセットを選んだ。例のデータが更新されます。 @SaulloCastro。 – benni

答えて

1

は、ナイーブ近似である:多分

# calculate midpoints 
vxm = 0.5 * (vx[:, 1:] + vx[:, :-1]) 
vym = 0.5 * (vy[1:, :] + vy[:-1, :]) 
# integrate 
VX, VY = np.zeros_like(vx), np.zeros_like(vy) 
VX[:, 1:] = np.cumsum(vxm, axis=-1) 
VY[1:, :] = np.cumsum(vym, axis=0) 
# compare xy and yx 
VYX = VY[:, 0:1] + VX 
VXY = VX[0:1, :] + VY 
np.nanmax(np.abs(VXY - VYX)/(np.abs(VXY) + np.abs(VYX))) 
# 0.12076532205227976  <- not great, but ... 
# take mean 
E = 0.5 * (VYX+VXY) 
E 
# array([[ 0.  , 0.0592458 , 0.11068589, 0.14302279, 0.1524357 , 
#   0.1524357 , 0.1524357 , 0.14302279, 0.11068589, 0.0592458 ], 
#  [-0.02935384, 0.02115311, 0.059688 , 0.08087732, 0.08514562, 
#   0.08514562, 0.08514562, 0.08087732, 0.059688 , 0.02115311], 
#  [-0.07156868, -0.02979605, 0.  , 0.01554169, 0.01796908, 
#   0.01796908, 0.01796908, 0.01554169, 0.  , -0.02979605], 
#  [-0.12171823, -0.08687318, -0.0628763 , -0.05054064, -0.04899143, 
#   -0.04899143, -0.04899143, -0.05054064, -0.0628763 , -0.08687318]]) 
+0

0)ご清聴ありがとうございます。 (Modはこれで私を打ち負かすでしょう) 1) '1/2'を' 0.5'または '1/2 'に置き換えてください。 2)どうして' VX [:, 1:] = npを使うのですか? 'axis = 1'ではなくcumsum(vxm、axis = -1)' 私には分からない違いがありますか? – benni

+0

@benni '軸= -1':習慣の力、それは最後の軸を指すので、2dの違いはありません。 '1/2':古いPyバージョンが残っていることを忘れる傾向があります。投稿を更新します。実際、私は、ダウン・ダウン - 右右 - 右 - 右および右 - 右 - 右 - 下 - 下ダウンだけでなく、より多くの統合経路を平均化することが理にかなっているかどうか疑問に思っています。 –

+0

重要なことは、ソリューションにとって、統合パスが結果にとって重要であるということです。また、「VX」クマサムを左右の部分で分割し、中央の「VY [:、10]」行で接続することもできます。これはもちろん、xまたはy方向の任意の行に対して自動的に行われます。すべてのベクトルが下の中心を指しているので、最小を開始し、ベクトルを上に移動する方が良いと思いました。サーフェスを計算する別の方法がある場合は面白いでしょう。 – benni

関連する問題