내용
단순한 형태의 미분
예 1)
두 변수 y와 x의 관계를 나타낸 함수 $y = x^2$에 따르면 x가 증가하면 y 역시 증가합니다. 이 관계에서 두 변수 사이의 비율을 계산할 수 있습니다.
이 예제는 미분계수인 $\displaystyle \frac{dy}{dx}$의 값을 계산하는 것으로 x의 증가에 따라 식 1과 같이 표현할 수 있습니다.
$$\begin{align}\tag{1}y+dy&=(x+dx)^2\\&=x^2+2xdx+(dx)^2\end{align}$$dx는 변수 x의 작은 양이므로 위 식에서 $(dx)^2$는 작은 양들 사이의 곱이므로 다른 항에 비해 매우 작습니다. 즉, 이 항은 무시 가능하기 때문에 식 1은 식 2와 같이 정리됩니다.
$$\begin{align} \tag{2}y+dy&=x^2+2xdx\\dy&=2xdx\end{align}$$위 식2는 미세한 구간에서 x에 대한 y의 변화율을 나타내는 것으로 미분이라고 정의합니다. 다시말하면, 일반적인 미분의 정의인 식 3과 같이 나타낼 수 있습니다.
$$\begin{align} \tag{3}\frac{dy}{dx}&=2x\end{align}$$파이썬 sympy 패키지의 diff()
함수를 적용하여 다음과 같이 코드화 할 수 있습니다. 이 함수는 sympy객체.diff()
와 같이 메소드 형태로 적용할 수 있습니다.
x=symbols("x", real=True) y=x**2 diff(y)
2x
y.diff()
2x
x에 관한 다른 함수에 대해 생각해 봅니다. $$u=7x^2+3$$ 위 식의 x에 대한 u의 미분은 다음과 같이 나타낼 수 있습니다. $$\frac{du}{dx}=\frac{d(7x^2+3)}{dx}$$ 다음은 독립변수가 x가 아닌 t인 경우입니다. 즉, 다음식에서 t에 대한 y의 미분은 다음과 같이 나타낼 수 있습니다. $$\begin{align}y&=b+\frac{1}{2}t^2\\\frac{dy}{dt}&=\frac{d(b+\frac{1}{2}t^2)}{dt}\end{align}$$
예 1을 수치적으로 접근해 봅시다. 예를 들어 x=100일 때 y=10000이 됩니다. x의 증분 dx=1라면 y는 다음과 같습니다.
y1=101*101#y1=y+dy=(x+dx)2 y1
10201
위 결과에서 1은 전체값에 비해 작은 수이므로 무시할 수 있습니다. 그러므로 y=100200으로 dy=200이 됩니다. dy와 dx의 비율 즉, x에 관해 y의 미분은 다음과 같이 2x가 됩니다.
$$\frac{dy}{dx}=\frac{200}{1}=200=2x$$더 작은 수를 고려해 보기 위해 dx=0.1에서 미분을 계산해 봅니다.
x + dx = 100 + 0.1 = 100.1이므로 y는 다음과 같습니다.
y1=100.1*100.1 y1
10020.009999999998
위 결과에서 0.0099..는 전체 결과에서 매우 미미한 수준으로 무시할수 있기 때문에 y의 증분 dy=20으로 간주 할 수 있습니다. 그러므로 $\displaystyle \frac{dy}{dx}$는 다음과 같습니다.
dx, dy=symbols("dx, dy", real=True) f=dy/dx f$\quad \small{\color{blue}{\frac{dy}{dx}}}$
f.subs([(dx,0.1),(dy, 20)])
200.0
예 2)
예 1과 같은 방법으로 $y =x^3$을 미분해 봅니다.
위 식에서 (dx)2, (dx)3은 무시할 수 있습니다. 또한 y=x3이므로 다음과 같이 정리됩니다.
$$\frac{dy}{dx}=3x^2$$x=symbols("x", real=True) y=x**3 diff(y)
3x2
예 3)
y=x4을 미분해 봅니다.
위와 같이 고차 방정식을 전개하기 위해 sympy 패키지의 expand()
함수를 적용할 수 있습니다. 파이썬에서 곱셈과 거듭제곱은 각각 '*
'과 '**
'으로 표시됩니다.
x, dx=symbols("x, dx", real=True) f=(x+dx)**4 f$\quad \small{\color{blue}{\left(dx + x\right)^{4}}}$
expand(f)$\quad \small{\color{blue}{dx^{4} + 4 dx^{3} x + 6 dx^{2} x^{2} + 4 dx x^{3} + x^{4}}}$
위 식에서 (dx)의 거듭제곱과 관계된 항들은 매우 작은 값들이므로 무시할 수 있으므로 다음과 같이 정리할 수 있습니다.
$$y+dy=x^4+4x^3dx$$$y = x^4$이므로 이 식에서 x에 관한 y의 미분은 다음과 같습니다.
$$\frac{dy}{dx}=4x^3$$다음은 위 과정을 sympy함수들로 코드화한 것입니다.
x, dx=symbols("x, dx", real=True) y=Function('y')(x) diff(y)$\quad \small{\color{blue}{\frac{d}{d x} y{\left(x \right)}}}$
y1=x**4 y1.diff(x)
4x3
Eq(y.diff(), y1.diff())$\quad \small{\color{blue}{\frac{d}{d x} y{\left(x \right)} = 4 x^{3}}}$
sympy에서 적용된 식은 동차 방정식(Homogeneous equation)의 형태 즉, 좌항 또는 우항이 0인 형태이어야 합니다. 이것은 각 식에 대한 객체 이름을 설정하기 위해서 입니다. 예를 들어 y = x2와 같은 식을 sympy객체로 만들면 y는 x를 변수로 하는 객체 이름입니다. 그러므로 y의 미분 표현을 나타내기 위해서는 eq1 = y, eq2 = x2과 같이 별도의 객체로 만들어야 합니다. 사용자가 y의 미분 표현 $\frac{dy}{dx}$를 묵시적으로 사용한다면 실제 코딩에서는 객체 eq2 만을 실행합니다. 그러나 미분 과정을 나타낼 필요가 있을 경우는 별도로 작성하여야 합니다. 이 과정을 적용하여 위 코드를 설명하면 다음과 같습니다.
- 좌항과 우항을 별도의 함수로 설정
- 좌항 y는 종속변수이자 함수이므로 Function()함수로 선언
- 우항의 x는 독립변수이므로 symbols()함수로 선언
- 좌항과 우항을 각각 diff()를 적용하여 미분
- 각 미분항들을 Eq()함수를 사용하여 결합합니다.
다른 방법으로 $y = x^4$을 $0 = y − x^4$과 같이 전체적으로 동차식의 형태로 만들어 사용합니다.
x, dx=symbols("x, dx", real=True) y=Function('y')(x) eq=y-x**4 eq$\quad \small \color{blue}{- x^{4} + y{\left(x \right)}}$
eq.diff(x)$\quad \small \color{blue}{- 4 x^{3} + \frac{d}{d x} y{\left(x \right)}}$
위에서 소개한 예들의 결과를 요약해 보면 다음과 같습니다.
y | $\displaystyle \frac{dy}{dx}$ |
---|---|
$x^2$ | 2x |
$x^3$ | $3x^2$ |
$x^4$ | $4x^3$ |
미분 규칙을 $y = x^5$에 적용하면 다음과 같습니다.
$$\frac{dy}{dx}=5x^4$$x, dx=symbols("x, dx", real=True) f=(x+dx)**5 expand(f)$\quad \small{\color{blue}{dx^{5} + 5 dx^{4} x + 10 dx^{3} x^{2} + 10 dx^{2} x^{3} + 5 dx x^{4} + x^{5}}}$
위 결과에서 $dx^2$ 이상의 차원을 가진 항들을 모두 무시할 수 있으므로 정리하면 최종 결과는 $y + dy = 5dx⋅x^4 + x^5$이므로 $\frac{dy}{dx}=5x^4$입니다. 다음과 같이 코드화할 수 있습니다.
y=Function('y')(x) eq=y-x**5 eq.diff(x)$\quad \small{\color{blue}{- 5 x^{4} + \frac{d}{d x} y{\left(x \right)}}}$
음의 거듭제곱 형태의 미분
예 1에서 소개한 미분 과정을 식 $y = x^{-2}$에 적용하여 봅시다.
$$y+dy=(x+dx)^2$$위 식의 우항 같은 다항식의 전개를 위해 이항정리를 적용할 수 있습니다.
이항정리를 적용하여 dx의 거듭제곱을 포함된 항들을 제거하면 식 2와 같습니다.
$$\begin{align}\tag{2}(x+dx)^2&=x^{-2}+(-2)\frac{x^{-3}dx}{1!}+(-2)(-3)\frac{x^{-4}dx^{-2}}{-2!}+\cdots\\ &=x^{-2}+(-2)x^{-3}dx+6x^{-4}dx^{-2}+\cdots\\ &\cong x^{-2}+(-2)x^{-3}dx \end{align}$$y=x-2이므로 위 식으로 부터 x에 대한 y의 미분은 다음과 같습니다.
$$\frac{dy}{dx}=-2x^{-3}$$위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.
x=symbols("x") y=Function('y')(x) eq1=x**(-2) Eq(y.diff(),eq1.diff())$\quad \small{\color{blue}{\frac{d}{d x} y{\left(x \right)} = - \frac{2}{x^{3}}}}$
분수형태의 거듭제곱의 경우
거듭제곱인자가 분수인 경우도 이항정리를 적용하여 미분을 정리할 수 있습니다.
$$\begin{align}(x+dx)^{\frac{1}{n}}&=x^{\frac{1}{n}}+\frac{1}{n}\frac{x^{\frac{1}{n}-1}}{1!}+\frac{1}{n} \frac{1}{n-1}\frac{x^{\frac{1}{n}-2}}{2!}+ \cdots\\ &=x^{\frac{1}{n}}+\frac{1}{n}x^{\frac{1}{n}-1}dx \end{align}$$위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.
n, x=symbols("n, x") y=Function('y')(x) eq1=x**(1/n) y, eq1
(y(x), x**(1/n))
Eq(y.diff(),eq1.diff(x))$\quad \small{\color{blue}{\frac{d}{d x} y{\left(x \right)} = \frac{x^{\frac{1}{n}}}{n x}}}$
simplify(Eq(y.diff(),eq1.diff(x)))$\quad \small{\color{blue}{\frac{d}{d x} y{\left(x \right)} = \frac{x^{\frac{1 - n}{n}}}{n}}}$
위 코드의 마지막 명령인 simplify()
함수는 식을 보다 간단히 정리하기 위해 적용한 것입니다.
상수를 포함한 식의 미분
일반적으로 변수 x(독립변수)에 영향 받는 다른 변수 y(종속변수)의 관계를 나타낸 식에서 미분은 두 변수의 비율로 정의할 수 있습니다. 이러한 식에 독립변수와 관계 없지만 y에 영향을 주는 항 즉, 상수항이 포함여부는 그 비율에 양향을 주지 않습니다. 상수항은 변화될 수 없는 값이기 때문입니다. 어떠 함수에 상수항은 미분에 그 함수의 미분에 영향을 줄수 없음을 의미합니다.
x, dx, y, dy =symbols("x, dx, y, dy") f=y+dy f1=(x+dx)**3+5 F=Eq(f,f1) F$\quad \small{\color{blue}{dy + y = \left(dx + x\right)^{3} + 5}}$
expand(F)$\quad \small{\color{blue}{dy + y = dx^{3} + 3 dx^{2} x + 3 dx x^{2} + x^{3} + 5}}$
위 결과에서 dx의 거듭제곱을 포함한 모든 항들은 무시할 수 있으며 $y = x^3 + 5$을 고려해주면 다음과 같이 정리됩니다.
x=symbols("x") y=Function('y')(x) eq=x**3+5 F=Eq(y.diff(), eq.diff()) F$\quad \small{\color{blue}{\displaystyle \frac{d}{d x} y{\left(x \right)} = 3 x^{2}}}$
상수 곱
다음 식은 독립변수를 상수배한 형태입니다. $y = 7x^2$을 미분하면 다음과 같습니다.
x, dx, y, dy =symbols("x, dx, y, dy") f=y+dy f1=7*(x+dx)**2 F=Eq(f,f1) expand(F)$\quad \small \color{blue}{dy + y = 7 dx^{2} + 14 dx x + 7 x^{2}}$
위 결과에 $y = 7x^2,\, dy^2 = 0$를 대입하기 위해 .subs()메서드를 사용합니다.
F1=F.subs({y:7*x**2, dx**2:0}) F1$\quad \small \color{blue}{dy + 7 x^{2} = 7 \left(dx + x\right)^{2}}$
다음 단계로 위 결과를 dy에 의해 정리하기 위해 solve()
함수를 사용합니다.
위 결과를 정리하면 미분은 다음과 같습니다.
solve(F1, dy)
[7*dx*(dx + 2*x)]
(dx)2 ≈ 0으로 간주할 수 있으므로 최종적으로 위 결과는 다음과 같이 정리됩니다.
$$\frac{dy}{dx}=14x$$x의 각 값에 대한 y와 $\frac{dy}{dx}$의 변화를 다음 표에 나타내었습니다.
x | y | $\small \frac{dy}{dx}$ |
---|---|---|
1 | 7 | 14 |
2 | 28 | 28 |
3 | 63 | 42 |
4 | 112 | 56 |
5 | 175 | 70 |
-1 | 7 | -14 |
-2 | 28 | -28 |
-3 | 63 | -42 |
표 2의 (x, y), (x, $\frac{dy}{dx}$) 좌표는 각각 그림 1과 같이 그래프로 나타낼 수 있습니다. 즉, 그림 1의 각 점에의 곡선 기울기의 변화는 직선의 형태로 나타낼 수 있습니다. 즉, 일정한 비례 관계가 존재합니다. 그 결과인 직선과 곡선을 비교하면 x가 음수인 경우 곡선은 감소하는 모습을 보이며 $\frac{dy}{dx}$ 역시 음수임을 나타냅니다.
plt.figure(dpi=100) plt.plot(x, y, label=r"7$x^2$") plt.plot(x, dy, label=r"$\frac{dy}{dx}$") plt.axvline(x=0, linestyle="--", color='black') plt.xlabel("x", size=12, weight="bold") plt.ylabel("y", size=12, weight="bold") plt.legend(loc="best") plt.show()
상수에 의한 곱에 대한 미분은 미분 규칙의 확장으로 다음과 같이 계산됩니다.
$$\begin{align} \tag{3} y&=ax^n \\ \frac{dy}{dx}&=anx^{n-1} \end{align}$$위의 미분은 상수에 의한 곱 외에 나눗셈 역시 적용됩니다.
$y=\frac{1}{7}x^2$x =symbols("x") y=Rational('1/7')*x**2 y.diff()$\quad \small \color{blue}{\frac{2 x}{7}}$
위 코드에서 사용한 Rational()
함수는 인수로 전달한 분수 형태를 유지하므로 계산 결과 역시 분수 형태로 반환됩니다.
상수항과 상수에 의한 곱셈 등에 대한 몇 가지 예들을 고려해봅니다.
예 4)
다음 함수 y를 미분합니다.
x =symbols("x") f=x**5*Rational('1/7')-Rational('3/5') f.diff()$\quad \small \color{blue}{\frac{5}{7}x^4}$
예 5)
다음 무리수가 포함된 식을 미분 해봅니다.
a, x =symbols("a, x") f=a*sqrt(x)-Rational('1/2')*sqrt(a) f.diff(x)$\quad \small \color{blue}{\frac{a}{2 \sqrt{x}}}$
다음 식은 양함수 구조이므로 이 식의 미분은 하나의 변수 즉, y에 대해 식을 정리한 다음 미분을 실시합니다.
$$\begin{align} &ax+by=by-ax+(x+y)\sqrt{(a^2-b^2)}\\ &(a-b)y+(a+b)x=(x+y)\sqrt{(a^2-b^2)}\\ &(a-b+\sqrt{(a^2-b^2)})y=(\sqrt{a^2-b^2}-(a+b))x \end{align}$$위 식을 최종적으로 y로 정리하여 미분하면 다음과 같습니다.
$$\begin{align} &y=\frac{\sqrt{a^2-b^2}-(a+b)}{a-b+\sqrt{a^2-b^2}}x\\ &dy=\frac{\sqrt{a^2-b^2}-(a+b)}{a-b+\sqrt{a^2-b^2}}x^0dx\\ &\frac{dy}{dx}=\frac{\sqrt{a^2-b^2}-(a+b)}{a-b+\sqrt{a^2-b^2}} \end{align}$$위 과정은 sympy 함수 Eq()
등을 적용하여 다음과 같이 계산할 수 있습니다.
a, b, x, y =symbols("a, b, x, y") eq=a*y+b*x-(b*y-a*x+(x+y)*sqrt(a**2-b**2)) eq$\quad \small \color{blue}{ax + ay + bx - by - \sqrt{a^2 - b^2}(x + y)}$
eq=collect(eq, (x, y)) eq$\quad \small \color{blue}{x(a+b)+y(a−b)−\sqrt{a^2−b^2}(x+y)}$
위 코드에 입력한 식은 collect()
함수를 사용하여 지정한 변수 x, y에 의해 정리하였습니다. 위 eq를 y에 대해 정리하기 위해 solve()
함수를 사용합니다. 이 함수는 식에서 지정한 변수에 대한 해를 계산하는 것으로 위 식 eq에 대한 y의 해를 계산하는 것과 같습니다.
eq1=solve(eq, y) eq1$\quad \small \color{blue}{\left[\displaystyle \frac{x(a+b-\sqrt{a^2-b^2})}{-a+b+\sqrt{a^2-b^2}}\right]}$
최종적으로 eq1을 x에 관해 미분합니다.
print(diff(eq1[0], x))$\quad \small \color{blue}{\left[\displaystyle \frac{a+b-\sqrt{a^2-b^2}}{-a+b+\sqrt{a^2-b^2}}\right]}$
예 6)
반지름 r, 높이 h인 실린더의 부피는 $V = πr^2h$로 계산합니다. r = 5.5 in, h = 20 in일 경우 부피의 변화량을 계산합니다.
r,h =symbols("r,h") V=pi*r**2*h V$\quad \small \color{blue}{πhr^2}$
V1=diff(V,r) V1$\quad \small \color{blue}{2πhr}$
N(v1.subs([(r,5.5),(h, 20)]),4)
691.1
sympy와 numpy 등 파이썬에서 π는 pi
로 나타냅니다. 이러한 기호와 함수의 값을 평가하기 위해 N()
또는 .evalf()
를 적용합니다. 이 함수와 메서드에서는 유효숫자를 지정하여 표현되는 수의 형태를 조정할 수 있습니다.
pi$\quad \small \color{blue}{π}$
N(pi, 3)$\quad \small \color{blue}{3.14}$
pi.evalf(3)$\quad \small \color{blue}{3.14}$
r = h인 조건에서 반지름 1 in. 당 400 cm3의 변화가 일어나는 실린더의 차원을 계산해 봅니다.
v11=v1.subs(h,r) print(v11)$\quad \small \color{blue}{2πhr^2}$
sol=solve(Eq(v11, 400), r) sol$\quad \small \color{blue}{\left[\frac{-10 \sqrt{2}}{\sqrt{\pi}}\,\quad \frac{-10 \sqrt{2}}{\sqrt{\pi}}\right]}$
sol[1].evalf(3)$\quad \small \color{blue}{7.98}$
미분 식에 r = h인 조건을 충족시키기 위해 높이 h를 반지름 r로 치환했습니다. 이 때 변화율이 400 cm3이 될 때의 r값은 solve()
함수로 계산하였습니다. 그 결과는 반지름이므로 양의 값이 되어야 하므로 sol 중 두번째 값이 됩니다.
예 7)
Féry의 방사선 고온계는 다음 식과 같이 온도에 의해 값을 나타냅니다.
θ1는 알려진 온도 t1에 대응하는 방사선 고온계의 값입니다. 1000°C 일때 25라면 800°C, 1000°C, 1200°C 일때의 변화량을 계산해 봅시다.
theta1, t, t1 =symbols("theta1, t, t1") theta=Function("theta")(t) eq1=(t/t1)**4*theta1 eq1$\quad \small \color{blue}{\frac{t^4 \theta_1}{t^4_1}}$
Eq(theta, eq1)$\quad \small \color{blue}{\theta(t) =\frac{t^4 \theta_1}{t^4_1}}$
#계산에 필요한 부분은 우항 eq=eq1.subs({t1:1000, theta1:25}) eq$\quad \small \color{blue}{\frac{t^4}{40000000000}}$
dth=eq.diff(t) dth$\quad \small \color{blue}{\frac{t^3}{10000000000}}$
t_val=[800, 1000, 1200] re={} for i in t_val: re[i]=dth.subs(t, i).evalf(3) re
{800: 0.0512, 1000: 0.100, 1200: 0.173}
댓글
댓글 쓰기