기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

미분의 개념

내용

  1. 단순한 형태의 미분
  2. 음의 거듭제곱 형태의 미분
  3. 분수형태의 거듭제곱의 경우
  4. 상수를 포함한 식의 미분

단순한 형태의 미분

예 1)
두 변수 y와 x의 관계를 나타낸 함수 y=x2에 따르면 x가 증가하면 y 역시 증가합니다. 이 관계에서 두 변수 사이의 비율을 계산할 수 있습니다.

이 예제는 미분계수인 dydx의 값을 계산하는 것으로 x의 증가에 따라 식 1과 같이 표현할 수 있습니다.

(1)y+dy=(x+dx)2=x2+2xdx+(dx)2

dx는 변수 x의 작은 양이므로 위 식에서 (dx)2는 작은 양들 사이의 곱이므로 다른 항에 비해 매우 작습니다. 즉, 이 항은 무시 가능하기 때문에 식 1은 식 2와 같이 정리됩니다.

(2)y+dy=x2+2xdxdy=2xdx

위 식2는 미세한 구간에서 x에 대한 y의 변화율을 나타내는 것으로 미분이라고 정의합니다. 다시말하면, 일반적인 미분의 정의인 식 3과 같이 나타낼 수 있습니다.

(3)dydx=2x

파이썬 sympy 패키지의 diff() 함수를 적용하여 다음과 같이 코드화 할 수 있습니다. 이 함수는 sympy객체.diff()와 같이 메소드 형태로 적용할 수 있습니다.

x=symbols("x", real=True)
y=x**2
diff(y)
2x
y.diff()
2x
dydx는 x에 대한 y를 미분하는 결과입니다. 미분한다는 것은 미분 계수를 발견하는 것을 의미합니다.
x에 관한 다른 함수에 대해 생각해 봅니다. u=7x2+3 위 식의 x에 대한 u의 미분은 다음과 같이 나타낼 수 있습니다. dudx=d(7x2+3)dx 다음은 독립변수가 x가 아닌 t인 경우입니다. 즉, 다음식에서 t에 대한 y의 미분은 다음과 같이 나타낼 수 있습니다. y=b+12t2dydt=d(b+12t2)dt

예 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가 됩니다.

dydx=2001=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으로 간주 할 수 있습니다. 그러므로 dydx는 다음과 같습니다.

dx, dy=symbols("dx, dy", real=True)
f=dy/dx
f
dydx
f.subs([(dx,0.1),(dy, 20)])
200.0

예 2)
  예 1과 같은 방법으로 y=x3을 미분해 봅니다.

y+dy=(x+dx)3=x3+3x2dx+3x(dx)2+(dx)3

위 식에서 (dx)2, (dx)3은 무시할 수 있습니다. 또한 y=x3이므로 다음과 같이 정리됩니다.

dydx=3x2
x=symbols("x", real=True)
y=x**3
diff(y)
3x2

예 3)
y=x4을 미분해 봅니다.

y+dy=(x+dx)4=(dx)4+4(dx)3x+6(dx)2x2+4dxx3+x4

위와 같이 고차 방정식을 전개하기 위해 sympy 패키지의 expand()함수를 적용할 수 있습니다. 파이썬에서 곱셈과 거듭제곱은 각각 '*'과 '**'으로 표시됩니다.

x, dx=symbols("x, dx", real=True)
f=(x+dx)**4
f
(dx+x)4
expand(f)
dx4+4dx3x+6dx2x2+4dxx3+x4

위 식에서 (dx)의 거듭제곱과 관계된 항들은 매우 작은 값들이므로 무시할 수 있으므로 다음과 같이 정리할 수 있습니다.

y+dy=x4+4x3dx

y=x4이므로 이 식에서 x에 관한 y의 미분은 다음과 같습니다.

dydx=4x3

다음은 위 과정을 sympy함수들로 코드화한 것입니다.

x, dx=symbols("x, dx", real=True)
y=Function('y')(x)
diff(y)
ddxy(x)
y1=x**4
y1.diff(x)
4x3
Eq(y.diff(), y1.diff())
ddxy(x)=4x3

sympy에서 적용된 식은 동차 방정식(Homogeneous equation)의 형태 즉, 좌항 또는 우항이 0인 형태이어야 합니다. 이것은 각 식에 대한 객체 이름을 설정하기 위해서 입니다. 예를 들어 y = x2와 같은 식을 sympy객체로 만들면 y는 x를 변수로 하는 객체 이름입니다. 그러므로 y의 미분 표현을 나타내기 위해서는 eq1 = y, eq2 = x2과 같이 별도의 객체로 만들어야 합니다. 사용자가 y의 미분 표현 dydx를 묵시적으로 사용한다면 실제 코딩에서는 객체 eq2 만을 실행합니다. 그러나 미분 과정을 나타낼 필요가 있을 경우는 별도로 작성하여야 합니다. 이 과정을 적용하여 위 코드를 설명하면 다음과 같습니다.

  • 좌항과 우항을 별도의 함수로 설정
    1. 좌항 y는 종속변수이자 함수이므로 Function()함수로 선언
    2. 우항의 x는 독립변수이므로 symbols()함수로 선언
  • 좌항과 우항을 각각 diff()를 적용하여 미분
  • 각 미분항들을 Eq()함수를 사용하여 결합합니다.

