롬버그의 방법

Romberg's method

수치해석에서는 롬버그의 방법(롬버그 1955)을 사용하여 확정 적분을 추정한다.

트라페지움 규칙이나 직사각형 규칙(중간점 규칙)에 리처드슨 외삽법(Richardson 1911)을 반복적으로 적용함으로써. 추정치는 삼각 배열을 생성한다. Romberg의 방법은 Newton-Cotes 공식으로, 동일한 간격으로 통합을 평가한다. 통합기업은 파생상품이 몇 개만 존재한다면 상당히 좋은 결과를 얻을 수 있지만 지속적인 파생상품을 보유해야 한다. 정밀한 부분과 일정한 간격의 점에서 통합을 평가할 수 있다면 가우스 사분법클렌쇼-커티스 사분법과 같은 다른 방법은 일반적으로 더 정확하다.

이 방법은 1955년 이 방법을 발표한 베르너 롬버그(1909~2003)의 이름을 딴 것이다.

방법

사용.

그 방법은 에 의해 귀납적으로 정의될 수 있다.

또는

여기서 m 1 O 표기법에서 R(n, m)에 대한 오류는 (Mysovskikh 2002)

0eth 외삽 R(n, 0)은 사다리꼴 규칙 2n + 1과 같고, 첫 번째 외삽 R(n, 1)은n 2 + 1점으로 심슨의 규칙과 같다. 두 번째 외삽법 R(n, 2)은 2n+1점을 갖는 Boole의 규칙에 해당한다. 추가적인 외삽은 뉴턴-코트 공식과 다르다. 특히 롬버그의 추가 추론은 부울의 법칙에 매우 작은 방식으로 확장되며, 부울의 법칙과 유사한 비율로 가중치를 수정한다. 대조적으로, 더 나아가서 뉴턴-코트 방법들은 점점 더 다른 가중치를 만들어 내고, 결국 큰 양의 가중치와 음의 가중치를 갖게 된다. 이는 다항식 뉴턴-코테스 방법의 보간도가 얼마나 큰지 나타내는 반면 롬버그 통합은 더 안정적이다.

기능평가가 비쌀 때는 리처드슨 주지사의 다항 보간법을 Bulirsch & Stoer(1967)가 제안한 합리적 보간으로 대체하는 것이 바람직할 수 있다.

기하학적 예

곡선 아래 면적을 추정하기 위해 사다리꼴 규칙이 먼저 원피스, 그 다음 2개, 4개 등에 적용된다.

One-piece approximation
원피스. 0에서 시작하고 끝나기 때문에 이 근사치는 0 영역을 산출한다.
Two-piece approximation
투피스
Four-piece approximation
포피스
Eight-piece approximation
8부작

