2014-05-12 57 views
-2

我必須在Java中實現雙重積分的數值計算。 集中在集成()函數,這是我必須遠:在某些情況下Java中的數字雙重積分

public static double Integrate(Integravel integrando, boolean pontoMedio) { 
    double sum = 0.0; 
    double f2; 

    double deltaX = (integrando.getb() - integrando.geta()) 
      /(double) integrando.getN(); 

    double deltaY = (integrando.getd() - integrando.getc()) 
      /(double) integrando.getN(); 

    double deltaArea = deltaX * deltaY;  

    double x, xi, y, yi; 
    if (pontoMedio) { 
     xi = integrando.geta() + deltaX/2; 
     yi = integrando.getc() + deltaY/2; 
    } 
    else { 
     xi = integrando.geta() + deltaX; 
     yi = integrando.getc() + deltaY; 
    } 

    for (int j=0; j<integrando.getN(); j++) { 
     for (int i = 0; i < integrando.getN(); i++) { 
      if (j==0) { 
       x = xi; 

      } else { 
       x = xi + deltaX; 

      } 

      if (i==0) { 
       y = yi; 
      } else { 
       y = yi + deltaY; 
      } 

      f2 = integrando.funcao(x, y); 
      sum += f2*deltaArea;     
     } 
    } 
    return sum; 
} 

它的工作,但每當我從N過大(這應該使積分計算更精確,因爲它是應該是無限的),它爲積分估計返回一個錯誤的值。 我在這裏做錯了什麼?如果需要更多項目代碼,請告訴我。 任何幫助將不勝感激。謝謝!

+0

「太大」有多大? –

+0

你能舉一個你認爲會給你輸出錯誤的輸入,你期望輸出什麼,輸出是什麼樣的例子嗎? –

+0

如果n = 2,則返回正確的估計值。如果它高於100,1000或4000,則會出錯。不知道它是否與我用來計算總和或變量賦值中的某些錯誤的方法有關。 – yvesbastos

回答

1

i不是0時,y值應該是y + deltaY而不是yi + deltaYx需要類似的更改。

使用當前代碼,每個循環的第一次和第二次迭代將得到正確的xy。第三次和隨後的迭代將繼續使用xy值進行第二次迭代。

還有一個問題是你正在接近,可能沒有意識到。直到某個點,增加N將提高精度,但使用非常大的N會降低準確性。誤差是兩項之和,浮點舍入誤差+由於實際函數與由於N的有限性引起的近似值之間的差異而導致的誤差。第一項隨N增加,因爲您執行了更多計算。隨着N越來越接近無窮大,第二個減少。