4.3 적분

적분(integral)은 미분과 반대되는 개념이다. 적분에는 부정적분(indefinite integral)과 정적분(definite integral)이 있다.

부정적분

**부정적분(indefinite integral)은 정확하게 미분과 반대되는 개념, 즉 반-미분(anti-derivative)**이다. 함수 \(f(x)\)가 어떤 함수를 미분하여 나온 결과인 도함수라고 가정하고 이 도함수 \(f(x)\)에 대한 미분되기 전의 원래의 함수를 찾는 과정(integration), 또는 그 결과(integral)를 말한다.

부정적분으로 찾은 원래의 함수를 표기할 때는 도함수를 대문자화(capitalization)하여 표기할 때도 있지만 다음처럼 \(\int\) 기호(integral이라고 읽는다.)로 나타내는 것이 일반적이다. 여기에서 도함수가 \(f(x)\)이므로 미분하기 전의 함수를 \(F(x)\) 또는 \(\int f(x)dx\)로 쓴다. \(dx\)\(x\)라는 변수로 적분했다는 것을 나타내는 기호로 편미분에 대응하는 적분을 표기할 때 필요하다.

\[ \begin{align} \dfrac{dF(x)}{dx} = f(x) \;\;\leftrightarrow\;\; F(x) = \int_{}^{} f(x) dx + C \tag{4.3.1} \end{align} \]

\(C\)는 상수항을 뜻한다. 상수항은 미분하면 0이 되므로 부정적분은 무한 개의 해가 있다. \(C\)는 너무 당연하므로 생략하고 쓰는 경우도 있다.

연습 문제 4.3.1

다음 부정적분을 구하라.

(1) $\( \begin{align} \int 3x^2 dx \tag{4.3.2} \end{align} \)$

(2) $\( \begin{align} \int (3x^2 - 6x + 1)dx \tag{4.3.3} \end{align} \)$

(3) $\( \begin{align} \int \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx \tag{4.3.4} \end{align} \)$

(4) $\( \begin{align} \int \frac{2x}{x^2 - 1} dx \tag{4.3.5} \end{align} \)$

편미분의 부정적분

편미분을 한 도함수에서 원래의 함수를 찾을 수도 있다. \(f(x, y)\)가 원래의 함수를 어떻게 미분했는지에 따라 원래의 함수를 표기하는 방법이 달라진다.

만약 \(f(x, y)\)가 함수 \(F_1(x, y)\)\(x\)로 편미분한 함수였다면 이 함수를 나타내는 식은 다음과 같다.

\[ \begin{align} \dfrac{\partial F_1(x, y)}{\partial x} = f(x, y) \; \leftrightarrow \; F_1(x, y) = \int_{}^{} f(x, y) dx + C(y) \tag{4.3.6} \end{align} \]

주의할 점은 상수항 \(C(y)\)\(y\)의 함수일 수 있다는 점이다. \(C(y)\)\(x\)없이 \(y\)만으로 이루어진 함수를 뜻한다. \(y\)만의 함수는 \(x\)로 편미분하면 0이 되기 때문이다. 물론 반드시 \(y\)의 함수이어야 하는 것은 아니고 단순한 숫자 상수일 수도 있다.

마찬가지로 만약 \(f(x, y)\)가 함수 \(F_2(x, y)\)\(y\)로 편미분한 함수였다면 이 함수를 나타내는 식은 다음과 같다.

\[ \begin{align} \dfrac{\partial F_2(x, y)}{\partial y} = f(x, y) \; \leftrightarrow \; F_2(x, y) = \int_{}^{} f(x, y) dy + C(x) \tag{4.3.7} \end{align} \]

상수항 \(C(x)\)\(x\)의 함수라는 점에 주의하라.

연습 문제 4.3.2

다음 부정적분을 구하라.

(1) $\( \begin{align} \int \left( 1 + xy \right) dx \tag{4.3.8} \end{align} \)$

(2) $\( \begin{align} \int xy\exp({x^2 + y^2}) dx \tag{4.3.9} \end{align} \)$

다차 도함수와 다중적분

미분을 여러번 한 결과로 나온 다차 도함수로부터 원래의 함수를 찾아내려면 여러번 적분을 하는 다중적분(multiple integration)이 필요하다.

예를 들어 \(f(x, y)\)가 함수 \(F_3(x, y)\)\(x\)로 한번 편미분한 후 \(y\)로 다시 편미분하여 나온 이차 도함수라고 하자.

이 이차 도함수에서 원래의 함수를 찾으려면 \(y\)로 적분한 후 다시 \(x\)로 적분해야 한다. 식으로는 다음처럼 나타낸다.

