scipy, sympy를 이용한 미적분 기초학습

2019-01-30

.

그림, 실습코드 등 학습자료 출처 : https://datascienceschool.net

미분기초

import sympy
from scipy.misc import derivative
sympy.init_printing(use_latex='mathjax')

기본 미분공식

  1. \(x^3\) -> 미분 -> \(3x^2\)

  2. \(x^2\) -> 미분 -> 2x

  3. x -> 미분 -> 1

  4. 상수 -> 미분 -> 0

  5. \(x^{-1}\) -> 미분 -> \(\dfrac{1}{x^2}\)

  6. \(x^{-2}\) -> 미분 -> \(\dfrac{2}{x^3}\)

  7. log x -> 미분 -> \(\dfrac{1}{x}\)

  8. exp -> 미분 -> exp

연쇄법칙의 예 : 로그함수의 미분

로그 함수에 연쇄법칙을 적용하면 다음과 같은 규칙을 얻을 수 있다.

\[\dfrac{d}{dx} \log f(x) = \dfrac{f'(x)}{f(x)}\]

다음 함수를 미분하시오.

  • 이식에서 k, a, b는 변수가 아니라 상수임

1번문제 \(f(x) = x^3 - 1\)

f2 = x**3 -1
sympy.diff(f2)
\[3 x^{2}\]

2번문제 \(f(x) = \log (x^{2}-3k)\)

x, k = sympy.symbols('x k')
f3 = sympy.log(x**2-3*k)
sympy.diff(f3, x)
\[frac{2 x}{- 3 k + x^{2}}\]

3번문제 \(f(x) =\exp({ax^b})\)

a,b,x = sympy.symbols('a b x')
f4 = sympy.exp(a*x**b)
sympy.diff(f4, x)
\[\frac{a b}{x} x^{b} e^{a x^{b}}\]

step1) \(\ f(g(x))\) 형태임을 파악할 수 있다.

step2) \(\ f(g(x))\) = \(\ f'(g(x)) * g'(x)\) 임을 알 수 있다.

step3) \(\ \exp({ax^b})\) * \(\ bax^{b-1}\) 을 구할 수 있다.

4번문제 \(\ f = \exp \dfrac{(x-\mu)^2}{\sigma^2}\)

s,m = sympy.symbols('sigma mu')
f5 = sympy.exp( (x-m)**2 / s**2 )
sympy.diff(f5,x)
\[\frac{1}{\sigma^{2}} \left(- 2 \mu + 2 x\right) e^{\frac{1}{\sigma^{2}} \left(- \mu + x\right)^{2}}\]

step1) \(\ f = \exp(z) \;,\;\;\;\; z = \dfrac{y^2}{\sigma^2} \;,\;\;\;\; y = x-\mu\) 형태임을 파악할 수 있다.

step2) 연쇄법칙을 적용해서 다음과 같은 형태로 계산할 것이다.

\[\ \dfrac{df}{dx} = \dfrac{df}{dz} \cdot \dfrac{dz}{dy} \cdot \dfrac{dy}{dx}\]

step3) f,z,y를 아래와 같이 쪼갤 수 있다.

\[\ \dfrac{df}{dz} = \exp(z) = \exp \dfrac{(x-\mu)^2}{\sigma^2}\] \[\ \dfrac{dz}{dy} = \dfrac{2y}{\sigma^2} = \dfrac{2(x-\mu)}{\sigma^2}\] \[\ \dfrac{dy}{dx} = 1\]

step4)최종적으로 아래와 같은 도함수를 구할 수 있다.

\[\ \dfrac{df}{dx} = \dfrac{2(x-\mu)}{\sigma^2} \exp \dfrac{(x-\mu)^2}{\sigma^2}\]

미분 구하기

  • 다음 함수에 대한 1차/2차 편미분 \(\ f_x\) ,\(\ f_y\), \(\ f_{xx}\), \(\ f_{yy}\) , \(\ f_{xy}\), \(\ f_{yx}\) 를 구하라
\[\ f(x, y) = \exp{(x^2 + 2y^2)}\]

1) \(\ f_x\)

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

2) \(\ f_y\)

sympy.diff(f,y)
\[4 y e^{x^{2} + 2 y^{2}}\]

3) \(\ f_{xx}\)

