기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

치환미분

치환미분

결합함수의 미분을 계산하기 위해 사용할 수 있는 치환방법을 소개했습니다. 이것을 좀더 일반화하여 여러 형태에 사용되는 치환미분을 살펴봅니다.

다음 함수는 거듭제곱 형태로서 연쇄법칙을 적용하여 미분할 수 있습니다.

y=(x2+a2)3

미분 계산을 위해서는 함수를 최대한 간단하게 정리하는 것이 유리합니다. 위 함수에서 x2+a2=u로 치환하면 다음과 같이 정리됩니다.

y=u3

위와 같이 치환에 의한 함수의 미분의 과정은 다음과 같습니다.

  1. u=x2+y2
  2. y=u3
  3. dudx=2x
  4. dudx=3u2
  5. dydx=dydududx

위 과정의 1과 2 단계는 치환 과정이며 3과 4 단계는 각각 치환된 함수를 미분한 것입니다. 최종 결과인 5 단계에서는 3과 4 단계의 결과들을 곱하고 치환 함수를 원래의 함수로 환원시킨 것입니다. 위의 5 단계를 계산하면 다음과 같습니다.

3xu=3xx2+a2

위의 모든 과정을 코드화하면 다음과 같습니다.

a, u, x=symbols('a, u, x')
u1=x**2+a**2
y=u**(Rational('3/2'))
dydu=diff(y, u) #dy/du
dydu
3u2
#치환 
dudx=diff(u1, x)
dudx #du/dx
2x
dydx=dydu*dudx
dydx
3ux
#환원
dydx.subs(u, u1)
3xa2+x2

위 과정을 몇 가지 예들에 적용해 봅니다.

예 1)
y=a+xdydx?

a+x=uy=u
a, u, x=symbols('a, u, x')
u1=x+a
y=u**(Rational('1/2'))
dydx=y.diff(u)*u1.diff(x)
dydx
12u
dydx.subs(u, u1)
12a+x

예 2)
y=1a+x2dydx?

a, u, x=symbols('a, u, x')
u1=a+x**2
y=u**(Rational('-1/2'))
dydx=y.diff(u)*u1.diff(x)
dydx
xu32
dydx.subs(u, u1)
x(a+x2)32
y1=1/sqrt(a+x**2)
y1.diff(x)
x(a+x2)32

예 3)
y=(mnx23+px43)adydx?

u=(mnx23+px43)ay=ua
a, m, n, p, u, x=symbols('a, m, n, p, u, x')
y=(m-n*x**(Rational('2/3'))+p/x**(Rational('4/3')))**a
u1=m-n*x**(Rational('2/3'))+p/x**(Rational('4/3'))
y1=u**a 
u1dx=u1.diff(x)
u1dx
2n3x34p3x73
y1du=y1.diff(u)
y1du
auau
y1dx=y1du*u1dx
y1dx.subs(u, u1)
a(2n3x34p3x73)(mnx23+px43)amnx23+px43
dydx=y.diff(x)
dydx
a(2n3x34p3x73)(mnx23+px43)amnx23+px43

예 4)
  다음 식을 미분합니다.

y=1x3a2

위 식은 분수 형태이지만 분자가 상수이고 분모가 거듭제곱 형태이므로 치환에 의한 연쇄법칙(결합함수의 미분 참조)을 적용할 수 있습니다.

u=x3a2y=u
a, u, x=symbols('a, u, x')
y=1/sqrt(x**3-a**2)
u1=x**3-a**2
y1=1/sqrt(u)
u1dx=u1.diff(x)
u1dx
3x2
y1du=y1.diff(u)
y1du
12u32
y1dx=y1du*u1dx
y1dx.subs(u, u1)
3x22(a2+x3)32
dydx=y.diff(x)
dydx
3x22(a2+x3)32

미분, 적분의 모든 계산에 적용되는 하나의 통일된 방법은 없습니다. 각 식에 맞게 적절한 방법을 선택하는 것이 중요합니다. 위 예들은 치환할 수 있는 식을 가진 경우입니다. 그러나 구성된 식들이 여러 종류일 경우는 다른 접근이 필요합니다. 다음 예 5의 경우는 단일한 식으로 치환하여 전체 식이 간략화될 수 없는 구조이며 분수 형태입니다. 이러한 형태의 미분은 미분의 나눗셈 규칙(결합함수의 미분 참조)을 적용할 수 있습니다.