\[ \begin{align} \dfrac{\partial^2 F_3(x,y)}{\partial x \partial y} = f(x, y) \; \leftrightarrow \; F_3(x, y) = \int_x \int_y f(x, y) dydx \tag{4.3.10} \end{align} \]

적분기호 아래의 변수명을 생략하고 다음처럼 표기할 수도 있다.

\[ \begin{align} \iint f(x, y) dydx \tag{4.3.11} \end{align} \]

연습 문제 4.3.3

다음 부정적분을 구하라.

\[ \begin{align} \iint xy \exp({x^2 + y^2}) dxdy \tag{4.3.12} \end{align} \]

심파이를 이용한 부정적분

심파이의 integrate() 명령을 사용하면 부정적분을 할 수 있다. 상수항은 반환하지 않는다.

import sympy

sympy.init_printing(use_latex='mathjax')

x = sympy.symbols('x')
f = x * sympy.exp(x) + sympy.exp(x)
f
\[\displaystyle x e^{x} + e^{x}\]
sympy.integrate(f)
\[\displaystyle x e^{x}\]
x, y = sympy.symbols('x y')
f = 2 * x + y
f
\[\displaystyle 2 x + y\]
sympy.integrate(f, x)
\[\displaystyle x^{2} + x y\]

연습 문제 4.3.4

연습 문제 4.3.1, 4.3.2의 답을 SymPy를 사용하여 구하라.

정적분

정적분(definite integral)은 독립변수 \(x\)가 어떤 구간 \([a, b]\) 사이일 때 그 구간에서 함수 \(f(x)\)의 값과 수평선(x 축)이 이루는 면적을 구하는 행위(integration) 혹은 그 값(integral)을 말한다. 수학 기호로는 다음과 같이 표기한다.

\[ \begin{align} \int_{a}^{b} f(x) dx \tag{4.3.13} \end{align} \]
from matplotlib.patches import Polygon


def f(x):
    return x ** 3 - 3 * x ** 2 + x + 6


a, b = 0, 2
x = np.linspace(a - 0.5, b + 0.5, 50)
y = f(x)

ax = plt.subplot(111)
plt.title("정적분의 예")
plt.plot(x, y, 'r', linewidth=2)
plt.ylim(bottom=0)
ix = np.linspace(a, b)
iy = f(ix)
verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')
ax.add_patch(poly)
plt.text(0.5 * (a + b), 0.2 * (f(a) + f(b)), r"$\int_a^b f(x)dx$",
         horizontalalignment='center', fontsize=20)
plt.figtext(0.9, 0.05, '$x$')
plt.figtext(0.1, 0.9, '$y$')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.xaxis.set_ticks_position('bottom')
ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([])
ax.set_xlim(-2, 4)
ax.set_ylim(0, 8)
plt.show()
../_images/04.03 적분_20_0.png

정적분은 미분과 아무런 상관이 없어 보이지만 부정적분으로 구한 함수 \(F(x)\)를 이용하면 다음처럼 정적분의 값을 구할 수 있다.

\[ \begin{align} \int_{a}^{b} f(x) dx = F(b) - F(a) \tag{4.3.14} \end{align} \]

이를 **미적분학의 기본 정리(Fundamental Theorem of Calculus)**라고 부른다.

정적분은 심파이 등으로 부정적분을 한 뒤 미적분학의 기본 정리를 사용하여 푸는 방법과 원래 함수의 면적 부분을 실제로 잘게 쪼개어 면적을 근사하게 구하는 수치적분(numerical integration) 이렇게 두가지 방법으로 구할 수 있다.

예제

다음 정적분을 구하는 문제를 생각하자.

\[ \begin{align} \int_0^2 ( x^3 - 3x^2 + x + 6) dx \tag{4.3.15} \end{align} \]
x, y = sympy.symbols('x y')
f = x ** 3 - 3 * x ** 2 + x + 6
f
\[\displaystyle x^{3} - 3 x^{2} + x + 6\]

우선 부정 적분 방법으로 미분하기 전의 함수를 구한다.

# 부정 적분
F = sympy.integrate(f)
F
\[\displaystyle \frac{x^{4}}{4} - x^{3} + \frac{x^{2}}{2} + 6 x\]

구해진 미분하기 전의 함수에 정적분 구간을 넣어 값을 계산한다. 심볼릭 함수의 변수에 실제 숫자를 넣어서 함수의 값을 계산하려면 subs(), evalf() 메서드를 사용한다.

(F.subs(x, 2) - F.subs(x, 0)).evalf()
\[\displaystyle 10.0\]

수치적분

