Calculus_적분

JKH·약 4시간 전
0

미적분

목록 보기
3/3

데이터 사이언스 스쿨에서 공부한 내용입니다.

4.3 적분

부정적분

부정적분 은 함수 f(x)f(x)가 어떤 함수를 미분하여 나온 결과인 도함수라고 가정하고 이 도함수 f(x)f(x)에 대한 미분되기 전의 원래의 함수를 찾는 과정(integration), 또는 그 결과(integral)를 말한다.

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

연습 문제 4.3.1

다음 부정적분을 구하라.

3x2dx(4.3.2)\int 3x^2 dx \tag{4.3.2}
(3x26x+1)dx(4.3.3)\int (3x^2 - 6x + 1)dx \tag{4.3.3}
(2+6x+4exp(x)+5x)dx(4.3.4)\int \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx \tag{4.3.4}
2xx21dx(4.3.5)\int \frac{2x}{x^2 - 1} dx \tag{4.3.5}

✏️

편미분의 부정적분

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

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

F1(x,y)x=f(x,y)    F1(x,y)=f(x,y)dx+C(y)(4.3.6)\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}

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

F2(x,y)y=f(x,y)    F2(x,y)=f(x,y)dy+C(x)(4.3.7)\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}

연습 문제 4.3.2

다음 부정적분을 구하라.

(1+xy)dx(4.3.8)\int \left( 1 + xy \right) dx \tag{4.3.8}
xyexp(x2+y2)dx(4.3.9)\int xy\exp({x^2 + y^2}) dx \tag{4.3.9}

✏️
(1) x+0.5x2y+C(y)x+0.5x^2y+C(y)
(2) 0.5yexp(x2+y2)+c(y)0.5y\exp(x^2+y^2)+c(y)

다차 도함수와 다중적분

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

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

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

2F3(x,y)xy=f(x,y)    F3(x,y)=xyf(x,y)dydx(4.3.10)\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}

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

f(x,y)dydx(4.3.11)\iint f(x, y) dydx \tag{4.3.11}

연습 문제 4.3.3

다음 부정적분을 구하라.

xyexp(x2+y2)dxdy(4.3.12)\iint xy \exp({x^2 + y^2}) dxdy \tag{4.3.12}

✏️
0.25exp(x2+y2)+c0.25\exp(x^2+y^2)+c

심파이를 이용한 부정적분

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

import sympy
sympy.init_printing(use_latex='mathjax')

x = sympy.symbols('x')
f = x * sympy.exp(x) + sympy.exp(x)
f
   x    x
x⋅ℯ  + ℯ 
sympy.integrate(f)
   x
x⋅ℯ 
x, y = sympy.symbols('x y')
f = 2 * x + y
f
2⋅x + y
sympy.integrate(f, x)
 2      
x  + x⋅y

연습 문제 4.3.

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

import sympy
sympy.init_printing(use_latex='mathjax')
x, y = sympy.symbols('x y')
f1 = 3 * x ** 2
f2 = 3 * x ** 2 - 6 * x + 1
f3 = 2 + 6 * x + 4 * sympy.exp(x) + 5 / x
f4 = 2 * x / (x ** 2 - 1)
f5 = 1 + x * y
f6 = x * y * sympy.exp(x ** 2 + y ** 2)
print(sympy.integrate(f1, x))
print(sympy.integrate(f2, x))
print(sympy.integrate(f3, x))
print(sympy.integrate(f4, x))
print(sympy.integrate(f5, x))
print(sympy.integrate(f6, x))
 
x**3
x**3 - 3*x**2 + x
3*x**2 + 2*x + 4*exp(x) + 5*log(x)
log(x**2 - 1)
x**2*y/2 + x
y*exp(x**2 + y**2)/2

정적분

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

abf(x)dx(4.3.13)\int_{a}^{b} f(x) dx \tag{4.3.13}
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()


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

abf(x)dx=F(b)F(a)(4.3.14)\int_{a}^{b} f(x) dx = F(b) - F(a) \tag{4.3.14}

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

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

예제

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

