2012-04-12 4 views
3

私は二重積分のための台形則を実装しようとしてきました。私は多くのアプローチを試しましたが、正しく動作させることができません。2D積分の解法は?

static double f(double x) { 
    return Math.exp(- x * x/2); 
} 

// trapezoid rule 
static double trapezoid(double a, double b, int N) { 
    double h = (b - a)/N; 
    double sum = 0.5 * h * (f(a) + f(b)); 
    for (int k = 1; k < N; k++) 
     sum = sum + h * f(a + h*k); 
    return sum; 
} 

私は不可欠な単一の変数のための方法を理解し、私は、2D一体型のためにそれを行う方法がわからない、と言う:X +(Yの* yを)。 誰かが簡単に説明できますか?

+0

あなたはボリュームf(x、y)は、上の積分を解決するために、このおおよその技術を適用する方法を求めている= X + Y^2(または他のF (x、y))? – null0pointer

+0

私はちょっと単純なf(x、y)関数の例を作りました。 – stiv

答えて

3

あなたは台形ルールを使用して上の意図している場合はそのように、あなたはそれを行うだろう:

// The example function you provided. 
public double f(double x, double y) { 
    return x + y * y; 
} 

/** 
* Finds the volume under the surface described by the function f(x, y) for a <= x <= b, c <= y <= d. 
* Using xSegs number of segments across the x axis and ySegs number of segments across the y axis. 
* @param a The lower bound of x. 
* @param b The upper bound of x. 
* @param c The lower bound of y. 
* @param d The upper bound of y. 
* @param xSegs The number of segments in the x axis. 
* @param ySegs The number of segments in the y axis. 
* @return The volume under f(x, y). 
*/ 
public double trapezoidRule(double a, double b, double c, double d, int xSegs, int ySegs) { 
    double xSegSize = (b - a)/xSegs; // length of an x segment. 
    double ySegSize = (d - c)/ySegs; // length of a y segment. 
    double volume = 0; // volume under the surface. 

    for (int i = 0; i < xSegs; i++) { 
     for (int j = 0; j < ySegs; j++) { 
      double height = f(a + (xSegSize * i), c + (ySegSize * j)); 
      height += f(a + (xSegSize * (i + 1)), c + (ySegSize * j)); 
      height += f(a + (xSegSize * (i + 1)), c + (ySegSize * (j + 1))); 
      height += f(a + (xSegSize * i), c + (ySegSize * (j + 1))); 
      height /= 4; 

      // height is the average value of the corners of the current segment. 
      // We can use the average value since a box of this height has the same volume as the original segment shape. 

      // Add the volume of the box to the volume. 
      volume += xSegSize * ySegSize * height; 
     } 
    } 

    return volume; 
} 

は、この情報がお役に立てば幸いです。私のコードに関するご質問はお気軽に(警告:コードはテストされていません)。

+0

thx null0pointer、私はあなたのコードを実装し、いくつかの問題がある場合はあなたに戻ってきます – stiv

+0

あなたのコードは完璧に動作します、そして、乱雑な内部合計を避けることによって非常に賢明なアプローチを言わなければなりません – stiv

+0

うれしいことを聞いてください: ) – null0pointer

0

多くの方法で対応します。

すでに1dのためにそれを知っているなら、あなたはこのようにそれを作ることができる:

  1. がf(x、y)を超える1D積分を計算する関数g(X)を書き込む固定x
  2. のためにその後、G(x)の
  3. 成功:)

好きなようにあなたは基本的に多くの次元を持つことができますこの方法上1D積分を統合します。それは貧弱なスケールです。大きな問題の場合は、monte carlo integrationを使用する必要があります。

+0

方法は良いです。あなたがコードを投稿した場合、誰かが問題を抱えているかどうかを見ることができます。 – bdecaf

+0

私の試みはあなたの提案と同じですが、Mathematicaをチェックインすると、 – stiv

+0

'static double f(double x、double y) { return x *(y + y); (double a、double b、int N) { double h =(b-a)/ N;double sum = 0.5 * h *(f(a、a)+ f(b、b));double sum1 = 0.5 * h *(f(a、a)+ f(b、b)); (int k = 1; k stiv

0

DataMelt Java programのクラスjhplot.F2Dを使用することを検討してください。あなたは統合し、可視化するような何かをやって2Dの機能をすることができます

f1=F2D("x*y",-1,1,-1,1) # define in a range 
print f1.integral()