scipy, sympy를 이용한 미적분 기초학습
.
그림, 실습코드 등 학습자료 출처 : https://datascienceschool.net
미분기초
import sympy
from scipy.misc import derivative
sympy.init_printing(use_latex='mathjax')
기본 미분공식
-
\(x^3\) -> 미분 -> \(3x^2\)
-
\(x^2\) -> 미분 -> 2x
-
x -> 미분 -> 1
-
상수 -> 미분 -> 0
-
\(x^{-1}\) -> 미분 -> \(\dfrac{1}{x^2}\)
-
\(x^{-2}\) -> 미분 -> \(\dfrac{2}{x^3}\)
-
log x -> 미분 -> \(\dfrac{1}{x}\)
-
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)
2번문제 \(f(x) = \log (x^{2}-3k)\)
x, k = sympy.symbols('x k')
f3 = sympy.log(x**2-3*k)
sympy.diff(f3, x)
3번문제 \(f(x) =\exp({ax^b})\)
a,b,x = sympy.symbols('a b x')
f4 = sympy.exp(a*x**b)
sympy.diff(f4, x)
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)
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}\) 를 구하라
1) \(\ f_x\)
x, y = sympy.symbols('x y')
f = sympy.exp(x**2 + 2*y**2)
sympy.diff(f,x)
2) \(\ f_y\)
sympy.diff(f,y)
3) \(\ f_{xx}\)
sympy.simplify(sympy.diff(f,x,x))
4) \(\ f_{xy}\)
sympy.diff(f,x,y)
5) \(\ f_{yx}\)
sympy.diff(f,y,x)
6) \(\ f_{yy}\)
sympy.diff(f,y,y)
7) \(\ f_{xx}\)
sympy.diff(f,x,x)
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) 소인수 분해하면 위와 같은 정답이 나온다.
적분기초
- 적분의 표기는 아래와 같다.
여기서 C는 상수항을 말하고 생략가능하다. 너무나도 당연하기 때문에
다음 부정적분을 구하시오.
1번문제 \(\ \int 3x^2 dx\)
f = 3*x**2
sympy.integrate(f, x)
2번문제 \(\ \int (3x^2 - 6x + 1)dx\)
f = 3*x**2 - 6*x + 1
sympy.integrate(f,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)
4번문제 \(\ \int \frac{2x}{x^2 - 1} dx\)
f = 2*x / (x**2 - 1)
sympy.integrate(f,x)
- 편미분의 부정적분
만약 \(\ 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)
y로 적분했을때
f = 1 + x*y
sympy.integrate(f,y)
2) \(\ \int xy\exp({x^2 + y^2}) dx\)
x로 적분했을때
f = x*y*sympy.exp(x**2 + y**2)
sympy.integrate(f,x)
y로 적분했을때
f = x*y*sympy.exp(x**2 + y**2)
sympy.integrate(f,y)
- 다차 도함수와 다중적분
미분을 여러번 한 결과로 나온 다차 도함수로부터 원래의 함수를 찾아내려면 여러번 적분을 하는 다중적분이 필요하다.
예를 들어 \(\ 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)
정적분
정적분은 독립변수가 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
step2) 우선 부정적분 방법으로 미분하기전의 함수를 구한다.
F = sympy.integrate(f)
F
step3) 구해진 미분하기 전의 함수에 정적분 구간을 넣어 값을 계산한다. 심볼릭 함수의 변수에 실제 숫자를 넣어서 함수의 값을 계산하려면 subs, evalf 메서드를 이용한다.
subs => 변수 대신 특정 숫자를 입력하여 연산을 유도함
(F.subs(x, 2) - F.subs(x, 0)).evalf()
수치적분
수치적분은 함수를 아주 작은 구간으로 나누어 실제 면적을 계산함으로써 정적분의 값을 구하는 방법이다. 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
F = sympy.integrate(f)
F
(F.subs(x, 10) - F.subs(x, 1)).evalf()
용어정리
-
손실함수 : 모수를 입력받아 오차 혹은 오류의 크기를 출력하는 함수로, 결과 최소화를 목표로한다.
-
연쇄법칙 : \(\ f(x) = h(g(x))\) 의 형태를 지니며, 미분하려는 함수의 입력 변수가 다른 함수의 출력 변수인 경우 적용할 수 있는 미분공식이다.
-
2차 도함수 : 도함수를 한 번 더 미분하여 만들어진 함수를 2차 도함수라고 한다.
-
정적분 : 독립변수 x가 어떤 구간 [a,b]사이일 때 그 구간에서 함수 \(\ f(x)\)의 값과 수평선(x축)이 이루는 “면적”을 구하는 행위나 그 값을 말한다.
-
미분학의 기본정리 : 함수 \(\ F(x)\)를 이용하면 아래 식처럼 정적분의 값을 구할 수 있는데, 이를 미적분학의 기본정리라고 한다.
연습문제
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)
2) \(\ f_{xx}\)
sympy.diff(f,x,x)
3) \(\ f_{xy}\)
sympy.diff(f,x,y)
4) \(\ f_{y}\)
sympy.diff(f,y)
5) \(\ f_{yy}\)
sympy.diff(f,y,y)
6) \(\ f_{yx}\)
sympy.diff(f,y,x)
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