sympy.simplify(sympy.diff(f,x,x))
\[\left(4 x^{2} + 2\right) e^{x^{2} + 2 y^{2}}\]

4) \(\ f_{xy}\)

sympy.diff(f,x,y)
\[8 x y e^{x^{2} + 2 y^{2}}\]

5) \(\ f_{yx}\)

sympy.diff(f,y,x)
\[8 x y e^{x^{2} + 2 y^{2}}\]

6) \(\ f_{yy}\)

sympy.diff(f,y,y)
\[4 \left(4 y^{2} + 1\right) e^{x^{2} + 2 y^{2}}\]

7) \(\ f_{xx}\)

sympy.diff(f,x,x)
\[2 \left(2 x^{2} + 1\right) e^{x^{2} + 2 y^{2}}\]

step1) \(\ 2 x e^{x^{2} + 2 y^{2}}\) 를 미분하면 된다.

step2) \(\ 2 x e^{x^{2} + 2 y^{2}}\) 는 2x * \(\ e^{x^{2} + 2 y^{2}}\) 형태이다

step3) 이는 2x * \(\ f(g(x))\) 형태이다.

step4) 따라서 곱셈법칙을 적용하여 아래와 같이 표현할 수 있다.

2 * \(\ e^{x^{2} + 2 y^{2}}\) + \(\ e^{x^{2} + 2 y^{2}}\) \(\ * 2x\)

step5) 위 식에서 +를 기준으로 오른쪽에 \(\ e^{x^{2} + 2 y^{2}}\) \(\ * 2x\) 에서 \(\ e^{x^{2} + 2 y^{2}}\) 을 미분해야 한다. 미분한 결과는 아래와 같다.

\(\ 2x *\) \(\ e^{x^{2} + 2 y^{2}}\) \(\ * 2x\)

step6) 따라서 step4)에서 곱셈법칙을 적용한 식을 아래와 같이 표현할 수 있다.

2 * \(\ e^{x^{2} + 2 y^{2}}\) + \(\ 4x^2e^{x^{2} + 2 y^{2}}\)

step7) 소인수 분해하면 위와 같은 정답이 나온다.

적분기초

  • 적분의 표기는 아래와 같다.
\[\ \dfrac{dF(x)}{dx} = f(x) \;\;\leftrightarrow\;\; F(x) = \int_{}^{} f(x) dx + C\]

여기서 C는 상수항을 말하고 생략가능하다. 너무나도 당연하기 때문에

다음 부정적분을 구하시오.

1번문제 \(\ \int 3x^2 dx\)

f = 3*x**2
sympy.integrate(f, x)
\[x^{3}\]

2번문제 \(\ \int (3x^2 - 6x + 1)dx\)

f = 3*x**2 - 6*x + 1
sympy.integrate(f,x)
\[x^{3} - 3 x^{2} + x\]

3번문제 \(\ \int \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx\)

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 )}\]

4번문제 \(\ \int \frac{2x}{x^2 - 1} dx\)

f = 2*x / (x**2 - 1)
sympy.integrate(f,x)
\[\log{\left (x^{2} - 1 \right )}\]
  • 편미분의 부정적분

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

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

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

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

다음 부정적분을 구하시오.

1) \(\ \int \left( 1 + xy \right) dx\)

x로 적분했을때

f = 1 + x*y
sympy.integrate(f,x)
\[\frac{x^{2} y}{2} + x\]

y로 적분했을때

f = 1 + x*y
sympy.integrate(f,y)
\[\frac{x y^{2}}{2} + y\]

2) \(\ \int xy\exp({x^2 + y^2}) dx\)

x로 적분했을때

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

y로 적분했을때

f = x*y*sympy.exp(x**2 + y**2)
sympy.integrate(f,y)
\[\frac{x}{2} e^{x^{2} + y^{2}}\]
  • 다차 도함수와 다중적분

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

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

이 이차 도함수에서 원래의 함수를 찾으려면 y로 적분한 후 다시 x로 적분해야 한다. 식으로 표현하면 다음과 같다.

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

다음 부정적분을 구하시오.

\[\ \iint xy \exp({x^2 + y^2}) dxdy\]
f = x*y*sympy.exp(x**2 + y**2)
sympy.integrate(f,x,y)
\[\frac{1}{4} e^{x^{2} + y^{2}}\]

정적분

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

\[\ \int_{a}^{b} f(x) dx\]

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

