기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

부분분수의 미분

내용

부분분수의 미분

분수의 미분은 일정한 공식을 적용하여 계산할 수 있습니다. 그러나 분수 자체가 단순한 표현으로 이루어지지 않았다면 미분 과정이나 결과는 매우 복잡할 수 있습니다. 만약 복잡한 분수 함수를 간단한 분수들로 분해할 수 있다면 계산이 보다 간편해질 것입니다. 이와 같이 분해된 간단한 분수들을 부분분수라고 합니다. 예를 들어 다음 두 분수의 합을 계산해 봅니다.

$$\begin{align} \frac{1}{x+1}+\frac{2}{x-1}&=\frac{x-1+2(x+1)}{(x+1)(x-1)}\\ &=\frac{3x+1}{x^2-1} \end{align}$$

위 과정은 3개 이상의 여러 분수에서도 이루어질 수 있습니다. 또한 역으로 진행될 수 있습니다. 즉, 분수를 부분 분수로 분할할 수 있습니다. 그러나 이러한 과정은 대수분수(분자의 가장 큰 차수가 분모의 최고의 차수보다 작은 분수)에서만 이루어질 수 있습니다. 예를 들어 $\displaystyle \frac {x^2+2}{x^2-1}$의 경우는 분자와 분모의 차수는 2차로 같습니다. 이러한 경우 다음과 같이 분리할 수 있습니다.

$$\frac{x^2+2}{x^2-1}=1+\frac{3}{x^2-1}$$

위의 식 중 $\displaystyle \frac{3}{x^2-1}$은 분자의 차수가 분모의 차수 보다 낮은 대수 분수이므로 부분 분수로 분리할 수 있습니다. 이와같이 부분 분수로 분해하는 방법은 다음과 같이 몇 가지로 구분할 수 있습니다.

방법 1

위 예의 결과 $\displaystyle \frac{3x+1}{x^2-1}$의 경우를 역으로 생각해 봅니다. 분모의 인수분해가 가능하면 그 분모의 인수에 의해 다음과 같이 분해할 수 있습니다.

$$\begin{align} \frac{3x+1}{x^2-1}&=\frac{3x+1}{(x+1)(x-1)}\\ &=\frac{A}{x+1}+\frac{B}{x-1} \end{align}$$

위 식에서 A, B는 임의 변수 또는 수 입니다. 이 상태에서 좌항과 우항이 같아지기 위해서는 우항을 통분한 분자와 좌항의 분자가 일치해야 합니다. 즉, 다음과 같은 방정식이 생성됩니다.

$$\begin{align} 3x+1&=A(x-1)+B(x+1)\\ &=(A+B)+(-A+B) \end{align}$$

위 식으로부터 A와 B에 관한 연립방정식이 성립됩니다.

$$\begin{align} A+B&=3\\ -A+B&=1\\ \rightarrow\; &A=1, \; B=2 \end{align}$$

위 결과를 대입하면 최종적으로 다음과 같이 분해됩니다.

$$\frac{3x+1}{x^2-1}=\frac{1}{x+1}+\frac{2}{x-1}$$

위의 연립방정식은 solve()에 의해 계산할 수 있습니다.

import numpy as np
import pandas as pd
from sympy import *
import matplotlib.pyplot as plt
A, B=symbols('A, B', real=True)
eq1=Eq(A+B, 3)
eq2=Eq(-A+B, 1)
solve([eq1, eq2],(A, B))
{A: 1, B: 2}

sympy에서는 분수 계산에 사용되는 다양한 함수들을 제공합니다. together() 함수는 두 개 이상의 분수를 통분한 상태를 반환합니다. 또한 이 통분된 분수의 분모와 분자는 각각 denom()numer()함수로 나타낼 수 있습니다. 이 함수들을 사용하여 A와 B를 계산할 수 있습니다.

A, B, x=symbols('A, B, x') 
eq1=A/(x+1) 
eq2=B/(x-1) 
eq3=together(eq1+eq2) 
eq3 
𝐴(x−1)+𝐵(x+1)(x−1)(x+1)
denom(eq3) #분모 
(x−1)(x+1)
numer(eq3) #분자
𝐴(x−1)+𝐵(x+1)
solve(Eq(numer(eq3), 3*x+1),(A, B))
{A: 1, B: 2}

apart()함수는 위와 같은 중간 과정 없이 직접적으로 부분분수를 반환합니다.

x=symbols('x')
eq1=(3*x+1)/(x**2-1)
eq=apart(eq1)
eq
$\quad \small \color{blue}{\frac{1}{x + 1} + \frac{2}{x - 1}}$

다른 예로 좀 더 복잡한 경우를 부분분수로 분해합니다. 이 식의 경우 역시 분자의 차수가 분모보다 낮은 대수 분수이기 때문에 부분분수로 분해가 가능합니다.

