Main Content

quadgk

적분의 수치적 계산 — 가우스-크론로드 구적법

설명

예제

q = quadgk(fun,a,b)는 높은 차수의 전역 적응적 구적법과 디폴트 허용오차를 사용하여 a에서 b까지 함수 핸들 fun을 적분합니다.

예제

[q,errbnd] = quadgk(fun,a,b)는 절대 오차의 상한 근사치 |q - I|를 추가로 반환합니다. 여기서 I는 정확한 적분값입니다.

예제

[___] = quadgk(fun,a,b,Name,Value)는 위에 열거된 출력 인수 조합 중 하나를 사용하여 하나 이상의 이름-값 쌍 인수와 함께 추가 옵션을 지정합니다. 예를 들어, 'Waypoints' 다음에 실수 또는 복소수의 벡터를 지정하여 적분기가 사용할 특정 점을 표시합니다.

예제

모두 축소

적분 계산하기

q=01exln(x)dx.

ln(0)-로 발산하므로, 이 적분은 점 x=0에 특이점이 있습니다.

피적분 함수에 대한 익명 함수를 만듭니다. log 함수는 ln(x)를 계산합니다.

f = @(x) exp(x).*log(x);

f를 0에서 1까지 적분합니다.

q = quadgk(f,0,1)
q = -1.3179

경로를 지정하여 극점 주변에서 복소 함수를 적분합니다.

그런 다음 복소 경로 적분을 계산합니다.

q=dz2z-1.

피적분 함수는 z=1/2에 단순극이 있으므로 그 점을 둘러싸는 사각 경로를 사용합니다. 경로는 실수 선의 x=1에서 시작하고 끝납니다. 'Waypoints' 이름-값 쌍을 사용하여 경로에 조각별 세그먼트를 지정합니다.

f = @(z) 1./(2.*z-1);
contour_segments = [1+1i 0+1i 0-1i 1-1i];
q = quadgk(f,1,1,'Waypoints',contour_segments)
q = -0.0000 + 3.1416i

quadgk를 사용하여, 계산하기 어려운 진동 피적분 함수를 계산합니다.

적분 계산하기

Q=0πsin(20000πx)dx.

피적분 함수는 매우 빠르게 진동하므로 계산하기가 어렵습니다. quadgk를 사용하여 적분을 계산하고, 충족해야 할 허용오차에 얼마나 가까운지 확인하기 위해 2개 출력값을 지정합니다.

fun = @(x) sin(2e4*pi*x);
[Q,errbnd] = quadgk(fun,0,pi)
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is  5.7e-01. The integral may not exist, or it may be difficult to approximate numerically. Increase MaxIntervalCount to 1272 to enable QUADGK to continue for another iteration.
Q = -0.0082
errbnd = 0.5723

경고 메시지는 MaxIntervalCount를 어떻게 조정해야 할지 알려 주기 때문에 풀이 과정에서 추가 반복이 가능합니다.

적분을 다시 풀되, MaxIntervalCount1e5로 지정합니다. 구간이 더 많으면, quadgk가 문제에 대한 절대 허용오차를 충족할 수 있습니다(배정밀도의 경우 1e-10).

[Q,errbnd] = quadgk(fun,0,pi,'MaxIntervalCount',1e5)
Q = 1.6656e-06
errbnd = 2.6323e-12

입력 인수

모두 축소

피적분 함수로, a부터 b까지의 범위에서 적분할 함수를 정의하는 함수 핸들로 지정됩니다.

스칼라 값 문제의 경우, 함수 y = fun(x)는 벡터 인수 x를 받아 벡터 결과값 y를 반환해야 합니다. 여기서 yx의 각 요소에서 구한 피적분 함수 값입니다. 이 요구 사항은 일반적으로 fun이 행렬 연산자(^, *, …) 대신 배열 연산자(.^, .*, …)를 사용해야 한다는 것을 의미합니다.

함수를 파라미터화하기에는 필요한 경우 fun 함수에 추가 파라미터를 제공하는 방법이 설명되어 있습니다.