예 5)
  다음 식의 dydx?

y=1xx+1
x=symbols('x')
y=sqrt(1-x)/sqrt(x+1)
de=denom(y)#분모
nu=numer(y) #분자
dde=de.diff()
dde
12x+1
dnu=nu.diff()
dnu
121x
dy=(dnu*de-nu*dde)/de**2 #(1)
simplify(dy)
11x(x+1)32

위 코드의 dy의 미분 과정은 다음과 같습니다.

dydx=d1xdxx+11xdx+1dxx+1=1x2x+1x+121xx+1=1(x+1)321x

물론 원래 함수를 직접 미분하는 것에 의해 같은 결과가 반환되어야 합니다.

dy2=y.diff(x)
simplify(dy2)
11x(x+1)32

예 6)
  다음 식의 dydx?

y=x31+x2

다음 식은 분수형태입니다. 분수 즉, 나눗셈은 곱셈으로 표시할 수 있습니다. 그러므로 예5와 같이 미분의 나눗셈 법칙을 적용할 수 있지만 곱의 법칙 역시 적용할 수 있습니다.

x32(1+x2)12

위 식의 (1+x2)12는 예 2에서 전개한 치환미분 방법을 적용하여 계산합니다. 먼저 나눗셈 규칙을 적용합니다.

x=symbols('x')
y=sqrt(x**3)/sqrt(1+x**2)
de=denom(y)#분모 
nu=numer(y) #분자
d_de=de.diff()
d_de
xx2+1
d_nu=nu.diff()
d_nu
3x32x
dy=(d_nu*de-nu*d_de)/de**2 #(1)
simplify(dy)
(x2+3)x32x(x2+1)32

위 결과는 원 식에 대한 직접 미분과 같습니다.

dy_o=y.diff(x)
simplify(dy_o)
(x2+3)x32x(x2+1)32

위와 같이 미분의 나눗셈 규칙 대신 곱 규칙을 적용하여 계산해 봅니다.

dy_o=y.diff(x)
y1=x**(Rational("3/2"))*(1+x**2)**(Rational("-1/2"))
y1
x32x2+1
u=x**(Rational("3/2"))
v=(1+x**2)**(Rational("-1/2"))
dy1=u.diff()*v+u*v.diff()
simplify(dy1)
x(x2+3)2(x2+1)32

예 7)
  다음 식의 dydx?

y=(x+x2+x+a)3

함수 y는 거듭제곱 형태로 연쇄 규칙을 적용하여 미분 할수 있습니다.

dydx=3(x+x2+x+a)2d(x+x2+x+a)dx(1) d(x+x2+x+a)dx=dxdx+d(x2+x+a)dx=(1+d(x2+x+a)dx(2))d(x2+x+a)dx=12x2+x+ad(x2+x+a)dx=2x+12x2+x+a

위는 함수 y의 미분 계산 과정을 나타낸 것으로 식 (1)은 직접 미분이 어려운 경우이며 거듭제곱 형을 포함하므로 다시 연쇄 규칙을 적용하여 미분 하였습니다. 그 결과에서 식(2)의 미분에 연쇄 규칙을 반복하여 적용하면 최종 결과는 다음과 같습니다.

(x+a+x2+x)2(3(x+12)a+x2+x+3)
a, x=symbols('a, x')
y=(x+sqrt(x**2+x+a))**3
dydx=diff(y, x)
dydx
(x+a+x2+x)2(3(x+12)a+x2+x+3)

예 7과 같이 결과에 대한 연속적인 미분이 필요한 경우 결국 많은 미분 계수가 생성되며 최종적으로 이들을 연결하여야 합니다. 위 예의 미분 과정은 다음과 같이 간략히 나타낼 수 있습니다.

dydx=dydzdzdvdvdx

예 7)
z=3x4,v=7z2,y=1+v로 부터 dydx?

v, x, z=symbols('v, x, z')
z1=3*x**4
dzdx=z1.diff(x)
dzdx
12x3
v1=7/z**2
dvdz=v1.diff(z)
dvdz
14z3
y=sqrt(1+v)
dydv=y.diff(v)
dydv
12v+1

다음은 예의 3개의 식들을 결합하여 미분한 것입니다.

eq=y.subs(v, v1).subs(z, z1)
eq
1+79x8
diff(eq, x)
289x91+79x8

댓글

이 블로그의 인기 게시물

[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 실수...