기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

지수와 로그 함수의 미분

내용

지수와 로그 함수의 미분

지수와 로그가 포함된 함수들을 미분합니다. 다음은 로그 함수입니다.

y=logex또는log(x)

위 함수 y의 역함수는 지수함수가 됩니다. 지수 급수의 미분은 원래 형태와 같으므로 식 1과 같이 나타낼 수 있습니다.

(1)y=logexey=xey=dxdydydx=1dxdy=1ey=1x

결과적으로 로그함수의 미분은 식 2와 같이 나타낼 수 있습니다.

(2)d(logex)dx=dydx=x1
import numpy as np
import pandas as pd
from sympy import *
import matplotlib.pyplot as plt

예 1)y=log(x+a)를 미분합니다.

x+a=eyd(x+a)dy=eydxdy=eydydx=1ey=1x+a
a, x=symbols('a, x')
y=log(x+a)
diff(y, x)
1a+x

예 2)y=log10x를 미분합니다.

이 함수는 대수로그입니다. 대수로그를 자연로그로 변환하기 위해 다음 식 1에서 나타낸 로그 규칙을 적용합니다.

(3)logab=logeblogea y=log10x=logexloge10=1loge10logexdydx=1loge101x
a, x=symbols('a, x')
y=log(x, 10)
dy=diff(y, x)
dy
1xlog(10)
N(dy, 5)
0.43429x

지수함수와 유사한 형태이지만 e 대신 다른 수에 대한 x 거듭제곱 형태의 미분에 대해 알아봅니다. 즉, y=ax (a: 상수)형태의 함수로서 위에서 소개한 로그 규칙(식 9)을 적용하여 자연로그로 전환하여 미분 계산을 할 수 있습니다.

y=axlogey=xlogeax=logeyxloge10dxdy=1logea1y=1logeaaxdydx=logeaax
a, x=symbols('a, x')
y=a**x
dy=diff(y, x)
dy
axlog(a)

예 3)  다음 함수들의 dydx를 계산하여 봅니다.

(1) y=eax는 두 가지 방법을 적용할 수 있습니다. 방법 1ax=zy=ezdydz=ez,dydx=adydx=a·eax방법 2logey=axd(logey)dy=d(ax)dxdyy=a·dxdydx=ay=aeax

a, x=symbols('a, x')
y=exp(-a*x)
dy=diff(y, x)
dy
aeax

(2)y=e2xx+1의 미분

logey=2xx+1d(logey)dy=d(2xx+1)dx
a, x=symbols('a, x')
y=exp(2*x/(x+1))
dy=diff(y, x)
dy
(2x(x+1)2+2x+1)e2xx+1

(3)y=ex2+a

위의 함수 중 x2+a미분은 연쇄법칙을 적용합니다.

y=exp(x2+a)logey=x2+ad(logey)dy=d(x2+a)dx1ydy=2x2x2+adxdydx=yx(x2+a)=xexp(x2+a)x2+a
a, x, u=symbols('a, x, u') 
y=exp(u) 
u1=sqrt(x**2+a) 
dydu=diff(y, u) 
dydu
eu
dudx=diff(u1, x) 
dudx
xa+x2
dydx=(dydu)*(dudx) 
dydx
xeua+x2
dydx.subs(u, u1)
xea+x2a+x2

위 함수를 diff()에 직접 적용할 수 있습니다.

yo=exp(sqrt(x**2+a))
yo.diff(x)
xea+x2a+x2

(4)y=log(a+x3)의 미분은 a+x3=u로 치환하여 실행합니다.

a, x, u=symbols('a, x, u') 
y=log(u) 
u1=a+x**3 
dydu=diff(y, u) 
dydu
1u
dudx=diff(u1, x) 
dudx
3x2
dydx=(dydu)*(dudx) 
dydx
3x2u
dydx.subs(u, u1)
3x2a+x3
yo=log(a+x**3) 
yo.diff(x)
3x2a+x3

(5)y=log(3x2+a+x2)

위 함수의 미분은 3x2+a+x2=u로 치환하여 실행합니다.

a, x, u=symbols('a, x, u') 
yo=log(3*x**2+sqrt((a+x**2)))
yo.diff("x")
6x+xa+x23x2+a+x2
y=log(u)
dydu=y.diff(u)
dydu
1u
u1=3*x**2+sqrt((a+x**2))
dudx=u1.diff(x)
dudx
6x+xa+x2
dydx=dydu*dudx
dydx
6x+xa+x2u
dydx.subs(u, u1)
6x+xa+x23x2+a+x2

(5) y=(x+3)2x2

위 함수의 미분은 양변에 로그화하여 미분을 실시합니다. 이 함수는 종속 변수 y와 독립 변수 x에 대한 모든 미분을 고려해야 합니다. 즉, 다음과 같은 음함수를 고려해야 합니다.

