심파이,SymPy



Examples

방정식,equation 풀기: expr=0 꼴을 풀려면 solve(expr, var)
ex. 이차방정식,quadratic_equation $x^2-3x+2=0$ 풀기
solve(x**2 - 3*x + 2, x)
하면 두 근 1, 2가 [1,2] 형식으로 나옴

integrate(sin(x))
하면 적분,integration하여 -cos(x)가 나옴

Ivan Savov

float는 16자리까지만 정확.

정확한 수의 표현은 SymPy 객체로 함.
$\sqrt{2}$ : Pow(2, 1/2)
$\frac17$ : S('1/7') or Rational(1, 7)

SymPy 객체의 근사값을 float로 얻으려면 .evalf() or .n()

심볼 정의: p = Symbol('p') or p = symbols('p')

p + 2 : Add(Symbol('p'), Integer(2))

일련의 변수 정의
a0, a1, a2 = symbols('a0:3')

미리 쓰이는 한 문자 이미 정의된 한 문자로 된 xxx?
I 허수단위,imaginary_unit
E 자연로그의_밑,e
S() sympify함수
N() 수치 근사값 구하기에 쓰임
O big-O 표기법에 쓰임
_ 마지막 인쇄된 값이 들어있는 특수 변수


>>> expr=2*x+3*x-sin(x)-3*x+42
>>> simplify(expr)
2*x - sin(x) + 42
>>> factor(x**2-2*x-8)
(x - 4)*(x + 2)
>>> expand((x-4)*(x+2))
x**2 - 2*x - 8
>>> collect(x**2+x*m+n*x+m*n, x)
m*n + x**2 + x*(m + n)

값을 식에 대입하고 숫자로 얻기
>>> expr = sin(x) + cos(y)
>>> expr
sin(x) + cos(y)
>>> expr.subs({x:1, y:2})
cos(2) + sin(1)
>>> expr.subs({x:1, y:2}).n()
0.425324148260754

솔브
>>> solve(x**2 + 2*x - 8, x)
[-4, 2]
>>> a, b, c = symbols('a b c')
>>> solve(a*x**2 + b*x + c, x)
[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)] --- 근의 공식이 나옴
>>> solve([x + y - 3, 3*x - 2*y], [x, y]) --- 연립방정식 x+y=3 and 3x-2y=0을 x, y에 대해 푼다
{x: 6/5, y: 9/5}

유리식 결합
>>> a,b,c,d=symbols('a b c d')
>>> a/b+c/d
a/b + c/d
>>> together(a/b+c/d)
(a*d + b*c)/(b*d)

유리식 분자를 분모로 나누기
>>> apart((x**2 + x + 4) / (x + 2))
x - 1 + 6/(x + 2)

삼각함수
>>> sin(pi/6)
1/2
>>> cos(pi/6)
sqrt(3)/2
>>> expand(sin(2*x))
sin(2*x)
>>> expand_trig(sin(2*x))
2*sin(x)*cos(x)

복소수
>>> I*I
-1
>>> z=4+3*I
>>> re(z)
4
>>> im(z)
3
>>> Abs(z)
5
>>> arg(z)
atan(3/4)
>>> conjugate(z)
4 - 3*I

오일러 공식
x가 실수임을 지정하고, 복소수 전개에 관심이 있음을 expand에 알려야 한다.
>>> x=symbols('x',real=True)
>>> exp(I*x).expand(complex=True)
I*sin(x) + cos(x)
복소수 지수를 사용해 사인과 코사인 함수를 다시 쓰기
>>> cos(x).rewrite(exp)
exp(I*x)/2 + exp(-I*x)/2

무한대는 oo으로 표현.
>>> oo+1
oo
>>> 60000<oo
True
>>> 1/oo
0

극한
>>> limit((1+1/n)**n, n, oo)
E
>>> limit(1/x, x, oo)
0

미분
>>> diff(x**3, x)
3*x**2
>>> diff(x**2*sin(x), x)
x**2*cos(x) + 2*x*sin(x)
>>> diff(x**3, x, 2) # 2계 미분
6*x

부정적분
>>> integrate(x**3, x)
x**4/4
>>> integrate(sin(x), x)
-cos(x)
>>> integrate(ln(x), x)
x*log(x) - x
정적분
>>> integrate(x**3, (x, 0, 1))
1/4

수열은 함수 표기 a(n) 대신 a_n을 씀.
>>> a_n=1/n
>>> b_n=1/factorial(n)
>>> a_n.subs({n:5}) # a_n의 5항의 값은?
1/5
>>> [a_n.subs({n:i}) for i in range(0,8)]
[zoo, 1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7]         --- 책에 oo로 나오는게 zoo라고 나오는 이유가 뭐지?
>>> [b_n.subs({n:i}) for i in range(0,8)]
[1, 1, 1/2, 1/6, 1/24, 1/120, 1/720, 1/5040]

급수 (급수,series, 합,sum)
>>> a_n=1/n
>>> b_n=1/factorial(n)
>>> summation(a_n, [n, 1, oo])
oo                                --- 발산
>>> summation(b_n, [n, 0, oo])
E                                 --- e에 수렴

벡터
특별한 벡터 객체를 쓰지 않고 Matrix를 사용.
>>> u=Matrix([[4,5,6]])      # row vector
>>> v=Matrix([[7],[8],[9]])  # col vector
>>> v.T
Matrix([[7, 8, 9]])
>>> u.T
Matrix([
[4],
[5],
[6]])
>>> u[0]     # 0-based indexing for entries
4
>>> u.norm()    # length of u
sqrt(77)
>>> uhat = u/u.norm()     # unit vector
>>> uhat
Matrix([[4*sqrt(77)/77, 5*sqrt(77)/77, 6*sqrt(77)/77]])
>>> uhat.norm()
1

내적/외적
>>> u=Matrix([ 4,5,6])
>>> v=Matrix([-1,1,2])
>>> u.dot(v)
13
>>> u.cross(v)
Matrix([
[  4],
[-14],
[  9]])

미분방정식: 질량-용수철 시스템의 미분방정식
$-kx=ma$
$-kx(t)=m\frac{d^2}{dt^2}x(t)$
각속도,angular_velocity $\omega=\sqrt{k/m}$ 일 때
$\frac{d^2}{dt^2}x(t)+\omega^2x(t)=0$
을 푸는 법.
>>> t = Symbol('t')                  # time t
>>> x = Function('x')                # position function x(t)
>>> w = Symbol('w', positive=True)   # angular frequency w
>>> sol = dsolve(diff(x(t), t, t) + w**2*x(t), x(t))
>>> sol
x(t) = C1*sin(t*w) + C2*cos(t*w)
>>> x = sol.rhs
>>> x
C1*sin(t*w) + C2*cos(t*w)
$x(t)=C_1\sin(\omega t)+C_2\cos(\omega t)$ 는 단순조화운동(단조화운동,simple_harmonic_motion,SHM)을 묘사한다.