$$\begin{align} \frac{4x^2+2x-14}{x^3+3x^2-x-3} &=\frac{a}{x+3}+ \frac{b}{x-1}+ \frac{c}{x+1}\\ &=\frac{2}{x+3}+ \frac{3}{x-1}+ \frac{1}{x+1} \end{align}$$

위 식을 계산하는 과정은 다음 전개와 같이 분자들에 대한 방정식의 해를 구하는 과정입니다.

$$\begin{align} 4x^2+2x-14 & = a(x-1)(x+3) + b(x+1)(x+3) + c(x+1)(x-3)\\ 4 &= a + b + c\\ 2 &= 2a + 4b + c\\ -14 &= -3a + 3b - c\\ \rightarrow\; &a = 3,  b = -1,  c = 2 \end{align}$$

sympy 함수 apart()를 적용하여 계산할 수 있습니다.

A, B, C, x=symbols('A, B, C, x', real=True)
eq=(4*x**2+2*x-14)/(x**3+3*x**2-x-3)
apart(eq)
$\quad \small \color{blue}{\frac{2}{x + 3} + \frac{3}{x + 1} - \frac{1}{x - 1}}$

방법 2

부분분수로의 분해에서 분자의 최고차수는 분모의 차수보다 1차수 낮게 설정하여야 합니다. 방법 1의 경우 분해된 분수의 분모는 모두 1차이므로 분자는 상수입니다. 그러나 분모가 2차 이상을 포함하는 경우 분자는 한 차수 낮은 변수를 포함할 수 있으므로 이를 고려하여야 합니다. 다음 예의 경우 분해된 분수 중 하나의 분모는 2차입니다. 그러므로 분자는 A가 아니 Ax+B로 가정하여야 합니다.

$$\frac{-x^2-3}{(x^2+1)(x+1)}=\frac{Ax+B}{x^2+1}\frac{C}{x+1}$$
A, B, C, x=symbols('A, B, C, x', real=True) 
eq=(-x**2-3)/((x**2+1)*(x+1)) 
eq1=(A*x+B)/(x**2+1) 
eq2=C/(x+1) 
eq3=together(eq1+eq2) 
eq3
$\quad \small \color{blue}{\frac{C \left(x^{2} + 1\right) + \left(x + 1\right) \left(A x + B\right)}{\left(x + 1\right) \left(x^{2} + 1\right)}}$
numer(eq3)
$\quad \small \color{blue}{C \left(x^{2} + 1\right) + \left(x + 1\right) \left(A x + B\right)}$
numer(eq)#=numer(eq3)
$\quad \small \color{blue}{- x^{2} - 3}$

위 코드에서 객체 eq3과 eq의 분자는 동일해야 합니다. 그러므로 다음 코드와 같이 solve() 함수를 적용하여 각 계수를 계산합니다.

solve(Eq(numer(eq3), numer(eq)), (A, B,C))
{A: 1, B: -1, C: -2}

apart()함수를 사용하여 위와 같은 중간 과정 없이 직접적으로 부분분수를 계산할 수 있습니다.

apart(eq)
$\quad \small \color{blue}{\frac{x - 1}{x^{2} + 1} - \frac{2}{x + 1}}$

위에서 소개한 여러 예들의 경우 프로그램의 도움 없이 쉽게 계산할 수 있습니다. 그러나 다음에 나오는 예와 같이 분자에 전달하는 계수의 수가 증가할수록 계산은 복잡해집니다. 이러한 경우 프로그램 코딩에 의한 계산이 신속하고 정확해집니다.

$$\frac{x^3-2}{(x^2+1)(x^2+2)}=\frac{Ax+B}{x^2+1}+\frac{Cx+D}{x^2+2}$$
A, B, C, D, x=symbols('A, B, C, D,x', real=True) 
eq=(x**3-2)/((x**2+1)*(x**2+2)) 
eq1=(A*x+B)/(x**2+1) 
eq2=(C*x+D)/(x**2+2) 
eq3=together(eq1+eq2) 
eq3
$\quad \small \color{blue}{\frac{\left(x^{2} + 1\right) \left(C x + D\right) + \left(x^{2} + 2\right) \left(A x + B\right)}{\left(x^{2} + 1\right) \left(x^{2} + 2\right)}}$
solve(Eq(numer(eq3), numer(eq)), (A, B,C, D))
{A: -1, C: 2, B: -2, D: 2}
apart(eq)
$\quad \small \color{blue}{\frac{2 \left(x + 1\right)}{x^{2} + 2} - \frac{x + 2}{x^{2} + 1}}$

방법 3