예: q = quadgk(@(x) exp(1-x.^2),a,b)는 익명 함수 핸들을 적분합니다.

예: q = quadgk(@myFun,a,b)는 함수 myFun을 적분하며, 이 함수는 파일에 저장되어 있습니다.

데이터형: function_handle

적분 한계로, 실수형 스칼라 또는 복소수형 스칼라의 개별 인수로 지정됩니다. 한계 ab-Inf 또는 Inf일 수 있습니다. 두 한계가 다 유한한 경우, a와 b는 복소수일 수 있습니다. 적어도 하나가 복소수이면 적분 근사치는 복소 평면에서 a에서 b를 잇는 직선 경로 상에서 계산됩니다.

예: quadgk(fun,0,1)0에서 1까지 fun을 적분합니다.

데이터형: single | double
복소수 지원 여부:

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: q = quadgk(fun,a,b,'Waypoints',[0.1 1.1 2.1])'Waypoints' 옵션을 사용하여 피적분 함수를 계산해야 하는 몇 개의 관심 지점을 지정합니다.

절대 허용오차로, 'AbsTol'과 함께 음이 아닌 실수가 쉼표로 구분되어 지정됩니다. quadgk는 절대 오차 |q – I|의 추정값을 제한하기 위해 절대 허용오차를 사용합니다. 여기서 q는 계산된 적분의 값이고 I는 (알려지지 않은) 정확한 값입니다. 절대 허용오차를 감소시키면 quadgk가 더 큰 소수 정밀도를 제공할 수 있습니다.

quadgk는 다음을 충족하려고 시도합니다.

errbnd <= max(AbsTol,RelTol*abs(q))
이 관계는 |q|가 충분히 작을 때는 절대 오차 제어이고, |q|가 더 클 때는 상대 오차 제어입니다. 순수 절대 오차 제어에는 'AbsTol' > 0'RelTol'= 0을 사용합니다. 순수 상대 오차 제어에는 'RelTol' > 0'AbsTol' = 0을 사용합니다. 순수 절대 오차 제어를 사용하는 경우를 제외하고는, 최소 상대 허용오차는 'RelTol' >= 100*eps(class(q))입니다.

예: quadgk(fun,a,b,'AbsTol',1e-12)는 절대 허용오차의 근삿값을 소수점 이하 약 열두 자릿수까지의 정확도로 설정합니다.

예: quadgk(fun,a,b,'AbsTol',tol,'RelTol',0)은 순수하게 절대 오차 제어를 사용하므로 errbnd <= tol이어야 합니다.

데이터형: single | double

상대 허용오차로, 'RelTol'과 함께 음이 아닌 실수가 쉼표로 구분되어 지정됩니다. quadgk는 상대 오차 |q - I|/|I|의 추정값을 제한하기 위해 상대 허용오차를 사용합니다. 여기서 q는 계산된 적분의 값이고 I는 (알려지지 않은) 정확한 값입니다. 상대 허용오차를 감소시키면 quadgk가 더 큰 유효 자릿수 정밀도를 제공할 수 있습니다.

quadgk는 다음을 충족하려고 시도합니다.

errbnd <= max(AbsTol,RelTol*abs(q))
이 관계는 |q|가 충분히 작을 때는 절대 오차 제어이고, |q|가 더 클 때는 상대 오차 제어입니다. 순수 절대 오차 제어에는 'AbsTol' > 0'RelTol'= 0을 사용합니다. 순수 상대 오차 제어에는 'RelTol' > 0'AbsTol' = 0을 사용합니다. 순수 절대 오차 제어를 사용하는 경우를 제외하고는, 최소 상대 허용오차는 'RelTol' >= 100*eps(class(q))입니다.

예: quadgk(fun,a,b,'RelTol',1e-9)는 상대 허용오차를 약 9개의 유효 자릿수까지 설정합니다.

예: quadgk(fun,a,b,'AbsTol',0,'RelTol',tol)은 순수하게 상대 허용오차를 사용하므로, errbnd <= |I|*tol이어야 합니다.

데이터형: single | double