다른 방법으로 y=x40=yx4과 같이 전체적으로 동차식의 형태로 만들어 사용합니다.

x, dx=symbols("x, dx", real=True)
y=Function('y')(x)
eq=y-x**4
eq
x4+y(x)
eq.diff(x)
4x3+ddxy(x)

위에서 소개한 예들의 결과를 요약해 보면 다음과 같습니다.

표 1. 간단한 함수들의 미분
y dydx
x2 2x
x3 3x2
x4 4x3
미분규칙 (1)y=xndydx=nxn1

미분 규칙을 y=x5에 적용하면 다음과 같습니다.

dydx=5x4
x, dx=symbols("x, dx", real=True)
f=(x+dx)**5
expand(f)
dx5+5dx4x+10dx3x2+10dx2x3+5dxx4+x5

위 결과에서 dx2 이상의 차원을 가진 항들을 모두 무시할 수 있으므로 정리하면 최종 결과는 y+dy=5dxx4+x5이므로 dydx=5x4입니다. 다음과 같이 코드화할 수 있습니다.

y=Function('y')(x)
eq=y-x**5
eq.diff(x)
5x4+ddxy(x)

음의 거듭제곱 형태의 미분

예 1에서 소개한 미분 과정을 식 y=x2에 적용하여 봅시다.

y+dy=(x+dx)2

위 식의 우항 같은 다항식의 전개를 위해 이항정리를 적용할 수 있습니다.

이항정리 (a+b)n=an+nan1b1!+n(n1)an2b22!++bn

이항정리를 적용하여 dx의 거듭제곱을 포함된 항들을 제거하면 식 2와 같습니다.

(2)(x+dx)2=x2+(2)x3dx1!+(2)(3)x4dx22!+=x2+(2)x3dx+6x4dx2+x2+(2)x3dx

y=x-2이므로 위 식으로 부터 x에 대한 y의 미분은 다음과 같습니다.

dydx=2x3

위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.

x=symbols("x")
y=Function('y')(x)
eq1=x**(-2)
Eq(y.diff(),eq1.diff())
ddxy(x)=2x3

분수형태의 거듭제곱의 경우

거듭제곱인자가 분수인 경우도 이항정리를 적용하여 미분을 정리할 수 있습니다.

(x+dx)1n=x1n+1nx1n11!+1n1n1x1n22!+=x1n+1nx1n1dx

위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.

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))
ddxy(x)=x1nnx
simplify(Eq(y.diff(),eq1.diff(x)))
ddxy(x)=x1nnn

위 코드의 마지막 명령인 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
dy+y=(dx+x)3+5
expand(F)
dy+y=dx3+3dx2x+3dxx2+x3+5

위 결과에서 dx의 거듭제곱을 포함한 모든 항들은 무시할 수 있으며 y=x3+5을 고려해주면 다음과 같이 정리됩니다.

x=symbols("x")
y=Function('y')(x)
eq=x**3+5
F=Eq(y.diff(), eq.diff())
F
ddxy(x)=3x2

상수 곱

다음 식은 독립변수를 상수배한 형태입니다. y=7x2을 미분하면 다음과 같습니다.

x, dx, y, dy =symbols("x, dx, y, dy")
f=y+dy
f1=7*(x+dx)**2
F=Eq(f,f1)
expand(F)
dy+y=7dx2+14dxx+7x2

위 결과에 y=7x2,dy2=0를 대입하기 위해 .subs()메서드를 사용합니다.

F1=F.subs({y:7*x**2, dx**2:0})
F1
dy+7x2=7(dx+x)2

다음 단계로 위 결과를 dy에 의해 정리하기 위해 solve()함수를 사용합니다. 위 결과를 정리하면 미분은 다음과 같습니다.

solve(F1, dy)
[7*dx*(dx + 2*x)]

(dx)2 ≈ 0으로 간주할 수 있으므로 최종적으로 위 결과는 다음과 같이 정리됩니다.

dydx=14x

x의 각 값에 대한 y와 dydx의 변화를 다음 표에 나타내었습니다.