부분분수로 분해할 경우 각 분모의 최고 차수가 다를 경우 모든 경우를 고려해야 합니다. 예를 들어 분모가 $(x-2)^2$일 경우 분해된 분수의 분모는 $(x-2)^2$와 $(x-2)$ 두 경우를 모두 고려해야 합니다.

$$\frac{3x^2-2x+1}{(x+1)^2(x-2)}= \frac{Ax+B}{(x+1)^2}+\frac{C}{(x+1)}+\frac{D}{x-2}$$

그러나 다음 식의 경우는 이 방법으로 부분분수를 계산할 수 없습니다.

A, B, C, D, x=symbols('A, B, C, D,x', real=True) 
eq=(3*x**2-2*x+1)/((x+1)**2*(x-2)) 
eq1=(A*x+B)/(x+1)**2 
eq2=C/(x+1) 
eq3=D/(x-2) 
eq4=together(eq1+eq2+eq3) 
eq4
$\quad \small \color{blue}{\frac{C \left(x - 2\right) \left(x + 1\right) + D \left(x + 1\right)^{2} + \left(x - 2\right) \left(A x + B\right)}{\left(x - 2\right) \left(x + 1\right)^{2}}}$
solve(Eq(numer(eq4), numer(eq)), (A, B, C, D))
{A: 2 - C, B: -C, D: 1}

위 코드의 결과는 A, B는 C에 의존함을 나타냅니다. 즉, 다양한 부분분수가 가능하므로 하나로 특정할 수 없습니다. 이것은 부분분수를 만들기 위한 과정에서 생성되는 연립방정식 내의 식의 수가 계수의 수보다 많기 때문입니다. 식이 복잡해 질수록 특정한 기호에 따라 정리할 필요가 있으며 어떤 차수의 계수를 알아낼 필요가 있습니다. 이러한 경우 sympy 함수 collect()coeff()를 사용합니다.

eq5=numer(eq4)-numer(eq) 
eq5
𝐶(x−2)(x+1)+𝐷(x+1)2−3x2+2x+(x−2)(𝐴x+𝐵)−1
eq6=collect(expand(eq5), x)
eq6
−2𝐵−2𝐶+𝐷+𝑥^2(𝐴+𝐶+𝐷−3)+𝑥(−2𝐴+𝐵−𝐶+2𝐷+2)−1
eq6.coeff(x, 0)
−2𝐵−2𝐶+𝐷−1
eq6.coeff(x, 1)
−2𝐴+𝐵−𝐶+2𝐷+2
eq6.coeff(x, 2)
𝐴+𝐶+𝐷−3

이 결과를 정리하면 다음과 같습니다.

$$\begin{align} A + C + D &= 3\\ -2A + B - C + 2D &= -2\\ -2C + D &= 1 \end{align}$$

위 결과와 같이 분자들로부터 생성되는 연립 방정식의 계수의 수가 식의 수보다 많기 때문에 각 계수들의 수를 특정할 수 없기 때문에 연립방정식의 계수와 식을 맞추기 위해 다음과 같이 수정하여 다시 실행해봅니다.

eq=(3*x**2-2*x+1)/((x+1)**2*(x-2))
eq1=A/(x+1)**2
eq2=B/(x+1)
eq3=C/(x-2)
eq4=together(eq1+eq2+eq3)
eq4
$\quad \small \color{blue}{\frac{A \left(x - 2\right) + B \left(x - 2\right) \left(x + 1\right) + C \left(x + 1\right)^{2}}{\left(x - 2\right) \left(x + 1\right)^{2}}}$
solve(Eq(numer(eq4), numer(eq)), (A, B, C))
{A: -2, B: 2, C: 1}

apart()함수를 사용한 결과와 비교해 봅니다.

apart(eq)
$\quad \small \color{blue}{\frac{2}{x + 1} - \frac{2}{\left(x + 1\right)^{2}} + \frac{1}{x - 2}}$

다음 식의 경우 역시 세 개의 부분 분수로 분해됩니다. 분자의 차수를 고려할 때 대응하는 분모를 전개한 상태에서 최고 차수가 아니라 그 인수 자체의 차수를 고려합니다. 다음 식에서 분모 $(2x^2-1)^2$의 경우 4차가 아니라 2차로 고려하여 분자를 Ax+B로 가정합니다. $$frac{3x-1}{(2x^2-1)^2(x + 1)}=\frac{Ax+B}{(2x^2-1)^2}+\frac{Cx+D}{2x^2-1}+\frac{E}{x + 1}$$

together(), collect() 함수와 메서드 coeff()를 사용하여 연립 방정식을 생성해 봅니다.

