심파이에서는 변수를 대수 기호로 사용하려면 반드시 symbols()함수를 써서 지정해 주어야 한다. 만약 x, y, z를 대수 기호로 사용하겠다면 다음과 같이 하면 된다.


>>> x = symbols(‘x’)
>>> y,z=symbols(‘y z’)


아래부터는 live.sympy.org 에서 직접 확인해 볼 수 있다.


[그림 1] live.sympy.org 접속화면

대수 방정식

 이것을 이용하여 수식 x+2y 를 입력해 보자.


>>> expr = x+2*y
x+2*y


여기서 x, y는 마치 파이썬의 변수처럼 사용되었지만 내부적으로는 대수기호로 지정되어 있는 상태이다.


>>> expr+1
x + 2*y + 1

>>> x*expr
x*(x + 2*y)

>>> expr2 = expand(x*expr)
x**2 + 2*x*y

>>> factor(expr2)
x*(x + 2*y)


이와 같이 expand() 함수를 이용하여 수식을 전개할 수 있고 factor()함수로 인수분해를 할 수 있다.


 분수식을 통분하거나 분리할때는 together() 함수와 apart()함수를 이용한다.


>>> a, b, c, d = symbols('a b c d')

>>> together(a/b + c/d)
(a*d + b*c)/(b*d)

>>> apart( (a**2+a+4)/(a+2) )
a - 1 + 6/(a + 2)


 대수 방정식을 풀기 위해서는 solve()함수를 이용하면 된다.


>>> solve(x**2-2,x)
[-sqrt(2), sqrt(2)]


미분

 이제 함수 sin(x)ex 를 미분해 보자. 미분은 diff() 함수를 이용하면 된다.


>>> diff(exp(x)*sin(x),x)
exp(x)*sin(x) + exp(x)*cos(x)


적분

 함수 exsin(x) + excos(x)의 부정적분을 계산해 보자. integrate()함수를 이용하면 된다.


>>> integrate(exp(x)*sin(x)+exp(x)*cos(x),x)
exp(x)*sin(x)


정적분을 구하려면 integrate()함수의 두 번째 인수에 범위를 지정해 주면 된다. sympy에서 무한대는 oo (소문자 o 두 개) 기호를 사용한다.


>>> integrate(sin(x**2),(x,-oo, oo))
sqrt(2)*sqrt(pi)/2


극한

 극한값을 구하려면 limit()함수를 이용하면 된다.


>>> limit(sin(x)/x,x,0)
1


미분방정식

 심파이를 이용하면 미분 방정식도 풀 수 있다.


>>> t=symbols('t')
>>> y=Function('y')
>>> dsolve( Eq(y(t).diff(t,t)-y(t), exp(t)), y(t))
y(t) == C2*exp(-t) + (C1 + t/2)*exp(t)


선형대수

 선형대수도 가능하다. 예를 들어 행렬


[ 1 2 ]

[ 3 4 ]


의 고유값을 구하려면 다음과 같이 하면 된다.


>>> A = Matrix([[1,2],[2,2]])
>>> A.eigenvals()
{-sqrt(17)/2 + 3/2: 1, 3/2 + sqrt(17)/2: 1}


 이와 같이 sympy를 이용하면 다양한 대수식을 표현하거나 방정식을 풀 수 있다.




Posted by 살레시오
,