롬버그의 방법
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개 등에 적용된다.
사다리꼴 규칙 추정치를 구한 후 리처드슨 외삽법을 적용한다.
- 첫 번째 반복의 경우, 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
외부 링크
- ROMBINT – MATLAB용 코드(작성자: Martin Kacenak)
- Romberg, Fox-Romberg, Gauss-Legendre 및 기타 수치적 방법을 사용한 무료 온라인 통합 도구
- 롬버그의 방법의 SciPy 구현