[Sympy] 파이썬으로 미분하기

반응형
    반응형

    파이썬으로 미분할 때 Sympy를 사용하면 아주 편리합니다. 

     

    정의대로 미분

    먼저 정의대로 되는지 구해보겠습니다. 

    미분의 정의는 순간속력을 알아내기 위한 방법으로 고안했습니다. 

    속력 = 거리/시간 인데 이를 그래프로 보면 속력은 기울기와 같게 됩니다. 

    예를 들어, a에서 b 시점까지의 평균속력은 a와 b 사이의 평균 기울기가 됩니다.

    즉, 평균속력 = $ \frac{f(b)-f(a)}{b-a} $ 이 됩니다.

    관심을 갖는 건 a에서의 순간 속력입니다. 그러니 저 기울기가 a만 지나가야 하는 접선의 형태로 나타난다면 a의 순간속력이 될 것입니다. 

     

    이를 위해 limit를 도입합니다.

    왜냐하면 속력 =  거리/시간 인데 b=a 가 되면 분수는 성립하지 않아서 속력을 구할 수 없게 됩니다. 

    그래서 a는 아니지만 a에 가까이 가는 b를 설정해 극한을 취한다면 숫자성립이 안 되는 분수를 피할 수 있게 됩니다.

    이를 바탕으로 미분의 정의가 나왔습니다.

    즉, 함수 $ f(x) $ 의 x= a 에서의 순간변화율은

    $$ \begin{align} f'(a) & = \lim_{x \to a} {\frac{f(x)-f(a)}{x-a}} \\ &= \lim_{h \to 0} {\frac{f(a+h)-f(a)}{h}} \end{align} $$ 

     

    와 같습니다.

     

    이제 이를 파이썬으로 구현해보겠습니다. 간단하게 2차함수로 하겠습니다.

    $$ f(x) = 2x^2 + 3x + 6 $$ 의 미분을 정의를 이용해 구해보겠습니다.

    import sympy as sy
    x, a, h = sy.symbols('x a h')
    f = 2*x**2 + 3*x + 6
    fa = f.subs({x:a}) # f(a)
    fh = f.subs({x:a+h}) # f(a+h)
    sy.Limit((fh-fa)/h,h,0).doit() # f'(a)

    대입을 하려면 subs({변수: 넣을값})를 이용합니다. 

    limit 결과값을 알기 위해 doit() 메쏘드를 썼습니다. 

    doit() 은 결과값을 식으로 출력해줍니다.

     

    1변수 미분

    변수가 하나인 경우 미분 방법입니다.

    $ sin(x) + x $ 함수를 미분해보겠습니다.

     

    import sympy as sy
    
    x = sy.Symbol('x')
    func = sy.sin(x)+x
    func.diff()

     

    x에 특정한 값을 넣으려면 subs 안에 {변수 : 넣을값} 으로 딕셔너리를 만들거나 evalf(subs={변수:넣을값})으로 합니다. 

    2,3변수에서도 마찬가지 방법으로 합니다.

    df.subs({x:0}) 
    
    #또는
    
    df.evalf(subs={x:0})

     

    sympy에서는 미분함수도 하나의 식으로써 인지하기 때문에 방정식을 풀 수 있습니다.

    예를 들어, $ f'(x) = 1.5 $ 을 만족하는 x를 구하고 싶다면 sy.nsolve()를 이용합니다.

    x0 = sy.nsolve(df,1.5)
    x0

     

     

    2변수 함수

    2변수도 비슷합니다. 

    x, y 로 변수를 해서 미분을 하면 x로 미분하는 경우, y로 미분하는 경우로 나눠지는데 둘 다 모두 가능합니다.

    $$ f(x) = sin(x) + x + y+ sin(y) $$ 를 예로 해보겠습니다.

    x, y = sy.symbols('x y')
    f = sy.sin(x)+x+ y+ sy.sin(y)
    
    df_x = sy.diff(f,x) # x에 대한 미분
    df_y = sy.diff(f,y) # y에 대한 미분
    
    print(df_x,',', df_y)

     

    값을 대입하려면 1변수와 마찬가지로 subs를 이용합니다. 

    x, y 가 다 있는 f(x)를 예로 들면 다음과 같이 딕셔너리를 채워넣으면 됩니다.

    f.subs({x:1.5, y: 1.5})

     

    도함수에도 값 넣는게 가능하지만 1변수에서 한 방법과 동일하니 생략하겠습니다.

     

     

    관련 포스팅

    [수학] - [Sympy] 파이썬으로 수학식 만들기(기초연산)

    [수학] - [미적분] 파이썬으로 적분하기(Integration)

     

    댓글

    Designed by JB FACTORY

    ....