미분
sympy에서 미분은 diff() 함수를 사용합니다.
diff(식, 기준이 되는 변수)
>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> diff(cos(x),x)
-sin(x)
>>> diff(exp(x**2), x)
2*x*exp(x**2)
위의 diff()에 의한 미분은 1차 미분을 나타낸 것이고 다중 미분역시 이 함수를 사용하여 수행할 수 있습니다. 다중 미분을 위해서 미분을 위한 변수를 여러차례 전달해야 한다. 즉, 변수를 전달하는 횟수만큼 미분이 실행됩니다. 다음은 4제곱인 x를 4번 미분한 것으로 결과는 24입니다.
>>> diff(x**4, x)
4*x**3
>>> diff(x**4, x,x,x,x)
24
즉, 위의 경우는$((((x^4)^{\prime})^{\prime})^{\prime})^{\prime})$과 같습니다.
이와같은 다중 미분은 다음과 같이 diff(식, 변수, 미분횟수)로 사용할 수 있습니다.
이와같은 다중 미분은 다음과 같이 diff(식, 변수, 미분횟수)로 사용할 수 있습니다.
>>> diff(x**4, x,4)
24
미분을 여러번 시행할 경우 횟수만큼 변수를 전달하는 대신 대상이 되는 변수와 함께 미분의 횟수를 전달하는 것으로 동일한 효과를 나타낼 수 있습니다. 이 방법으로 다중의 변수에 대해 미분을 실행할 수 있습니다. 즉, 함수에 전달하는 변수의 순서에 따라 미분이 실행됩니다. 예를들어 다음을 실행합니다.
>>> eq=exp(x*y*z)
>>> diff(eq, x)
y*z*exp(x*y*z)
$eq1=frac{d(e^{xyz})}{dx}=yze^{xyz}$
>>> diff(eq, x, y)
z*(x*y*z + 1)*exp(x*y*z)
$eq2=\frac{d(yze^{xyz})}{dy}=ze^(xyz)+yzxze^{xyz}=z(1+xyz)e^{xyz}$
$\because (AB)^\prime =A^{\prime}B+AB^{\prime}$
>>> diff(diff(eq, x), y)
x*y*z**2*exp(x*y*z) + z*exp(x*y*z)
>>> diff(eq, x, y, z)
(x**2*y**2*z**2 + 3*x*y*z + 1)*exp(x*y*z)
$eq3=\frac{(z+xyz^2)e^{xyz}}{dz}=(1+xyz)e^{xyz}+(z+xyz^2)xye^{xyz}=(x^2y^2z^2+3xyz+1)e^{xyz}$
다음은 위 식을 변수 z에 대해 3번 더 미분합니다.
>>> diff(eq, x, y, z, 4)
x**3*y**3*(x**2*y**2*z**2 + 9*x*y*z + 16)*exp(x*y*z)
y*z*exp(x*y*z)
$eq1=frac{d(e^{xyz})}{dx}=yze^{xyz}$
>>> diff(eq, x, y)
z*(x*y*z + 1)*exp(x*y*z)
$eq2=\frac{d(yze^{xyz})}{dy}=ze^(xyz)+yzxze^{xyz}=z(1+xyz)e^{xyz}$
$\because (AB)^\prime =A^{\prime}B+AB^{\prime}$
>>> diff(diff(eq, x), y)
x*y*z**2*exp(x*y*z) + z*exp(x*y*z)
>>> diff(eq, x, y, z)
(x**2*y**2*z**2 + 3*x*y*z + 1)*exp(x*y*z)
$eq3=\frac{(z+xyz^2)e^{xyz}}{dz}=(1+xyz)e^{xyz}+(z+xyz^2)xye^{xyz}=(x^2y^2z^2+3xyz+1)e^{xyz}$
다음은 위 식을 변수 z에 대해 3번 더 미분합니다.
>>> diff(eq, x, y, z, 4)
x**3*y**3*(x**2*y**2*z**2 + 9*x*y*z + 16)*exp(x*y*z)
>>> diff(ex, x, y,2, z, 4)
x**3*y**2*(x**3*y**3*z**3 + 14*x**2*y**2*z**2 + 52*x*y*z + 48)*exp(x*y*z)
위에서 사용한 diff()는 sympy 함수이지만 sympy 객체에 대해 메소드로 사용할 수 있습니다.
객체.diff()
>>> eq.diff(x)
y*z*exp(x*y*z)
>>> eq.diff(x,y, 2, z, 4)
x**3*y**2*(x**3*y**3*z**3 + 14*x**2*y**2*z**2 + 52*x*y*z +
48)*exp(x*y*z)
위에서 사용한 diff()는 sympy 함수이지만 sympy 객체에 대해 메소드로 사용할 수 있습니다.
객체.diff()
>>> eq.diff(x)
y*z*exp(x*y*z)
>>> eq.diff(x,y, 2, z, 4)
x**3*y**2*(x**3*y**3*z**3 + 14*x**2*y**2*z**2 + 52*x*y*z +
48)*exp(x*y*z)
위의 결과와 같이 동일한 변수로 여러번 미분을 시행할 경우 변수 다음에 숫자를 인수로 전달하는 것으로 동일한 결과를 나타낼 수 있습니다.
diff()함수는 식에 대한 미분 계산한 결과를 직접적으로 반환합니다. 이 함수와 같은 결과를 반환하지만 결과를 직접적으로 나타내지 않고 즉, 직접적으로 평가하지 않고 입력한 식에 대한 미분을 위한 객체를 만들기 위해 Derivative() 클래스함수를 사용합니다.
클래스함수는 클래스 객체를 생성합니다. 그러므로 Derivative()에 의해 클래스이름이 Derivative인 객체가 생성됩니다. 아래의 경우 der은 Derivative 객체입니다. 이러한 객체에서만 사용할 수 있는 함수를 메소드라고 합니다.
>>> der=Derivative(eq, x); der
Derivative(exp(x*y*z), x)
위의 명령은 전달한 식에 대한 Derivative 객체를 생성합니다. 이 객체를 평가(계산)하기 위해서는 다음의 Derivative 클래스 메소드를 사용합니다.
객체.doit()
이 평가되지 않은 객체는 미분의 평가를 지연시키고 미분 객체를 출력하기 위해 사용합니다. 또한 어떠한 정의되지 않은 함수를 포함하는 경우, Sympy에 의해 어떤 식의 미분 방법이 모호할 경우 유용하게 사용됩니다.
클래스함수는 클래스 객체를 생성합니다. 그러므로 Derivative()에 의해 클래스이름이 Derivative인 객체가 생성됩니다. 아래의 경우 der은 Derivative 객체입니다. 이러한 객체에서만 사용할 수 있는 함수를 메소드라고 합니다.
>>> der=Derivative(eq, x); der
Derivative(exp(x*y*z), x)
위의 명령은 전달한 식에 대한 Derivative 객체를 생성합니다. 이 객체를 평가(계산)하기 위해서는 다음의 Derivative 클래스 메소드를 사용합니다.
객체.doit()
이 평가되지 않은 객체는 미분의 평가를 지연시키고 미분 객체를 출력하기 위해 사용합니다. 또한 어떠한 정의되지 않은 함수를 포함하는 경우, Sympy에 의해 어떤 식의 미분 방법이 모호할 경우 유용하게 사용됩니다.
>>> der.doit()
y*z*exp(x*y*z)
위의 eq 식에 변수 x, y, z에 실제 값을 전달하여 계산하기 위해서는 .subs()함수를 직접적으로 사용하거나 .evalf(subs={})를 사용합니다.
예를들어
>>> a=eq.diff(x, y, z);a
(x**2*y**2*z**2 + 3*x*y*z + 1)*exp(x*y*z)
>>> a.subs([(x, 3),(y, 3), (z, 3)])
811*exp(27)
>>> N(811*exp(27))
431491123128059.
>>> a.evalf(subs={x:3, y:3, z:3})
431491123128059.
$f(x) = x \cdot sin(x^2) +1$
위 그래프에서 빨간 곡선은 초록곡선의 매우 미세한 부분에서의 기울기를 나타낸 것입니다.
예를들어 x= [-1.00003, -1] 사이의 구간에서의 기울기는 그 구간의 임의의 점에 대한 미분값과 거의 일치합니다.
>>> f=x*sin(x**2)+1
>>> f1=f.subs(x, -1);f1
-sin(1) + 1
>>> f2=f.subs(x, -1.00003);f2
0.158471352980134
>>> N((f1-f2))/(-1-(-1.00003))
1.92207373230197
>>> f.diff(x).subs(x, -1).evalf()
1.92207559654418
위 그래프의 빨간 곡선은 초록곡선의 아주 미세한 구간의 기울기를 연결한 것입니다. 그러므로 초록 곡선이 증가하면 빨간곡선의 증가와 감소폭은 초록곡선에서 보다 더욱 큰 폭으로 변화하는 경향을 보입니다.
위 그래프에서 빨간 곡선은 초록곡선의 매우 미세한 부분에서의 기울기를 나타낸 것입니다.
예를들어 x= [-1.00003, -1] 사이의 구간에서의 기울기는 그 구간의 임의의 점에 대한 미분값과 거의 일치합니다.
>>> f=x*sin(x**2)+1
>>> f1=f.subs(x, -1);f1
-sin(1) + 1
>>> f2=f.subs(x, -1.00003);f2
0.158471352980134
>>> N((f1-f2))/(-1-(-1.00003))
1.92207373230197
>>> f.diff(x).subs(x, -1).evalf()
1.92207559654418
위 그래프의 빨간 곡선은 초록곡선의 아주 미세한 구간의 기울기를 연결한 것입니다. 그러므로 초록 곡선이 증가하면 빨간곡선의 증가와 감소폭은 초록곡선에서 보다 더욱 큰 폭으로 변화하는 경향을 보입니다.
이러한 미분에 대한 생각은 미분한 함수가 0이 되는 곳이 원 곡선의 최대값 또는 최소값을 결정할 수 있겠지요. 그러므로 그러한 수치로 원 함수의 특성 파악에 중요한 단서가 될 것입니다. 이 생각은 뉴튼 최적법의 기본 개념이기도 합니다. 또한 원 방정식을 분해한 구간이 매우 미세하게 정의한다면 결국에는 선형으로 이 곡선의 특성을 나타낼 수 있으므로 복잡한 함수를 갖는 데이터의 특성을 파악하는 단서를 제공할 수 있습니다.
댓글
댓글 쓰기