표 2. y=7x2에 대한 미분계수
x y dydx
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, dydx) 좌표는 각각 그림 1과 같이 그래프로 나타낼 수 있습니다. 즉, 그림 1의 각 점에의 곡선 기울기의 변화는 직선의 형태로 나타낼 수 있습니다. 즉, 일정한 비례 관계가 존재합니다. 그 결과인 직선과 곡선을 비교하면 x가 음수인 경우 곡선은 감소하는 모습을 보이며 dydx 역시 음수임을 나타냅니다.

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()
그림 1. 곡선 y=7x2와 그 도함수 dydx.

상수에 의한 곱에 대한 미분은 미분 규칙의 확장으로 다음과 같이 계산됩니다.

(3)y=axndydx=anxn1

위의 미분은 상수에 의한 곱 외에 나눗셈 역시 적용됩니다.

y=17x2
x =symbols("x")
y=Rational('1/7')*x**2
y.diff()
2x7

위 코드에서 사용한 Rational() 함수는 인수로 전달한 분수 형태를 유지하므로 계산 결과 역시 분수 형태로 반환됩니다.

상수항과 상수에 의한 곱셈 등에 대한 몇 가지 예들을 고려해봅니다.

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

y=x5735dydx=175x51=57x4
x =symbols("x")
f=x**5*Rational('1/7')-Rational('3/5')
f.diff()
57x4

예 5)
 다음 무리수가 포함된 식을 미분 해봅니다.

y=a(x)a2dydx=a2(x)
a, x =symbols("a, x")
f=a*sqrt(x)-Rational('1/2')*sqrt(a)
f.diff(x)
a2x

다음 식은 양함수 구조이므로 이 식의 미분은 하나의 변수 즉, y에 대해 식을 정리한 다음 미분을 실시합니다.

ax+by=byax+(x+y)(a2b2)(ab)y+(a+b)x=(x+y)(a2b2)(ab+(a2b2))y=(a2b2(a+b))x

위 식을 최종적으로 y로 정리하여 미분하면 다음과 같습니다.

y=a2b2(a+b)ab+a2b2xdy=a2b2(a+b)ab+a2b2x0dxdydx=a2b2(a+b)ab+a2b2

위 과정은 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
ax+ay+bxbya2b2(x+y)
eq=collect(eq, (x, y))
eq
x(a+b)+y(ab)a2b2(x+y)

위 코드에 입력한 식은 collect() 함수를 사용하여 지정한 변수 x, y에 의해 정리하였습니다. 위 eq를 y에 대해 정리하기 위해 solve()함수를 사용합니다. 이 함수는 식에서 지정한 변수에 대한 해를 계산하는 것으로 위 식 eq에 대한 y의 해를 계산하는 것과 같습니다.

eq1=solve(eq, y)
eq1
[x(a+ba2b2)a+b+a2b2]

최종적으로 eq1을 x에 관해 미분합니다.

print(diff(eq1[0], x))
[a+ba2b2a+b+a2b2]

예 6)
  반지름 r, 높이 h인 실린더의 부피는 V=πr2h로 계산합니다. r = 5.5 in, h = 20 in일 경우 부피의 변화량을 계산합니다.

r,h =symbols("r,h")
V=pi*r**2*h
V
πhr2
V1=diff(V,r)
V1
2πhr
N(v1.subs([(r,5.5),(h, 20)]),4)
691.1

sympy와 numpy 등 파이썬에서 π는 pi로 나타냅니다. 이러한 기호와 함수의 값을 평가하기 위해 N() 또는 .evalf()를 적용합니다. 이 함수와 메서드에서는 유효숫자를 지정하여 표현되는 수의 형태를 조정할 수 있습니다.

pi
π
N(pi, 3)
3.14
pi.evalf(3)
3.14

r = h인 조건에서 반지름 1 in. 당 400 cm3의 변화가 일어나는 실린더의 차원을 계산해 봅니다.

v11=v1.subs(h,r)
print(v11)
2πhr2
sol=solve(Eq(v11, 400), r)
sol
[102π102π]
sol[1].evalf(3)
7.98

미분 식에 r = h인 조건을 충족시키기 위해 높이 h를 반지름 r로 치환했습니다. 이 때 변화율이 400 cm3이 될 때의 r값은 solve()함수로 계산하였습니다. 그 결과는 반지름이므로 양의 값이 되어야 하므로 sol 중 두번째 값이 됩니다.

예 7)
  Féry의 방사선 고온계는 다음 식과 같이 온도에 의해 값을 나타냅니다.

θθ1=(tt1)4

θ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
t4θ1t14
Eq(theta, eq1)
θ(t)=t4θ1t14
#계산에 필요한 부분은 우항
eq=eq1.subs({t1:1000, theta1:25})
eq
t440000000000
dth=eq.diff(t)
dth
t310000000000
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}

댓글

이 블로그의 인기 게시물

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