2014-05-12 2 views
-2

Java에서 double integals의 수치 계산을 구현해야합니다. 이 때문에, 어떤 경우에Java에서 Numerical Double Integration

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 값은 이 아니라 yi + deltaY이어야합니다. x에도 비슷한 변경이 필요합니다.

현재 코드를 사용하면 각 루프의 첫 번째 반복과 두 번째 반복에서 올바른 xy을 얻을 수 있습니다. 세 번째 및 후속 반복은 두 번째 반복에 대해 x 또는 y 값을 사용하여 계속됩니다.

다가오는 다른 문제가 있으며 인식하지 못할 수도 있습니다. 특정 지점까지 N을 높이면 정확도는 향상되지만 N을 매우 크게 사용하면 정확도가 떨어집니다. 오차는 N의 유한성으로 인해 실제 함수와 근사값의 차이로 인한 부동 소수점 반올림 오차 + 오차의 두 항의 합입니다. 더 많은 계산을하기 때문에 첫 번째 항이 N과 함께 증가합니다. 두 번째는 N이 무한대에 가까워짐에 따라 감소합니다.

관련 문제