적응 대각선 규칙을 사용하여 근사값을 근사하려고합니다. 통합 근사 함수 재귀
난 거친 적분 근사 가지고//Approximates the integral of f across the interval [a,b]
double coarse_app(double(*f)(double x), double a, double b) {
return (b - a) * (f(a) + f(b))/2.0;
}
를 I는 미세 적분 근사있다 :이 때까지 소정 기간의 부분 감소를 통해 근사치를 합산하여 적응된다
//Approximates the integral of f across the interval [a,b]
double fine_app(double(*f)(double x), double a, double b) {
double m = (a + b)/2.0;
return (b - a)/4.0 * (f(a) + 2.0 * f(m) + f(b));
}
을 어느 재귀 레벨이 너무 높거나 거칠고 정밀한 근사가 서로 매우 가깝다 :
//Adaptively approximates the integral of f across the interval [a,b] with
// tolerance tol.
double trap(double(*f)(double x), double a, double b, double tol) {
double q = fine_app(f, a, b);
double r = coarse_app(f, a, b);
if ((currentLevel >= minLevel) && (abs(q - r) <= 3.0 * tol)) {
return q;
} else if (currentLevel >= maxLevel) {
return q;
} else {
++currentLevel;
return (trap(f, a, b/2.0, tol/2.0) + trap(f, a + (b/2.0), b, tol/2.0));
}
}
섹션으로 나누고 fine_app을 사용하여 수동으로 적분을 계산하는 경우 매우 근사합니다. 그러나, 나를 위해 이렇게해야 함, 함정 기능을 사용할 때 내 결과를 모두 너무 작습니다.
예를 들어, trap (square, 0, 2.0, 1.0e-2)은 0.0424107 출력을 제공합니다. 여기서 square 함수는 x^2로 정의됩니다. 그러나 출력은 약 2.667이어야합니다. 이것은 전체 간격에서 하나의 fine_app를 실행하는 것보다 훨씬 나쁩니다. 값은 3입니다.
개념적으로는 올바르게 구현했다고 믿지만, C++ 재귀에 대해서는 무언가가 있습니다. 기대해라.
C++로 처음 프로그래밍하므로 모든 개선이 가능합니다.
currentLevel은 어디에 정의되어 있습니까? 나는 그것을 당신의 코드에서 볼 수 없다. 그것이 글로벌 변수라면, 당신은 잘못된 것을하고 있습니다. –
예, currentLevel을 전역 변수로 정의했습니다. 아래 답변을 주셔서 감사합니다. 나는 그것을 철저히 살펴볼 것이다. –