2016-06-15 4 views
3

の部分集合にわたる積分得るために、使用scipy.integrate私は機能を持っている変数

f = lambda a,b,c,d: <some equation of a,b,c,d> 

私は1 = 0からFを統合し、私が得ることを、B = 0〜2等にしたいですcとdの関数。 scipy.integrateでこれをどうすればいいですか?

例 - そのようなコードを実装する方法を

>>> f = lambda a,b,c,d: a+b+c+d 
>>> def g(*args): 
     f = <some scipy code> 
     return f 
# After integration lets say we get a function g(c,d) 
# We know g(c,d) would be equal to, 2c+2d+3 for the case discussed above. 
# Now this should give, 
>>> g(1,1) 
7 

編集:2つの変数にdblquadを使用できますが、2つ以上の変数がある場合はどうすればよいでしょうか?たとえば、a = 0〜1、b = 0〜2、c = -1〜1のようにf(a、b、c、d、e)を積分して関数g )。 編集2:これは、n個の変数に対してどのように行うべきですか?

+0

編集の例は、 'tplquad'で解決できます。任意の数の変数で動作する答えを探していますか? –

+0

はい。任意の数の変数に対して。 –

答えて

1

this answerのようにすることができます。ちょうどdblquadquadの代わりに使用してください。あなたはcdの機能はdblquadargs引数を使用したい場合は、次の関数は数値を返した場合

def g(c,d): 
    return scipy.integrate.dblquad(f, 0, 1, lambda x: 0, lambda x: 2, args=(c,d)) 
+0

実際には、私はスレッドを通過しましたが、これは1つまたは2つの変数に対してのみ解決策を提供します。 –

+0

2つ以上の変数に統合するには、http://stackoverflow.com/questions/14071704/integrating-a-multidimensional-integral-in-scipy –

1

数値integeationにのみ機能します。したがって、それぞれの呼び出しでinegrateするcとdの関数を定義するか、またはcとdのグリッド上にfunctipnを集計して補間するかのどちらかを定義します。

+0

を参照してください。そして、あなたは何を意味するのか教えてもらえますか?数値連合は、関数が数値を返す場合にのみ機能します。 ?私は質問の文脈で意味します。 –

1

ここでは、クラスを通して任意の数のパラメータに対して固定ガウス - ルジャンドル直交を実装するソリューションを提案します。関数とパラメータを使用してクラスのインスタンスを作成します。通常のパラメータの文字列と、この変数に統合する場合は2つの数値のリストです。次に、__init__関数は、関数を評価する点のメッシュグリッドを計算します。あなたはあなたの直角位相の点の数を選ぶことができます。

この関数を使用するには、与えたパラメータから結果を計算するevalメソッドを呼び出します。

from numpy.polynomial.legendre import leggauss 
class Partial_Integrated_Function: 
    def __init__(self,f,*args): 
     self.f=f 
     self.nargs=0 # number of real arguments needed by the function 
     self.nintegs=0 # number of vars to integrate 
     self.n=10 # quadrature points number 
     self.lg_pts,self.lg_wgt=leggauss(self.n) 
     self.lg_wgt=self.lg_wgt/2 # for sum=1 
     self.eval_pts=[[]] # list of points to evaluate 
     self.eval_wgt=[1] # list of weights 
     for arg in args: 
      if type(arg)==str: # string argument: keep it as a mandatory argument 
       self.nargs+=1 
       for i in range(len(self.eval_pts)): # add its symbol for each point to evaluate 
        self.eval_pts[i]=self.eval_pts[i]+[arg] 
      if isinstance(arg,(list,tuple)) and len(arg)==2: # list argument: integration needed 
       self.nintegs+=1 
       i=0 
       while i<len(self.eval_pts): # for all points 
        l=self.eval_pts.pop(i) # remove the list of values 
        w=self.eval_wgt.pop(i) # remove the weight 
        a,b=arg # integration will go from a to b 
        for j in range(self.n): # for each quadrature point 
         self.eval_pts.insert(i,l+[(a+b)/2+(b-a)/2*self.lg_pts[j]]) # add the quadrature point to evaluate 
         self.eval_wgt.insert(i,w*self.lg_wgt[j]) # multiply weight by its weight 
        i+=self.n 


    def eval(self,*args): 
     sum=0 
     print("eval",args) 
     for i in range(len(self.eval_pts)): 
      pt=self.eval_pts[i].copy() # get the point 
      w=self.eval_wgt[i] 
      j=0 # current arg to use 
      for k in range(len(pt)): 
       if type(pt[k])==str: # if we find a string 
        pt[k]=args[j] # we replace it by its value 
        j+=1 
      sum+=self.f(*pt)*w 
     return sum 

f=Partial_Integrated_Function(lambda x,y,z,t:x+2*y+3*z+4*t,"x",[2,3],[0,1],"t") 
# the function is x,t |-> int_y=2^3 (int_z=0^1 x+2*y+3*z+4*t dz) dy 
# so f(x,t)=x+4*t+6.5 
print(f.eval(0,0)) 
print(f.eval(1,0)) 
print(f.eval(0,1)) 
+0

これは便利ですね。既にこの機能を提供しているライブラリがないことは確かですか?もしそうでなければ、これは働くことができます。 –

関連する問題