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