**수치적분(numerical integration)**은 함수를 아주 작은 구간으로 나누어 실제 면적을 계산함으로써 정적분의 값을 구하는 방법이다. Scipy의 integrate 서브패키지의 quad 명령으로 수치적분을 할 수 있다.

def f(x):
    return x ** 3 - 3 * x ** 2 + x + 6


sp.integrate.quad(f, 0, 2)  # 정적분 (수치적분)
\[\displaystyle \left( 10.0, \ 1.1102230246251565e-13\right)\]

수치적분 결과값의 두번째 숫자는 오차의 상한값을 뜻한다. 수치적분으로 구한 값과 정적분으로 구한 값이 같다는 것을 알 수 있다.

연습 문제 4.3.5

다음 정적분의 값을 부정적분과 수치적분 두 가지 방법으로 구하라.

(1) $\( \begin{align} \int_0^1 (3x^2 - 6x + 1)dx \tag{4.3.16} \end{align} \)$

(2) $\( \begin{align} \int_1^{10} \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx \tag{4.3.17} \end{align} \)$

다변수 정적분

입력 변수가 2개인 2차원 함수 \( f(x, y) \)의 경우에는 정적분을 다양한 방법으로 정의할 수 있다.

두 변수로 모두 적분하는 것은 2차원 평면에서 주어진 사각형 영역 아래의 부피를 구하는 것과 같다.

\[ \begin{align} \int_{y=c}^{y=d} \int_{x=a}^{x=b} f(x, y) dx dy \tag{4.3.18} \end{align} \]

예제

다음 함수는 \(x=2\)에서 \(x=8\)까지, 그리고 \(y=0\)에서 \(y=6\)까지의 정사각형 영역에서 정적분으로 함수의 부피를 구하는 모습을 시각화한 것이다.

\[ \begin{align} \int_{y=0}^{y=6}\int_{x=2}^{x=8} x^2 - 10 x + y + 50 \;\; dx dy \tag{4.3.19} \end{align} \]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
_x = np.arange(12) / 2 + 2
_y = np.arange(12) / 2
X, Y = np.meshgrid(_x, _y)
x, y = X.ravel(), Y.ravel()
z = x * x - 10 * x + y + 50
z0 = np.zeros_like(z)
ax.bar3d(x, y, z0, 0.48, 0.48, z)
ax.set_xlim(0, 10)
ax.set_ylim(-2, 10)
ax.set_zlim(0, 50)
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.title("f(x, y)")
plt.show()
../_images/04.03 적분_38_0.png

수치이중적분을 하려면 사이파이의 integrate 서브패키지의 dblquad() 명령을 사용한다. 함수 사용법은 다음과 같다.

dblquad(func, a, b, gfun, hfun)

a, b은 x의 하한(lower bound)과 상한(upper bound)이고 gfun, hfun은 y의 하한과 상한이다. gfun, hfun은 x의 함수이어야 한다.

예제

정적분

\[ \begin{align} \int_0^{\infty} \int_1^{\infty} \dfrac{\exp(-xy)}{x^2} dx dy \tag{4.3.20} \end{align} \]

을 수치적분으로 계산하려면 다음과 같은 코드를 사용한다.

def f(y, x):
    return np.exp(-x * y) / x**2


sp.integrate.dblquad(f, 1, np.inf, lambda x: 0, lambda x: np.inf)
\[\displaystyle \left( 0.4999999999999961, \ 1.0684538743333441e-08\right)\]

연습 문제 4.3.6

다음 정적분의 값을 수치적분으로 구하라.

\[ \begin{align} \int_{-1}^1 \int_{-1}^1 \left( 1 + xy \right) dxdy \tag{4.3.21} \end{align} \]

다차원 함수의 단일 정적분

2차원 함수이지만 이중적분을 하지 않고 단일 정적분을 하는 경우도 있다. 이 때는 하나의 변수만 진짜 변수로 보고 나머지 하나는 상수라고 간주하는 경우이다.

\[ \begin{align} \int_a^b f(x, y) dx \tag{4.3.22} \end{align} \]

예제

다음과 같은 함수를 생각하자.

\[ \begin{align} f(x, y) = 4x^2 + 4xy + y^2 \tag{4.3.23} \end{align} \]

여기에서 변수 \(x\) 만 진짜 입력 변수로 보고 \(y\)는 단순히 정해지지 않은 상수로 보면 이 함수는 다음과 같은 1차원 함수이다.

\[ \begin{align} f(x; y) = 4x^2 + (4y)x + (y^2) \tag{4.3.24} \end{align} \]

\(y\)의 앞에 쉼표(, comma)가 아니라 세미콜론(; semicolon)을 써서 \(y\)가 변수가 아니라는 점을 강조하였다.