02(x33x2+x+6)dx(4.3.15)\int_0^2 ( x^3 - 3x^2 + x + 6) dx \tag{4.3.15}
x, y = sympy.symbols('x y')
f = x ** 3 - 3 * x ** 2 + x + 6
f
 3      2        
x  - 3⋅x  + x + 6

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

# 부정 적분
F = sympy.integrate(f)
F
 4         2      
x     3   x       
── - x  + ── + 6⋅x
4         2       

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

(F.subs(x, 2) - F.subs(x, 0)).evalf()
10.0000000000000

수치적분

수치적분(numerical integration) 은 함수를 아주 작은 구간으로 나누어 실제 면적을 계산함으로써 정적분의 값을 구하는 방법이다.

Scipy의 integrate 서브패키지의 quad 명령으로 수치적분을 할 수 있다.

import sympy as sp
def f(x):
    return x ** 3 - 3 * x ** 2 + x + 6
sp.integrate.quad(f, 0, 2)  # 정적분 (수치적분)
(10.0, 1.1102230246251565e-13)

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

연습 문제 4.3.5

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

01(3x26x+1)dx(4.3.16)\int_0^1 (3x^2 - 6x + 1)dx \tag{4.3.16}
110(2+6x+4exp(x)+5x)dx(4.3.17)\int_1^{10} \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx \tag{4.3.17}

✏️

import sympy
import scipy
import numpy as np # Import numpy for lambdify
sympy.init_printing(use_latex='mathjax')

x = sympy.symbols('x')
f1 = 3*x**2 - 6*x + 1
f2 = 2 + 6*x + 4*sympy.exp(x) + 5/x
F1 = sympy.integrate(f1)
F2 = sympy.integrate(f2)

# print - 부정적분 + 미적분학의 기본정리
print((F1.subs(x, 1) - F1.subs(x, 0)).evalf())
print((F2.subs(x, 10) - F2.subs(x, 1)).evalf())

# Convert the SymPy expression to a numerical function using lambdify
f1_num = sympy.lambdify(x, f1, modules=['numpy']) 
f2_num = sympy.lambdify(x, f2, modules=['numpy']) 

# Now use f_num with scipy.integrate.quad(수치적분)
print(scipy.integrate.quad(f1_num, 0, 1))
print(scipy.integrate.quad(f2_num, 1, 10))
-1.00000000000000
88421.5029773780
(-1.0, 1.3085085171449517e-14)
(88421.50297737827, 1.5276890734473408e-06)

다변수 정적분

입력 변수가 2개인 2차원 함수 f(x,y)f(x, y)의 경우에는 정적분을 다양한 방법으로 정의할 수 있다.
두 변수로 모두 적분하는 것은 2차원 평면에서 주어진 사각형 영역 아래의 부피를 구하는 것과 같다.

y=cy=dx=ax=bf(x,y)dxdy(4.3.18)\int_{y=c}^{y=d} \int_{x=a}^{x=b} f(x, y) dx dy \tag{4.3.18}

예제

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

y=0y=6x=2x=8x210x+y+50    dxdy(4.3.19)\int_{y=0}^{y=6}\int_{x=2}^{x=8} x^2 - 10 x + y + 50 \;\; dx dy \tag{4.3.19}
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의 함수이어야 한다. (lambda x: 사용)

예제

01exp(xy)x2dxdy(4.3.20)\int_0^{\infty} \int_1^{\infty} \dfrac{\exp(-xy)}{x^2} dx dy \tag{4.3.20}

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

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)
(0.4999999999999961, 1.0684538743333441e-08)

연습 문제 4.3.6

1111(1+xy)dxdy(4.3.21)\int_{-1}^1 \int_{-1}^1 \left( 1 + xy \right) dxdy \tag{4.3.21}

✏️

import scipy
def f(x, y):
    return (1 + x*y)
scipy.integrate.dblquad(f, -1, 1, lambda x: -1, lambda x: 1)
 
(4.0, 4.44089209850063⋅10−14)
profile
Connecting my favorite things

0개의 댓글