2012-01-09 5 views
5

私はシミュレーションから生成したデータポイントの大きなメッシュグリッドを持ち、xy平面の各ポイントにはz値(シミュレーションの結果)が関連付けられています。データポイントで定義された "平面"の下のボリューム - python

私はプレーンテキストファイルにダンプされたx、y、z値を持っています。私がしたいのは、xy平面(すなわちz = 0)と "平面"データポイント。データポイントは現在一様な間隔で配置されていませんが、一度シミュレーションの実行が完了するとSHOULDする必要があります。

私はscipyのドキュメントを見てきました。私はscipy.integrateが必要な機能を提供しているかどうかは不明です。必要なときに3dだけでなく、これを行う能力があるようです。

まず、必要がない限り、私は補間なしで行うことができます。純粋に "台形則"または類似の近似を元にした積分は、始めるには良い基礎です。

何か助けていただければ幸いです。

ありがとう

EDIT:以下に説明する解決策は両方ともうまくいきます。私の場合、スプラインを使用すると、飛行機のシャープな最大値の周りに「波紋」を引き起こす可能性があるので、Delaunayメソッドはうまく機能しますが、両方をチェックするようアドバイスします。

答えて

3

あなたは厳密には、あなたがこれに似たような行うことができ台形ルールに固執する場合:スプラインまたはリニア(trapezodial)補間は、より良いフィット感があなたの問題に大きく依存しているかどうか

import numpy as np 
import scipy.spatial 

def main(): 
    xyz = np.random.random((100, 3)) 
    area_underneath = trapezoidal_area(xyz) 
    print area_underneath 

def trapezoidal_area(xyz): 
    """Calculate volume under a surface defined by irregularly spaced points 
    using delaunay triangulation. "x,y,z" is a <numpoints x 3> shaped ndarray.""" 
    d = scipy.spatial.Delaunay(xyz[:,:2]) 
    tri = xyz[d.vertices] 

    a = tri[:,0,:2] - tri[:,1,:2] 
    b = tri[:,0,:2] - tri[:,2,:2] 
    proj_area = np.cross(a, b).sum(axis=-1) 
    zavg = tri[:,:,2].sum(axis=1) 
    vol = zavg * np.abs(proj_area)/6.0 
    return vol.sum() 

main() 

を。

+0

ありがとう、私はまた、この代替を見ていきます。 – samb8s

関連する問題