```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sympy
sympy.init_printing(use_latex='mathjax')
%matplotlib inline
```

## 적분

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

#### 부정적분(indefinite integral)

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

- 부정적분으로 찾은 원래의 함수를 표기할 때는 도함수를 대문자화하여 표기할 때도 있지만, 다음처럼 Integral기호로 나타내는 것이 일반적이다. 여기에서 도함수가 f(x)이므로 미분하기 전의 함수를 F(x)또는 Sf(x)dx로 쓴다. dx는 x라는 변수로 적분했다는 것을 나타내는 기호로 편미분에 대응하는 적분을 표기할 때 필요하다.
- dF(x)/dx = f(x) <-> F(x) = Sf(x)dx + C # C는 상수값


```python
# 연습문제1
# 부정적분을 구하라
# 1. S3x^2dx
# 2. S(3x^2-6x+1)dx
# 3. S(2+6x+4exp(x) + 5/x)dx
# 4. S((2x)/x^2-1)dx
```

#### 편미분의 도함수

- 편미분을 한 도함수에서 원래의 함수를 찾을 수도 있다. 다음 식은 f(x,y)가 원래의 함수를 어떻게 미분했는지에 따라 원래의 함수를 표기하는 방법이 달라진다는 것을 나타낸다. 
- 만약 f(x,y)가 함수 F1(x,y)를 x로 편미분한 함수였다면 이 함수를 찾는 식은 다음과 같다.
- roundF1(x,y)/round(x) = f(x,y) <-> F1(x,y) = Sf(x,y)dx + C(y)
- 주의할 점은 상수항 C(y)가 y의 함수일 수 있다는 점이다. C(y)는 x없이 y만으로 이루어진 함수를 뜻한다. y만의 함수는 x로 편미분하면 0이 되기 때문이다. 물론 반드시 y의 함수이어야 하는 것은 아니고 단순한 숫자 상수일 수도 있다.
- 마찬가지로 만약 f(x, y)가 함수 F2(x,y)를 y로 편미분한 함수였다면 이 함수를 찾는 식은 다음과 같다
- round(f2(x,y)/round(y) = f(x,y) <-> F2(x,y) = Sf(x,y)dy + C(x)


```python
# 연습문제2
# 다음 부정적분을 구하라
# 1. S(1+xy)dx
# 2. S(xyexp(x^2 + y^2)dx)
```

#### 다차 도함수와 다중 적분

- 미분을 여러번 한 결과로 나온 다차 도함수로부터 원래의 함수를 찾아내려면 여러번 적분을 하는 다중 적분(multiple integration)이 필요함.
- 예를 들어 f(x,y)가 함수 F3(x,y)를 x로 한번 편미분한 후, y로 다시 편미분하여 나온 이차 도함수였다면 이 함수를 찾는 식은 다음과 같다.
- round^2(F3(x))/round(x)round(y) = f(x,y) <-> F3(x,y) = SSf(x,y)dxdy


```python
# 연습문제3
# 다음 부정적분을 구하라
# SSxyexp(x^2 + y^2)dxdy
```

## Sympy를 이용한 부정적분

#### 다음은 SymPy의 integrate 명령으로 부정적분을 하는 예제이다. 상수항은 반환하지 않는다.


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


```python
x = sympy.symbols('x')
f = x * sympy.exp(x) + sympy.exp(x)
f
```




$$x e^{x} + e^{x}$$




```python
sympy.integrate(f)
```




$$x e^{x}$$




```python
x, y = sympy.symbols('x y')
f = 2 * x + y
sympy.integrate(f, x)
```




$$x^{2} + x y$$




```python
# 연습문제4
# 지금까지 구한 연습 문제의 답을 Sympy를 사용하여 구하라
```


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

# 1번 
x, y = sympy.symbols('x y')
f = 3* x ** 2
sympy.integrate(f, x)
```




$$x^{3}$$




```python
# 1.2번
f = 3*x**2 - 6*x + 1
sympy.integrate(f, x)
```




$$x^{3} - 3 x^{2} + x$$




```python
f = 2+6*x + 4*sympy.exp(x) + 5/x
sympy.integrate(f, x)
```




$$3 x^{2} + 2 x + 4 e^{x} + 5 \log{\left (x \right )}$$




```python
f = 2*x / x ** 2 - 1
sympy.integrate(f, x)
```




$$- x + 2 \log{\left (x \right )}$$




```python
f = 1 + x*y
sympy.integrate(f, x)
```




$$\frac{x^{2} y}{2} + x$$




```python
f = x*y*sympy.exp(x**2 + y**2) 
sympy.integrate(f, x)
```




$$\frac{y}{2} e^{x^{2} + y^{2}}$$




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

f = x*y*sympy.exp(x**2 + y**2)
sympy.integrate(f, x, y)
```




$$\frac{1}{4} e^{x^{2} + y^{2}}$$



## 정적분(Definite integral)

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


```python
# 정적분
```


```python
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.plot(x, y, 'r', linewidth=2)
plt.ylim(ymin=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([])

plt.show()
```

- 정적분은 얼핏 미분과 아무런 상관이 없어 보이지만 부정적분으로 구한 함수 F(x)를 이용하면 다음처럼 정적분의 값을 구할 수 있다. 이를 **미적분학의 기본 정리(Fundamental Theorem of Calculus)**라고 부른다.
$\int_a^b f(x)dx$
- $\int_a^b f(x)dx$ = F(b) - F(a)

- 정적분은 SymPy등으로 부정적분을 한 뒤 미적분학의 기본 정리를 사용하여 푸는 방법과 원래 함수의 면적 부분을 실제로 잘개 쪼개어 면적을 근사하게 구하는 수치적 부정적분방법으로 구할 수 있다.
- 예를 들어 다음 정적분을 구하는 문제를 생각하자.
$\int_2^0 (x^3 - 3x^2+x+6)dx$

#### 부정 적분


```python
x, y = sympy.symbols('x y')
f = x**3 - 3*x**2+x+6
F = sympy.integrate(f)
F
```




$$\frac{x^{4}}{4} - x^{3} + \frac{x^{2}}{2} + 6 x$$



#### 정적분


```python
(F.subs(x, 2) - F.subs(x, 0)).evalf()
```




$$10.0$$



## 수치적분

- 수치 적분은 함수를 아주 작은 구간으로 나누어 실제 면적을 계산함으로써 정적분의 값을 구하는 방법이다. Scipy의 integrate서브 패키지의 quad(적분), dblquad(이중적분), tplquad(삼중 적분) 함수 등은 수치 적분을 이용하여 정적분의 값을 계산한다.


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

sp.integrate.quad(f, 0, 2) # 수치 적분
```




$$\left ( 10.0, \quad 1.1102230246251565e-13\right )$$



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

- 연습 문제 5
- 다음 정적분의 값을 부정적분과 수치적분 두 가지 방법으로 구하라.
- $\int_0^1 (3x^2-6x+1)dx$


```python
# 부정적분 방법
import sympy
sympy.init_printing(use_latex='mathjax')

x = sympy.symbols('x')
f = 3*x**2 - 6*x + 1
F = sympy.integrate(f, x)
F

# F(x)까지는 찾음. 그 다음으로 대입

(F.subs(x, 1) - F.subs(x, 0)).evalf()
```




$$-1.0$$




```python
# 수치적분 방법
import sympy
sympy.init_printing(use_latex='mathjax')

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

sp.integrate.quad(f, 0, 1) # 함수
```




$$\left ( -1.0, \quad 1.3085085171449517e-14\right )$$



- 연습문제 5.2
- 부정적분과 수치적분 두 가지 방법으로 구하라.
- $\int_1^10 (2+6x+4e(x)+5/x)dx$



```python
# 부정적분
```


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

x = sympy.symbols('x')
f = 2 + 6*x + 4*sympy.exp(x) + 5 / x
F = sympy.integrate(f, x)

(F.subs(x, 10) - (F.subs(x, 1))).evalf(), f
```




$$\left ( 88421.502977378, \quad 6 x + 4 e^{x} + 2 + \frac{5}{x}\right )$$




```python
# 수치적분
def f(x):
    return 2 + 6*x + 4*sympy.exp(x) + 5 / x

sp.integrate.quad(f, 1, 10)
```




$$\left ( 88421.50297737827, \quad 1.5276890734473408e-06\right )$$



## 다변수 정적분

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

####  두 변수로 이중 적분하는 경우

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

- 수치 이중 적분을 하려면 Scipy의 integrate 서브패키지의 dblquad명령을 사용한다.
- 함수 사용법은 다음과 같다.
- dblquad(func, a, b, gfun, hfun)




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

sp.integrate.dblquad(f, 1, np.Inf, lambda x: 0, lambda x: np.inf)
```




$$\left ( 0.4999999999999961, \quad 1.068453874338024e-08\right )$$



#### 하나의 변수로 단일 적분하는 경우
- f(x,y)가 2차원 함수이지만 하나의 변수만 진짜 입력 변수로 보고 나머지 하나는 상수로 보는 방법이다.
- $\int_a^b f(x,y)dx$
- 예를 들어 다음과 같은 함수를 생각하자.
- f(x, y) = 4x^2 + 4xy + y^2
- 여기에서 변수 x만 진짜 입력 변수로 보고 y는 단순히 정해지지 않은 상수로 보면, 이 함수는 다음과 같은 1차원 함수이다. 
- 2차원 함수 f(x,y)를 y를 고정시켜 절단한 단면 함수로 볼 수 있다.
- y가 고정되어 있다는 것을 강조하기 위해 다음처럼 표기하기도 한다. 
- y가 변수가 아니라는 점을 강조하기 위해 함수 표기에서 쉼표가 아니라 세미콜런이 씌여졌다는 점에 주의하라.
- f(x;y) = 4x^2 + (4y)*x + (y^2)

#### 연습문제 6
다음 정적분의 값을 구하라
S1,-1S1,-1 (1 + xy) dxdy


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

x, y = sympy.symbols('x y')

def f(x,y):
    return 1 + x*y

sp.integrate.dblquad(f, -1, 1, lambda x: -1, lambda x: 1)
```




$$\left ( 4.0, \quad 4.440892098500626e-14\right )$$




```python

```

12af9fb8efb2e42f79bc3a9c7dad64a476bb2161
ipynb
Jupyter Notebook
2018_05_26_Integral_review.ipynb
jaykim-asset/datascience_review
c55782f5d4226e179088346da399e299433c6ca6
MIT
2018-05-30T10:39:47.000Z
2018-11-10T15:39:53.000Z
2018_05_26_Integral_review.ipynb
jaykim-asset/datascience_review
c55782f5d4226e179088346da399e299433c6ca6
MIT
2018_05_26_Integral_review.ipynb
jaykim-asset/datascience_review
c55782f5d4226e179088346da399e299433c6ca6
MIT
Qwen/Qwen-72B
1. YES
2. YES