http://live.sympy.org [[파이썬,Python]] 컴퓨터대수시스템([[CAS,computer_algebra_system]]) = 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>> 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]])을 묘사한다.