기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

결합함수의 미분

내용

함수들의 합과 차

두 개 이상으로 구성된 함수의 합에 대해 미분을 고려해 봅니다. 먼저 간단한 예로 다음 식의 미분을 계산합니다.

y=(x2+c)+(ax4+b)dydx=2x+4ax3
x, a, b, c =symbols("x, a, b, c")
y=(x**2+c)+(a*x**4+b)
y
ax4+b+c+x2
diff(y, x)
4ax3+2x

위 과정은 미분 개념을 적용하여 계산한 것입니다. 이를 응용하여 특정한 부분을 새로운 변수로 치환하는 방법을 적용해 봅니다. 먼저 위 식의 우항들을 다음과 같이 치환합니다.

x2+c=uax4+b=vy=u+v

위 식의 치환된 각항은 x로 구성되어 있음으로 이 식의 최종 미분인 dydx와 u와 v의 미분 관계를 식 1과 같이 정의할 수 있습니다.

(1)dydx=dudx+dvdx=d(x2+c)dx+d(ax4+b)dx=2x+4ax

위 치환 과정을 코드화하면 다음과 같습니다.

x, a, b, c =symbols("x, a, b, c") 
u=Function('u')(x)   #(1)
v=Function('v')(x)   #(2)
eq_u=u-x**2+c 
eq_u
c-x2+u(x)
eq_v=v-(a*x**4+b)
eq_v
-ax4-b+v(x)
eq_u.diff(x)
2x+du(x)dx
eq_v.diff(x)
4ax3+dv(x)dx

위코드에서 u.diff(), v.diff()의 결과인 (Derivative(u(x), x), Derivative(v(x), x))는 각각 du(x)dx,dv(x)dx를 나타냅니다. 그러므로 다음과 같이 정리됩니다.

solve(eq_u.diff(x)+eq_v.diff(x), u.diff()+v.diff())
[4*a*x**3 + 2*x]

위의 코드 (1)과 (2)는 치환 함수를 명시하기 위해 정의하였습니다. 코드(3)은 두 치환 함수를 x에 관해 미분한 결과들의 합 du + dv을 표현한 것입니다.

위 과정은 2개 이상의 여러 개 함수들로 구성된 경우도 동일하게 적용할 수 있습니다. 3개의 함수들로 구성된 경우 각 항을 u, v, w로 치환하면 식 2와 같이 미분을 나타낼 수 있습니다.

(2)y=u±v±wdydx=dudx±dvdx±dwdx

함수들의 곱

함수들의 합과는 다르게 여러 함수의 곱일 경우는 단순히 치환된 함수들의 곱으로 처리될 수 없습니다. 즉, 치환된 함수 부분들을 독립적으로 미분할 수 없습니다. 예를 들어 식 y=(x2+c)(ax4+b)의 경우 합의 미분과 같이 우항의 두 부분을 독립적으로 미분할 수 없습니다.

다음 코드는 두 함수 u, v의 곱의 미분과 각 함수의 미분후 곱의 결과를 나타냅니다.

x, a, b, c =symbols("x, a, b, c")
u=x**2+c
v=a*x**4+b
y=u*v
y.diff(x)
4ax3(c+x2)+2x(ax4+b)
u.diff(x)*v.diff(x)
4ax3(4ax3(c+x2)+2x(ax4+b))

위 결과는 식 3과 같이 나타낼 수 있습니다.

(3)dydxdudxdvdx

두 함수의 곱의 미분은 다음과 같이 미분을 위한 함수외에는 상수항으로 간주하여 계산할 수 있습니다.

u*v.diff(x)+u.diff(x)*v
4ax3(c+x2)+2x(ax4+b)

위 과정을 정리하면 식 5와 같이 함수들의 곱에 대한 미분 법칙을 정리할 수 있습니다.

미분의 곱법칙 (5)y=uvdy=udv+duvdydx=udvdx+dudxv

함수들의 나눗셈

y=uv와 같이 분수형태의 함수를 미분은 식 6과 같이 전개됩니다.

(6)y=uvy+dy=u+duv+dv=(u+du)(vdv)(v+dv)(vdv)=uvudv+vdududvv2dv2=uv+duvudvv2dudv0,dv20

위 전개 과정의 최종 결과를 정리하면 분수 형태의 결합 함수에 대한 규칙(fraction rule)을 식 7과 같이 일반화할 수 있습니다.

분수의 미분규칙 (7)y=uvdydx=vduudvv21dx

다음 분수로 이루어진 함수 y를 미분하여 봅시다.

y=bx5+cx2+a

이 식의 분자와 분모를 각각 u와 v로 치환하여 계산하면 다음과 같습니다.