log(y)=log((x+3)2x2)d(log(y))dy=d(log((x+3)2x2))dx

음함수 형태의 미분은 sympy 함수 idiff()를 적용합니다. 물론 원함수를 diff()에 적용해도 동일한 결과를 나타냅니다.

a, x, y=symbols('a, x, y')
yo=(x+3)**2*sqrt(x-2)
dyo=yo.diff(x)
simplify(dyo)
5(x1)(x+3)2x2
#양변을 로그화하여 미분을 실시 
eq=log(y)-log((x+3)**2*sqrt(x-2))
deq=idiff(eq, y, x)
deq
5y(x1)2(x2+x6)
simplify(deq.subs(y, yo))
5(x2+2x3)2x2

(6) y=a+x2x3a3

함수 y는 분수 형태로 로그화하여 계산할 수 있습니다. 또한 미분의 나눗셈 법칙을 적용할 수 있습니다.

a, x, y=symbols('a, x, y')
yo=sqrt(x**2+a)/(x**3-a)**(Rational('1/3'))
yo
a+x2a+x33
dyo=yo.diff(x) #원함수의 미분
simplify(dyo)
ax(x+1)(a+x3)43a+x2
eq=log(y)-log(sqrt(x**2+a))+log((x**3-a)**(Rational('1/3')))
eq #원 함수를 로그화
log(y)+log(a+x33)log(a+x2)
deq=idiff(eq, y, x)
deq
axy(x+1)a2ax3+ax2x5
deq=deq.subs(y, yo)
simplify(deq)
axa+x2(x+1)a+x33(a2ax3+ax2x5)

위 결과에 의하면 원래의 함수와 로그화로 변환된 함수의 미분의 형태는 같지 않습니다. 그러나 정의적으로 두 결과는 같아야 합니다. 이를 확인하기 위해 일정한 값을 대응 시켜봅니다.

dyo.subs({a:1, x:3})==deq.subs({a:1, x:3})
True

나눗셈 규칙을 적용합니다.

ynu=numer(yo)
ynu
a+x2
yde=denom(yo)
yde
a+x33
dy=(ynu.diff(x)*(yde)-(ynu*yde.diff(x)))/yde**2
simplify(dy)
ax(x+1)(a+x3)43a+x2

(7) y=(1ax)ax

a, x, y=symbols('a, x, y')
yo=(1/a**x)**(a*x)
yo
(ax)ax
dyo=yo.diff(x) #원함수의 미분
dyo
(axlog(a)+alog(ax))(ax)ax
eq=log(y)-log((1/a**x)**(a*x))
eq
log(y)log((ax)ax)
deq=idiff(eq, y, x)
deq
ay(xlog(a)+log(ax))
deq=deq.subs(y, yo)
deq
a(xlog(a)+log(ax))(ax)ax

로그 곡선(Logarithmic Curve)

방정식 y=bpx의 그래프를 작성해봅니다. b는 y의 초기값이며 x에 따른 y의 변화는 다음과 같습니다.

b, p, x=symbols('b, p, x')
y=b*p**x
re={}
for i in range(6):
    re[i]=y.subs(x, i)
re
{0: b, 1: b*p, 2: b*p**2, 3: b*p**3, 4: b*p**4, 5: b*p**5}

위 결과를 표의 형태로 나타내면 다음과 같습니다.

x 0 1 2 3 4 5
y b bp bp2 bp3 bp4 bp5

그림 1은 b=2, p=1.5로 치환한 상태에서 위 코드의 지수함수와 그 함수를 로그화한 경우를 작성한 것입니다. 지수함수의 경우 y 값은 x에 따라 p배 만큼의 변화를 보입니다. 이와 같이 두 개의 연속하는 좌표들이 일정한 비율로 연결된 경우 그 식을 로그화하면 일정한 변화를 보입니다.

plt.figure(dpi=100)
x=np.linspace(0, 6, 100)
y=2*1.5**x
y1=np.log(2)+x*log(1.2)
plt.plot(x, y, label=r"$\mathbf{y=2 \cdot 1.5^x}$")
plt.plot(x, y1, label=r"$\mathbf{\log(y)=\log(2)+ x\log(1.5)}$")
plt.xlabel("x", size=12, weight="bold")
plt.ylabel("y, log(y)", size=12, weight="bold")
plt.legend(loc="best")
plt.grid(True)
plt.show()
그림 1. 지수함수와 그 함수를 로그화한 함수.

결과적으로 지수함수를 로그함수로 전환하면 y축 역시 log(y)로 전환하여 기울기가 상수인 직선의 방정식으로 나타낼 수 있습니다.

댓글

이 블로그의 인기 게시물

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