A, B, C, D, E, x=symbols('A, B, C, D, E, x', real=True) 
eq=(3*x-1)/((2*x**2-1)**2*(x+1)) 
eq1=(A*x+B)/(2*x**2-1)**2 
eq2=(C*x+D)/(2*x**2-1) 
eq3=E/(x+1) 
#분해된 식들(eq1, eq2, eq3)을 통분  
eq4=together(eq1+eq2+eq3) 
#eq4의 분자를 모두 전개 
eq4_nu=expand(numer(eq4)) 
#전개한 식을 x의 차수에 따라 정렬  
eq4_nuCo=collect(eq4_nu, x) 
eq4_nuCo
$\quad \small \color{blue}{B - D + E + x^{4} \left(2 C + 4 E\right) + x^{3} \left(2 C + 2 D\right) + x^{2} \left(A - C + 2 D - 4 E\right) + x \left(A + B - C - D\right)}$ #각 차수에 대응하는 계수들을 분리
coef={} 
for i in range(5): 
    coef[i]=eq4_nuCo.coeff(x, i) 
coef
{0: B - D + E,
 1: A + B - C - D,
 2: A - C + 2*D - 4*E,
 3: 2*C + 2*D,
 4: 2*C + 4*E}
numer(eq)
3𝑥−1

위 결과를 정리하면 다음과 같습니다.

$$\begin{align} B - D + E &= 0\\ A + B - C - D & = 3\\ A - C + 2D - 4E &= 0\\ 2C + 2D &= 0\\ 2C + 4E &= 0 \end{align}$$

위에서 생성한 연립 방정식을 계산하는 대신 통분한 식의 분자와 원래의 식의 분자가 같음을 이용하여 solve()함수로 각 계수를 계산할 수 있습니다.

sol=solve(Eq(numer(eq4), numer(eq)), (A, B, C,D, E))
sol
{A: 8, B: -5, C: 8, D: -8, E: -4}

복잡한 분수의 부분 분수의 실행은 그 분수를 미분하는 데 매우 유리합니다. 위의 마지막 예의 경우 원래식을 미분하는 것은 매우 번거로운 계산이 요구됩니다. 대신에 부분 분수로 분해한 결과의 미분은 그러한 번거로움을 상당 부분 피할 수 있습니다. 예의 원래의 함수를 미분한 결과와 apart()함수에 의해 분해한 부분 분수를 미분한 결과를 비교해 보면 다음 코드와 같이 동일함을 알 수 있습니다.

x=symbols('x') 
eq=(3*x-1)/((2*x**2-1)**2*(x+1)) 
eq
$\quad \small \color{blue}{\frac{3 x - 1}{\left(x + 1\right) \left(2 x^{2} - 1\right)^{2}}}$
deq=eq.diff(x)
deq
$\quad \small \color{blue}{- \frac{8 x \left(3 x - 1\right)}{\left(x + 1\right) \left(2 x^{2} - 1\right)^{3}} }$
re=together(deq) 
re
$\quad \small \color{blue}{\frac{- 8 x \left(x + 1\right) \left(3 x - 1\right) + 3 \left(x + 1\right) \left(2 x^{2} - 1\right) - \left(3 x - 1\right) \left(2 x^{2} - 1\right)}{\left(x + 1\right)^{2} \left(2 x^{2} - 1\right)^{3}}}$
eq2=apart(eq) 
eq2 
$\quad \small \color{blue}{\frac{8 \left(x - 1\right)}{2 x^{2} - 1} + \frac{8 x - 5}{\left(2 x^{2} - 1\right)^{2}} - \frac{4}{x + 1}}$
deq2=eq2.diff(x) 
deq2
$\quad \small \color{blue}{- \frac{32 x \left(x - 1\right)}{\left(2 x^{2} - 1\right)^{2}} - \frac{8 x \left(8 x - 5\right)}{\left(2 x^{2} - 1\right)^{3}} + \frac{8}{2 x^{2} - 1} + \frac{8}{\left(2 x^{2} - 1\right)^{2}} + \frac{4}{\left(x + 1\right)^{2}}}$
re2=together(deq2) 
re2
$\quad \small \color{blue}{\frac{4 \left(- 8 x \left(x - 1\right) \left(x + 1\right)^{2} \left(2 x^{2} - 1\right) - 2 x \left(x + 1\right)^{2} \left(8 x - 5\right) + 2 \left(x + 1\right)^{2} \left(2 x^{2} - 1\right)^{2} + 2 \left(x + 1\right)^{2} \left(2 x^{2} - 1\right) + \left(2 x^{2} - 1\right)^{3}\right)}{\left(x + 1\right)^{2} \left(2 x^{2} - 1\right)^{3}}}$
#re, re2의 분자를 변수 x의 차수에 따라 정리 
collect(expand(numer(re)),x)
$\quad \small \color{blue}{- 24 x^{3} - 8 x^{2} + 8 x - 4}$
collect(expand(numer(re2)), x)
$\quad \small \color{blue}{- 24 x^{3} - 8 x^{2} + 8 x - 4}$

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b