\[\ \int_{a}^{b} f(x) dx = F(b) - F(a)\]

이를 미적분학의 기본정리라고 부른다.

예시문제) 다음 정적분을 구해보자

\[\ \int_0^2 ( x^3 - 3x^2 + x + 6) dx\]

step1) 함수를 표현한다.

x, y = sympy.symbols('x y')
f = x ** 3 - 3 * x ** 2 + x + 6
f
\[x^{3} - 3 x^{2} + x + 6\]

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

F = sympy.integrate(f)
F
\[\frac{x^{4}}{4} - x^{3} + \frac{x^{2}}{2} + 6 x\]

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

subs => 변수 대신 특정 숫자를 입력하여 연산을 유도함

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

수치적분

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

다변수 정적분

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

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

영역 아래의 부피 = \(\ \int_{y=c}^{y=d} \int_{x=a}^{x=b} f(x, y) dx dy\)

다차원 함수의 단일 정적분

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

\[\ \int_a^b f(x, y) dx\]

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

\[\ f(x, y) = 4x^2 + 4xy + y^2\]

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

\[\ f(x; y) = 4x^2 + (4y)x + (y^2)\]

y의 앞에 쉼표가 아니라 세미콜론을 써서 y가 변수가 아니라는 점을 강조하였다.

  • 정적분 연습문제 : 아래의 식을 정적분 하시오

범위 x는 1부터 10

\[\ \int \left( 2 + 6x + 4\exp(x) + \dfrac{5}{x} \right) dx\]
x, y = sympy.symbols('x y')
f = 2+ 6*x + 4*sympy.exp(x) + 5/x
f
\[6 x + 4 e^{x} + 2 + \frac{5}{x}\]
F = sympy.integrate(f)
F
\[3 x^{2} + 2 x + 4 e^{x} + 5 \log{\left (x \right )}\]
(F.subs(x, 10) - F.subs(x, 1)).evalf()
\[88421.502977378\]

용어정리

  1. 손실함수 : 모수를 입력받아 오차 혹은 오류의 크기를 출력하는 함수로, 결과 최소화를 목표로한다.

  2. 연쇄법칙 : \(\ f(x) = h(g(x))\) 의 형태를 지니며, 미분하려는 함수의 입력 변수가 다른 함수의 출력 변수인 경우 적용할 수 있는 미분공식이다.

  3. 2차 도함수 : 도함수를 한 번 더 미분하여 만들어진 함수를 2차 도함수라고 한다.

  4. 정적분 : 독립변수 x가 어떤 구간 [a,b]사이일 때 그 구간에서 함수 \(\ f(x)\)의 값과 수평선(x축)이 이루는 “면적”을 구하는 행위나 그 값을 말한다.

  5. 미분학의 기본정리 : 함수 \(\ F(x)\)를 이용하면 아래 식처럼 정적분의 값을 구할 수 있는데, 이를 미적분학의 기본정리라고 한다.

\[\ \int_a^b f(x)dx = F(b) - F(a)\]

연습문제

1번문제) 함수 \(\ f(x, y) = x^3 + 3xy^2 + y^2\)를 x,y로 편미분한 값을 구하시오.

1) \(\ f_x\)

x, y = sympy.symbols('x y')
f = x**3+3*x*y**2+2*y**2
sympy.diff(f,x)
\[3 x^{2} + 3 y^{2}\]

2) \(\ f_{xx}\)

sympy.diff(f,x,x)
\[6 x\]

3) \(\ f_{xy}\)

sympy.diff(f,x,y)
\[6 y\]

4) \(\ f_{y}\)

sympy.diff(f,y)
\[6 x y + 4 y\]

5) \(\ f_{yy}\)

sympy.diff(f,y,y)
\[2 \left(3 x + 2\right)\]

6) \(\ f_{yx}\)

sympy.diff(f,y,x)
\[6 y\]

2번문제) \(\ \int_0^3 (3x^2-6x+1)dx\)의 결과를 정적분으로 구하시오.

step1) \(\ \int_a^b f(x)dx = F(b) - F(a)\) 의 형태로 변환

a = 0 b = 3

\[\ f(x) = 3x^2-6x+1\] \[\ F(x) = x^3-3x^2+x\]

step2) \(\ \int_0^3 (3x^2-6x+1)dx = F(3) - F(0)\) = 3