적분 중간점으로, 'Waypoints'와 함께 실수나 복소수의 벡터가 쉼표로 구분되어 지정됩니다. 적분기가 초기 메시에서 사용해야 할 적분 구간 내의 점을 나타내려면 중간점을 사용합니다.

  • 국소 극값처럼 함수의 흥미로운 특징 근처에 계산 지점을 추가합니다.

  • 불연속점의 위치를 지정해 피적분 함수의 불연속점을 거쳐 효율적으로 적분을 계산합니다.

  • 복소수를 중간점으로 지정하여 복소 경로 적분법(Complex Contour Integration)을 수행합니다. xmin, xmax 또는 중간점 벡터의 값이 복소수인 경우, 적분은 복소 평면 내의 일련의 직선 경로에 대해 수행됩니다. 이 경우 적분 한계와 중간점은 유한해야 합니다.

특이점을 지정하기 위해 중간점을 사용하지 마십시오. 그 대신, 구간을 분할하고 끝점에 특이점을 가진 별도의 적분 결과를 더합니다.

예: 'Waypoints',[1+1i,1-1i]는 적분 구간 위의 복소수 중간점을 두 개 지정합니다.

데이터형: single | double
복소수 지원 여부:

허용된 최대 구간 개수로, 스칼라로 지정됩니다. 이 옵션은 첫 번째 반복이 이루어진 후 한 번 quadgk 함수가 사용하는 구간 개수를 제한합니다. 이 제한 때문에 quadgk가 조기에 반환되는 경우에는 경고가 발생됩니다. 이 값을 일상적으로 올리는 것은 권장되지 않지만, errbnd가 원하는 정확성에 거의 도달되었을 정도로 충분히 작을 때는 이 방법이 적합할 수 있습니다.

예: quadgk(fun,a,b,'MaxIntervalCount',700)

출력 인수

모두 축소

적분의 값으로, 스칼라로 반환됩니다.

절대 오차의 상한 근사치로, 스칼라로 반환됩니다. 적분에서 절대 오차의 상한 근사치는 errbnd = |q – I|이며, 여기서 q는 적분의 계산된 값이고 I는 (알 수 없는) 정확한 값입니다. quadgk는 다음을 충족하려고 시도합니다.

errbnd <= max(AbsTol,RelTol*abs(q))
이 출력 인수를 지정하여 적분이 AbsTolRelTol 허용오차 기준을 얼마나 잘 준수하는지 확인합니다. errbnd가 원하는 값에 가까운 경우 MaxIntervalCount의 값을 증가시켜 원하는 값에 도달할 수 있습니다.

  • quadgkintegral은 본질적으로 동일한 적분 방법을 사용합니다. 일반적으로 quadgk가 아니라 integral을 사용해야 합니다. 하지만 다음과 같은 목적으로 quadgk를 사용할 수 있습니다.

    • errbnd 출력 인수로 해의 정확도를 모니터링합니다.

    • integral에서 최대 구간 개수에 도달했음을 경고할 경우 MaxIntervalCount에 큰 값을 지정합니다.

  • quadgk는 특이점이 너무 강력하지 않을 경우 유한 끝점에 특이점이 있는 함수를 적분할 수 있습니다. 예를 들어, 끝점 c에서 log|x-c| 또는 |x-c|p(p >= -1/2)와 같이 동작하는 함수를 적분할 수 있습니다. 함수가 적분 한계 [a b] 내의 점에서 특이점을 가질 경우, 특이점을 끝점으로 갖는 여러 하위 구간에서의 적분의 합으로 적분을 작성한 후 quadgk를 사용하여 적분을 계산하고 각 적분 결과를 더합니다.

  • 구간이 무한대 [a,)인 경우 fun(x)에 대한 적분이 성립하려면 x가 무한대에 가까워질 때 fun(x)가 감쇠해야 합니다. quadgk를 사용하려면 이 함수가 빠르게 감쇠해야 합니다.

참고 문헌

[1] Shampine, L.F. "Vectorized Adaptive Quadrature in MATLAB®." Journal of Computational and Applied Mathematics. Vol. 211, 2008, pp.131–140.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2007b에 개발됨