x, a, b, c=symbols("x, a, b, c")
y=(b*x**5+c)/(x**2+a)
v=denom(y)
v
a+x2
u=numer(y)
u
bx5+c
# 함수의 나눗셈 결과를 미분 
u_v=u/v
diff(u_v, x)
5bx4a+x22x(bx5+c)(a+x2)2
#분수의 미분규칙을 적용
(v*u.diff(x)-u*v.diff(x))/(v**2)
5bx4(a+x2)2x(bx5+c)(a+x2)2

위 코드에서 식 y와 같은 분수형태의 sympy 객체는 분자와 분모를 분리하여 호출할 수 있습니다. 각각 numer()denom() 함수를 사용합니다. 또한 위의 두 방법들의 각 결과를 비교하기 위해 통분할 수 있습니다. 이 경우 together()함수를 적용할 수 있습니다.

together(diff(u_v, x))
x(2bx5+5bx3(a+x2)2c)(a+x2)2
together((v*u.diff(x)-u*v.diff(x))/(v**2))
x(2bx5+5bx3(a+x2)2c)(a+x2)2

지수 형태의 미분

동일한 함수를 여러 번 곱하는 경우 지수 형태로 나타낼 수 있습니다. 예를 들어 함수 v=(3t21.2t+1)3의 경우 미분을 위해 두 가지 접근이 가능합니다. 먼저 우항을 전개하여 미분하는 방법입니다.

t=symbols("t")
v=(3*t**2-1.2*t+1)**3
v1=expand(v)
v1
27t632.4t5+39.96t423.328t3+13.32t23.6t+1
v1.diff(t)
162t5162.0t4+159.84t369.984t2+26.64t3.6

다음은 우항의 괄호내 함수를 치환하여 다음과 같이 계산할 수 있습니다.

u=3t21.2t+1dudx=6t1.2v=u3dvdu=3u2

위와 같이 치환한 함수들의 미분의 곱으로 다음과 같이 나타낼 수 있으며 연쇄법칙(Chain Rule)이라고 합니다.(식 8)

연쇄법칙 (8)dvdx=dvdududx
t, u=symbols("t, u")
u1=3*t**2-1.2*t+1
v=u**3
u1
3t21.2t+1
du1_dt=u1.diff(t)
du1_dt
6t1.2
dv_du=v.diff(u)
dv_du
3u2
dv_dt=dv_du*du1_dt
dv_dt
3u2(6t1.2)
dv_dt.subs(u, u1)
27(6t1.2)(t20.4t+13)2
expand(dv_dt.subs(u, u1))
162t5162.0t4+159.84t369.984t2+26.64t3.6

위 코드에서 expand()는 식을 전개하기 위해 사용할 수 있는 sympy 함수 입니다.

다양한 함수들의 미분 과정을 살펴봅시다.

예 1)
 다음 식은 변수에 대한 계수들이 분수 형태이므로 일반적인 미분 공식을 적용할 수 있습니다.

y=ab2xa2b+a2b2
x, a, b, c=symbols("x, a, b, c")
y=(a/b**2)*x**3-(a**2/b)*x+a**2/b**2
y.diff(x)
a2b+3ab2x2

예 2)
 다음 함수 y의 미분를 미분합니다.

y=2abx33ba3xabdydx=2abx3dx3ba3xdx=3abx+3ba3x2
xx, a, b=symbols("x, a, b")
y=2*a*sqrt(b*x**3)-3*b*a**(Rational('1/3'))/x-2*sqrt(a*b)
y.diff(x)
3a3bx2+3abx3x

예 3)
 다음 식에서 θ에 대한 z의 변화율을 계산해 봅니다.

z=1.8θ234.4θ51dzdθ=21.83θ2314.45θ151=1.2θ530.88θ65
theta=symbols("theta")
z=1.8*theta**(Rational('-2/3'))+4.4*theta**(Rational('-1/5'))-27
z.diff(th)
1.2θ530.88θ65

예 4)
y=(2x3)(x+1)2을 미분해 봅시다.

이 식의 미분은 모두 전개하여 계산할 수 있지만 위에서 소개한 곱의 미분 법칙연쇄 법칙을 적용하여 계산할 수 있습니다.

dydx=(2x3)d(x+1)2dx+(x+1)2d(2x3)dxd((x+1)2)dx=2(x+1)dydx=(2x3)2(x+1)+(x+1)22
x=symbols("x")
y=(2*x-3)*(x+1)**2
dy_dx=diff(y, x)
dy_dx
2(x+1)2+(2x3)(2x+2)

예 5)
y=0.5x3(x3)의 미분은 곱의 미분법칙을 적용합니다.

