4.3 적분#
적분(integral)은 미분과 반대되는 개념이다. 적분에는 부정적분(indefinite integral)과 정적분(definite integral)이 있다.
부정적분#
**부정적분(indefinite integral)은 정확하게 미분과 반대되는 개념, 즉 반-미분(anti-derivative)**이다. 함수
부정적분으로 찾은 원래의 함수를 표기할 때는 도함수를 대문자화(capitalization)하여 표기할 때도 있지만 다음처럼
연습 문제 4.3.1#
다음 부정적분을 구하라.
(1)
$
(2)
$
(3)
$
(4)
$
편미분의 부정적분#
편미분을 한 도함수에서 원래의 함수를 찾을 수도 있다.
만약
주의할 점은 상수항
마찬가지로 만약
상수항
연습 문제 4.3.2#
다음 부정적분을 구하라.
(1)
$
(2)
$
다차 도함수와 다중적분#
미분을 여러번 한 결과로 나온 다차 도함수로부터 원래의 함수를 찾아내려면 여러번 적분을 하는 다중적분(multiple integration)이 필요하다.
예를 들어
이 이차 도함수에서 원래의 함수를 찾으려면
적분기호 아래의 변수명을 생략하고 다음처럼 표기할 수도 있다.
연습 문제 4.3.3#
다음 부정적분을 구하라.
심파이를 이용한 부정적분#
심파이의 integrate()
명령을 사용하면 부정적분을 할 수 있다. 상수항은 반환하지 않는다.
import sympy
sympy.init_printing(use_latex='mathjax')
x = sympy.symbols('x')
f = x * sympy.exp(x) + sympy.exp(x)
f
sympy.integrate(f)
x, y = sympy.symbols('x y')
f = 2 * x + y
f
sympy.integrate(f, x)
연습 문제 4.3.4#
연습 문제 4.3.1, 4.3.2의 답을 SymPy를 사용하여 구하라.
정적분#
정적분(definite integral)은 독립변수
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()

정적분은 미분과 아무런 상관이 없어 보이지만 부정적분으로 구한 함수
이를 **미적분학의 기본 정리(Fundamental Theorem of Calculus)**라고 부른다.
정적분은 심파이 등으로 부정적분을 한 뒤 미적분학의 기본 정리를 사용하여 푸는 방법과 원래 함수의 면적 부분을 실제로 잘게 쪼개어 면적을 근사하게 구하는 수치적분(numerical integration) 이렇게 두가지 방법으로 구할 수 있다.
예제#
다음 정적분을 구하는 문제를 생각하자.
x, y = sympy.symbols('x y')
f = x ** 3 - 3 * x ** 2 + x + 6
f
우선 부정 적분 방법으로 미분하기 전의 함수를 구한다.
# 부정 적분
F = sympy.integrate(f)
F
구해진 미분하기 전의 함수에 정적분 구간을 넣어 값을 계산한다. 심볼릭 함수의 변수에 실제 숫자를 넣어서 함수의 값을 계산하려면 subs()
, evalf()
메서드를 사용한다.
(F.subs(x, 2) - F.subs(x, 0)).evalf()
수치적분#
**수치적분(numerical integration)**은 함수를 아주 작은 구간으로 나누어 실제 면적을 계산함으로써 정적분의 값을 구하는 방법이다.
Scipy의 integrate 서브패키지의 quad
명령으로 수치적분을 할 수 있다.
def f(x):
return x ** 3 - 3 * x ** 2 + x + 6
sp.integrate.quad(f, 0, 2) # 정적분 (수치적분)
수치적분 결과값의 두번째 숫자는 오차의 상한값을 뜻한다. 수치적분으로 구한 값과 정적분으로 구한 값이 같다는 것을 알 수 있다.
연습 문제 4.3.5#
다음 정적분의 값을 부정적분과 수치적분 두 가지 방법으로 구하라.
(1)
$
(2)
$
다변수 정적분#
입력 변수가 2개인 2차원 함수
두 변수로 모두 적분하는 것은 2차원 평면에서 주어진 사각형 영역 아래의 부피를 구하는 것과 같다.
예제#
다음 함수는
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()

수치이중적분을 하려면 사이파이의 integrate 서브패키지의 dblquad()
명령을 사용한다. 함수 사용법은 다음과 같다.
dblquad(func, a, b, gfun, hfun)
a
, b
은 x의 하한(lower bound)과 상한(upper bound)이고 gfun
, hfun
은 y의 하한과 상한이다. gfun
, hfun
은 x의 함수이어야 한다.
예제#
정적분
을 수치적분으로 계산하려면 다음과 같은 코드를 사용한다.
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)
연습 문제 4.3.6#
다음 정적분의 값을 수치적분으로 구하라.
다차원 함수의 단일 정적분#
2차원 함수이지만 이중적분을 하지 않고 단일 정적분을 하는 경우도 있다. 이 때는 하나의 변수만 진짜 변수로 보고 나머지 하나는 상수라고 간주하는 경우이다.
예제#
다음과 같은 함수를 생각하자.
여기에서 변수