사다리꼴 규칙 추정치를 구한 후 리처드슨 외삽법을 적용한다.

  • 첫 번째 반복의 경우, 2개의 조각과 1개의 조각 추정치가 공식에 사용된다(4 × (정확성이 더 낮음) - (정확성이 더 낮음)/3 동일한 공식을 사용하여 4개의 조각과 2개의 조각 추정치를 비교하고, 마찬가지로 더 높은 추정치에 대해서도 비교한다.
  • 두 번째 반복의 경우 첫 번째 반복 값은 공식(16(더 정확) - 더 정확하지 않음)/15에 사용된다.
  • 세 번째 반복은 두 번째 반복에 의해 도출된 값에 대해 다음 4: (64 (더 정확한) - 덜 정확함)/63의 힘을 사용한다.
  • 그 패턴은 하나의 견적이 있을 때까지 계속된다.
조각수 사다리꼴 추정치 첫 번째 반복 두 번째 반복 제3회 반복
(4 MA − LA)/3* (16 MA − LA)/15 (64 MA − LA)/63
1 0 (4×16 − 0)/3 = 21.333... (16×34.667 − 21.333)/15 = 35.556... (64×42.489 − 35.556)/63 = 42.599...
2 16 (4×30 − 16)/3 = 34.666... (16×42 − 34.667)/15 = 42.489...
4 30 (4×39 − 30)/3 = 42
8 39
  • MA는 더 정확하고, LA는 덜 정확하다는 뜻이다.

예를 들어 가우스 함수는 0부터 1까지 통합된다. 즉, 오류 함수 erf(1) ≈ 0.842700792949715이다. 삼각 배열이 행별로 계산되며 마지막 행의 마지막 두 항목이 10보다−8 작을 경우 계산이 종료된다.

 0.77174333  0.82526296  0.84310283  0.83836778  0.84273605  0.84271160  0.84161922  0.84270304  0.84270083  0.84270066  0.84243051  0.84270093  0.84270079  0.84270079  0.84270079 

삼각형 배열의 오른쪽 하단 모서리의 결과는 표시된 숫자와 정확하다. 이 결과는 삼각형 배열의 첫 번째 열에 있는 트라페지움 규칙에 의해 얻은 덜 정확한 근사치에서 도출된다는 것은 주목할 만하다.

실행

여기 (C 프로그래밍 언어로 된) 롬버그 방법의 컴퓨터 구현의 예가 있다.

#include <stdio.h> #include <수학.h>  공허하게 하다 덤프_row(size_t i, 곱절로 하다 *R) {    활자화하다("R[%2zu] = ", i);    을 위해 (size_t j = 0; j <= i; ++j){       활자화하다("%f ", R[j]);    }    활자화하다("\n"); }  곱절로 하다 롬버그(곱절로 하다 (*f/* 통합 기능 */)(곱절로 하다), 곱절로 하다 /*하한*/ a, 곱절로 하다 /*한계*/ b, size_t max_steps, 곱절로 하다 /*최소 정확도*/ 악센트를 붙이다) {    곱절로 하다 R1[max_steps], R2[max_steps]; // 버퍼    곱절로 하다 *Rp = &R1[0], *RC = &R2[0]; // Rp는 이전 행이고 Rc는 현재 행임    곱절로 하다 h = (b-a); //단계 크기    Rp[0] = (f(a) + f(b))*h*.5; // 첫 사다리꼴 단계     덤프_row(0, Rp);     을 위해 (size_t i = 1; i < max_steps; ++i) {       h /= 2.;       곱절로 하다 c = 0;       size_t ep = 1 << (i-1); //2^(n-1)       을 위해 (size_t j = 1; j <= ep; ++j) {          c += f(a+(2*j-1)*h);       }       RC[0] = h*c + .5*Rp[0]; //R(i,0)        을 위해 (size_t j = 1; j <= i; ++j) {          곱절로 하다 n_k = 포우(4, j);          RC[j] = (n_k*RC[j-1] - Rp[j-1])/(n_k-1); // 계산 R(i,j)       }        // R, R[i,i]의 ith 행을 덤프하는 것이 지금까지의 최선의 추정치 입니다.       덤프_row(i, RC);        만일 (i > 1 && (Rp[i-1]-RC[i]) < 악센트를 붙이다) {          돌아오다 RC[i-1];       }        // 마지막 행만 필요하므로 Rn과 Rc를 교체하십시오.       곱절로 하다 *rt = Rp;       Rp = RC;       RC = rt;    }    돌아오다 Rp[max_steps-1]; // 최선의 추측을 답례하다. } 

________________________________________________________


롬베르크 방법(자바스크립트 프로그래밍 언어로 된)의 컴퓨터 구현의 예가 여기에 있다.

기능을 하다 auto_integrator_nm_romb_hnm(펑크,a,b,엔맥스,tol_ae,tol_rae) // 입력 // 펑크=통합 // a= 통합 하한 // b= 통합 상한 // nmax = 파티션 수, n=2^nmax // tol_ae= 허용되는 최대 절대 근사 오차( >=0이어야 함) // tol_rae=최대 절대 상대적 근사 오차 허용( >=0이어야 함) // 출력 // integ_value=적분 추정치  {  만일 (활자의 a !== '숫자')    {     던지다 새로운 TypeError('숫자임에 틀림없다.');   }     만일 (활자의 b !== '숫자')    {     던지다 새로운 TypeError('숫자임에 틀림없다.');   }     만일 ((!숫자.이신테거(엔맥스))    (엔맥스<1))   {     던지다 새로운 TypeError('[nmax]는 1보다 크거나 같은 정수여야 한다.');   }  만일 ((활자의 tol_ae !== '숫자')    (tol_ae<0))    {     던지다 새로운 TypeError('[tole_ae]는 0보다 크거나 같은 숫자여야 한다.');   }  만일 ((활자의 tol_rae !== '숫자')    (tol_rae<=0))    {     던지다 새로운 TypeError('[tole_ae]는 0보다 크거나 같은 숫자여야 한다.');   }       시합을 하다 h=b-a  // 적분 값이 저장되는 매트릭스 초기화    시합을 하다 롬브 = []; // 행  을 위해 (시합을 하다 i = 0; i < 엔맥스+1; i++)   {   롬브.밀다([]);   을 위해 (시합을 하다 j = 0; j < 엔맥스+1; j++)    {    롬브[i].밀다(수학.번호를 매기다(0));    }  }    //1-모듈 사다리꼴 규칙으로 값 표시  롬브[0][0]=0.5*h*(펑크(a)+펑크(b))  시합을 하다 integ_val=롬브[0][0]    을 위해 (시합을 하다 i=1; i<=엔맥스; i++)  // 세그먼트 수를 두 배로 하여 값 업데이트  // 계산해야 하는 값만 사용하여  // https://autarkaw.org/2009/02/28/an-efficient-formula-for-an-automatic-integrator-based-on-trapezoidal-rule/ 참조  {   h=0.5*h   시합을 하다 정수의=0   을 위해 (시합을 하다 j=1; j<=2**i-1; j+=2)   {    시합을 하다 정수의=정수의+펑크(a+j*h)   }     롬브[i][0]=0.5*롬브[i-1][0]+정수의*h   // Romberg 방법을 사용하여 추정 가능한 다음 값 계산   // https://young.physics.ucsc.edu/115/romberg.pdf 참조   을 위해 (k=1; k<=i; k++)   {       시합을 하다 부가적인=롬브[i][k-1]-롬브[i-1][k-1]    부가적인=부가적인/(4**k-1.0)    롬브[i][k]=롬브[i][k-1]+부가적인     //절대 근사 오차 계산    시합을 하다 에아=수학.복근(롬브[i][k]-롬브[i][k-1])        // 절대 상대 근사 오차 계산    시합을 하다 엡사=수학.복근(에아/롬브[i][k])*100.0        //최근 값을 반환 변수에 할당    integ_val=롬브[i][k]        // 어느 한 공차가 충족되면 값 반환    만일 ((엡사<tol_rae)    (에아<tol_ae))    {     돌아오다(integ_val)    }   }  }  // 공차가 충족되는지 여부에 관계없이 적분의 마지막 계산 값 반환  돌아오다(integ_val) } 

참조

  • Richardson, L. F. (1911), "The Approximate Arithmetical Solution by Finite Differences of Physical Problems Involving Differential Equations, with an Application to the Stresses in a Masonry Dam", Philosophical Transactions of the Royal Society A, 210 (459–470): 307–357, doi:10.1098/rsta.1911.0009, JSTOR 90994
  • Romberg, W. (1955), "Vereinfachte numerische Integration", Det Kongelige Norske Videnskabers Selskab Forhandlinger, Trondheim, 28 (7): 30–36
  • Thacher Jr., Henry C. (July 1964), "Remark on Algorithm 60: Romberg integration", Communications of the ACM, 7 (7): 420–421, doi:10.1145/364520.364542
  • Bauer, F.L.; Rutishauser, H.; Stiefel, E. (1963), Metropolis, N. C.; et al. (eds.), "New aspects in numerical quadrature", Experimental Arithmetic, high-speed computing and mathematics, Proceedings of Symposia in Applied Mathematics, AMS (15): 199–218
  • Bulirsch, Roland; Stoer, Josef (1967), "Handbook Series Numerical Integration. Numerical quadrature by extrapolation", Numerische Mathematik, 9: 271–278, doi:10.1007/bf02162420
  • Mysovskikh, I.P. (2002) [1994], "Romberg method", in Hazewinkel, Michiel (ed.), Encyclopedia of Mathematics, Springer-Verlag, ISBN 1-4020-0609-8
  • Press, WH; Teukolsky, SA; Vetterling, WT; Flannery, BP (2007), "Section 4.3. Romberg Integration", Numerical Recipes: The Art of Scientific Computing (3rd ed.), New York: Cambridge University Press, ISBN 978-0-521-88068-8

외부 링크