dydx=0.5x2(x3)+0.5x3=1.5x2(x3)+0.5x3
x=symbols('x')
y=0.5*x**3*(x-3)
y
0.5x3(x3)
diff(y, x)
0.5x3+1.5x2(x3)

예 6)
 다음 함수를 미분해 봅시다.

w=(θ+1θ)(θ+1θ)dwdθ=ddθ(θ+1θ)(θ+1θ)+(θ+1θ)ddθ(θ+1θ)=(11θ2)(θ+1θ)+(θ+1θ)12(1θ121θ3)
theta=symbols('theta')
w=(theta+1/theta)*(sqrt(theta)+1/sqrt(theta))
w
(θ+1θ)(θ+1θ)
w.diff(theta)
(11θ2)(θ+1θ)+(θ+1θ)12(1θ121θ3)

예 7)
 함수 y를 미분합니다.

y=aax2+ax+1

함수 y를 미분하기 위해 나눗셈의 미분 규칙을 적용합니다.

dydx=1(ax2+ax+1)2(dadx(ax2+ax+1)ad(ax2+ax+1)dx)=a(2axa2x)(ax+ax2+1)2
a, x=symbols('a, x')
y=a/(1+a*sqrt(x)+a*x**2)
y.diff(x)
a(2axa2x)(ax+ax2+1)2

예 8)
 다음 함수 y를 미분합니다. 이 식 역시 나눗셈의 형태로서 예 7과 같이 나눗셈 미분법칙을 적용합니다.

y=x2x2+1dydx=1(x2+1)2(dx2dx(x2+1)x2d(x2+1)dx)=2x3(x2+1)2+2xx2+1
x=symbols('x')
y=x**2/(x**2+1)
y.diff(x)
2x3(x2+1)2+2xx2+1
simplify(y.diff(x))
2xx4+2x2+1

예 9)
 함수 y를 미분합니다.

y=a+xax
a, x=symbols('a, x')
y=(a+x**(Rational('1/2')))/(a-x**(Rational('1/2')))
y
a+xax
de=denom(y) #분모
de
ax
nu=numer(y)
nu #분자
a+x
y_diff=1/de**2*(nu.diff(x)*de-nu*de.diff(x))
simplify(y_diff)
ax(ax)2

위 과정 없이 직접 미분한 것과 같은 결과가 반환되어야 합니다.

simplify(y.diff(x))
ax(ax)2

예 10)
 다음 함수 역시 분수형태이므로 나눗셈 법칙을 적용합니다.

y=ax23+1ax32+1
a, x=symbols('a, x')
y=(1-a*x**(Rational('2/3')))/(1+a*x**(Rational('3/2')))
y
ax23+1ax32+1
de=denom(y)#분모 
de
ax32+1
nu=numer(y)#분자 
nu
ax32+1
y_diff=1/de**2*(nu.diff(x)*de-nu*de.diff(x))
simplify(y_diff)
a(4ax32+9x56(ax231)4)6x3(ax32+1)2
simplify(y.diff(x))
a(4ax32+9x56(ax231)4)6x3(ax32+1)2

예 11)
 80°C 이상인 t°C에서의 포화증기압 P는 다음과 같이 나타냅니다. 100°C에서 증기압의 변화량?

P=(40+t140)5

거듭제곱 형태의 함수를 미분하기 위해 연쇄법칙을 적용합니다.

u=40+t140dPdt=dPdududt=5(40+t140)4140=5(40+t)41405
t, u=symbols("t, u")
P=((40+t)/140)**5
dpdt=P.diff(t)
simplify(dpdt)
(t+40)410756480000
dpdt.subs(t, 100)
128

댓글

이 블로그의 인기 게시물

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

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. (1)A=PBP1P1AP=B 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. (식 2)BλI=P1APλP1P=P1(APλP)=P1(AλI)P 식 2의 행렬식은 식 3과 같이 정리됩니다. det(BλI)=det(P1(APλP))=det(P1)det((AλI))det(P)=det(P1)det(P)det((AλI))=det(AλI)det(P1)det(P)=det(P1P)=det(I) 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a sin2(x)+cos2(x) simplify(a) 1 simplify(b) x3+x2x1x2+2x+1 simplify(b) x - 1 c=gamma(x)/gamma(x-2) c Γ(x)Γ(x2) simplify(c) (x2)(x1) 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. (식 1)Γ(n)={(n1)!n:자연수0xn1exdxn:부동소수 x=symbols('x') gamma(x).subs(x,4) 6 factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 x2=1의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. x21=0 import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. x21=0(x+1)(x1)=0x=1or1x4=1의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. x41=(x2+1)(x+1)(x1)=0x=±1,±1=±i,±1 실수...