1P by GN⁺ | ★ favorite | 댓글 1개
  • 수식 조작과 계산을 Python 코드 안에서 직접 다루고 싶은 경우, SymPy는 대화형 사용과 애플리케이션 내장 모두를 지원함
  • BSD 라이선스로 제공되는 무료 소프트웨어이며, 구현 언어와 사용자-facing 언어가 모두 Python임
  • 의존성은 임의 정밀도 부동소수점 연산용 순수 Python 라이브러리인 mpmath 하나뿐이라 설치와 활용 부담이 작음
  • Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder, PyTorch TorchInductor 등 여러 과학·수학·개발 도구가 SymPy를 사용함
  • 활용 범위는 텐서 대수, 화학, 일반상대성이론, 회로 분석, 최적화, 동역학, 코드 생성, 동적 shape와 stride 지원까지 넓게 이어짐

Python 기반 기호 수학 라이브러리

  • SymPy는 Python에서 기호 수학을 다루기 위한 라이브러리임
  • BSD 라이선스로 제공되어 자유롭게 사용할 수 있음
  • 전체가 Python으로 작성되어 있으며, SymPy에서 사용하는 언어도 Python임
  • 의존성은 mpmath 하나뿐임
    • mpmath는 임의 정밀도 부동소수점 연산을 위한 순수 Python 라이브러리임
  • 대화형 도구로 사용할 수 있고, 다른 애플리케이션에 내장하거나 사용자 정의 함수로 확장 가능함
  • 기능 목록은 SymPy's features에서 확인할 수 있음

SymPy를 채택한 프로젝트들

  • 공개된 목록은 SymPy를 사용하는 프로젝트의 불완전한 목록이며, 사용 프로젝트는 메일링 리스트를 통해 추가 요청할 수 있음
  • 과학·수학 계산 분야

    • Cadabra: 텐서 대수와 양자장론 시스템에서 스칼라 대수에 SymPy를 사용함
    • ChemPy: Python으로 작성된 화학용 패키지임
    • EinsteinPy: 기호 및 수치 일반상대성이론을 위한 Python 패키지임
    • OctSymPy: SymPy를 사용하는 Octave용 기호 패키지임
    • PyDy: Python에서 다물체 동역학을 다룸
    • QMCPACK: C++ 기반 Quantum Monte Carlo 프로젝트로, 단위 테스트용 기준값 생성과 일부 코드 생성에 SymPy를 사용함
    • SageMath: SymPy를 포함하는 오픈소스 수학 시스템임
  • 개발 도구와 코드 생성

    • devito: 고성능 스텐실 계산을 위한 기호 DSL과 JIT 컴파일러임
    • Optlang: 수학적 최적화 문제를 푸는 Python 패키지임
    • PyTorch TorchInductor: 동적 shape와 stride 지원에 SymPy를 사용함
    • Spyder: Scientific Python 개발 환경이며, IPython Console에서 전체 SymPy 지원을 활성화할 수 있음
    • symjit: SymPy 표현식을 위한 경량 JIT 컴파일러임
    • yt: 체적 데이터 분석·시각화용 Python 패키지이며, yt의 단위 시스템인 unyt가 SymPy를 사용함

댓글과 토론

Hacker News 의견들
  • 로보틱스에서는 3D 변환 결과로 나온 큰 벡터를 쓰고, 여러 상태 변수에 대한 도함수인 야코비안을 계산해야 하는 일이 많아서 식이 금방 지저분해짐
    SymPy로 큰 벡터를 선언적으로 만들고, 야코비안을 계산한 뒤, 결과를 바로 프로젝트에 가져다 쓸 수 있는 C 코드로 내보내고 있음
    예를 들어 로봇 위치와 센서 위치 데이터셋이 있을 때 로봇 중심 기준 센서 위치를 추정하려면, 과잉제약 시스템을 경사하강법으로 풀 수 있고, 이때 필요한 잔차 함수와 야코비안을 SymPy로 계산하면 됨

    • 비슷하게 SymPy를 써서 궤도역학 계산에 필요한 지저분한 도함수를 처리한 적이 있음
      먼저 방정식을 적고, 귀찮은 수학은 SymPy에 맡긴 다음, 출력을 C 코드로 바꾸는 식이었음
      SymPy 프로젝트가 실제 제품 코드에서 잘 안 보이는 이유도 아마 이런 중간 계산에 쓰인 뒤 결과만 제품 코드에 들어가고, 기호 계산 코드는 버려지기 때문일 수 있음
    • 이 라이브러리가 흥미로울 수 있음: https://github.com/symforce-org/symforce
    • 예전에는 사람들이 이런 일을 Maple로 하던 걸 봤는데, 이제 오픈소스 선택지가 있어서 반가움
      로보틱스와 컴퓨터 비전 쪽에서 이런 작업을 해주는 멋진 라이브러리로 SymPy를 쓰는 symforce가 있음: https://github.com/symforce-org/symforce
    • 오늘 바로 이 작업을 천 시뮬레이터를 만들면서 했음
      다른 노드는 고정한 채 각 노드 위치를 차례로 Newton 단계로 갱신해 보고 싶었음
    • jax를 고려해 봤는지 궁금함
      Python을 벗어나지 않고도 야코비안을 효율적으로 계산할 수 있고, 원하면 GPU도 쓸 수 있으며, API도 NumPy와 호환됨
  • SymPy는 정말 훌륭하고, 여러 해 동안 교육 도구로 써 왔음
    Mathematica나 Maple 등에 비해 가장 좋은 선택지라고 보는 이유는 API 함수가 학생들이 수학을 배울 때 쓰는 동사와 정확히 맞아떨어지기 때문임: solve, expand, factor 같은 식
    시작하려는 사람을 위한 짧은 튜토리얼: https://minireference.com/static/tutorials/sympy_tutorial.pd...
    실행 가능한 노트북 형식도 있음: https://colab.research.google.com/github/minireference/sympy... 읽기 전용: http://nbviewer.ipython.org/github/minireference/sympytut_no...
    설치 없이 써보고 싶다면 SymPy live shell도 있음: https://live.sympy.org/ WebAssembly 덕분에 브라우저에서 Python과 SymPy가 실행됨

    • SymPy의 가장 큰 단점은 모든 기호를 미리 정의해야 한다는 점임
      사용자가 입력한 수식을 처리할 때는 어떤 변수가 쓰였는지 알아내기 위해 직접 식을 파싱하거나, 사용자에게 기호를 수동으로 제공하게 해야 해서 더 어려워짐
  • 기호 수학은 학부 과정에서 심각하게 덜 다뤄지고, 접해 봐도 대개 Mathematica나 MATLAB 같은 독점 소프트웨어에 묶여 있었음
    종이와 펜으로 생각하는 방식을 불완전하게 확장하는 도구로 배웠고, 더 고급 내용을 소스 코드로 다루면 추상화가 깊어질수록 불안정해짐
    예를 들어 텐서 계산을 많이 요구하는 수학/공학 분야에서 일하는데, 주로 Maxima를 쓰지만 관련 패키지는 제한적이고 번거로움: https://arxiv.org/pdf/cs/0503073.pdf
    더 복잡한 계산에는 이제 SymPy를 쓰는데, 기호 처리 자체가 더 좋아서라기보다 Python이 이미 가진 추상화 덕분임
    언젠가 Norvig의 Principles를 읽고 Maxima를 내 필요에 맞게 고칠 수도 있겠고, Maxima 소스 코드나 텐서 계산 구현, 기호 텐서/기하 대수에 대한 더 좋은 참고자료가 있으면 알고 싶음

    • Maple처럼 보이는 그대로 조판 입력을 지원하는 애플리케이션이 Maple 말고 있는지 궁금함
      아는 한 Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage 등은 모두 수학식을 작성하고 입력할 때 타자기식 텍스트에 의존함
      이 한 가지 이유만으로 Maple이 유일하게 와닿았는데, 손으로 쓰는 형태 그대로 입력할 수 있기 때문이고, 이런 기능이 더 흔하지 않다는 게 이해되지 않음
      이게 다른 사람에게도 장벽인지 궁금함
    • 가까운 친구가 Coherence에서 Mathematica Notebook으로 광학과 열 계산을 수행하는 프로덕션 노트북을 만들었다고 자주 말했음
      그에게는 정말 일꾼 같은 도구였음
      아주 오래전에는 Derive5를 가지고 놀았는데, 당시 가장 저렴한 컴퓨터 대수 시스템이었고, 공백을 모두 제거하고 괄호 균형을 항상 조심해야 하는 이상한 한 줄짜리 프로그래밍 언어로 프로그래밍을 배웠음
      예전 파일을 찾아 GitHub에 올려야겠고, 실제로 그 연산들을 더 현대적인 컴퓨터 대수 시스템으로 다시 구현해서 (0,1) 지점 근처의 등호 길이 지수 함수족 곡선을 더 촘촘히 그려보고 싶었음
  • SymPy와 Mathematica의 벤치마크가 있음: https://www.12000.org/my_notes/CAS_integration_tests/reports...
    결과를 보면 Mathematica는 1,523개 문제를 못 풀었고, SymPy는 48,529개를 못 풀었음
    아직 따라잡을 부분이 꽤 있음

    • SymPy는 오픈소스이고 Mathematica는 아님
      게다가 SymPy에 의존하는 SageMath가 더 비교 대상에 가까운 제품이고, 이쪽도 오픈소스임
    • 흥미롭긴 하지만, 언급한 웹사이트는 적분만 다룸
    • 왜 이렇게 큰 차이가 나는지 궁금함
      예를 들어 SymPy의 접근 방식에 근본적인 결함이 있는 건지 알고 싶음
  • SymPy: https://en.wikipedia.org/wiki/SymPy
    “How should logarithms be taught?” Python과 SymPy 사용: https://news.ycombinator.com/item?id=28518565#28519356
    “SymPy - a Python library for symbolic mathematics” (2020): https://news.ycombinator.com/item?id=23767513
    NumPy for Matlab users: https://numpy.org/doc/stable/user/numpy-for-matlab-users.htm...
    SymPy vs Matlab: https://github.com/sympy/sympy/wiki/SymPy-vs.-Matlab

  • https://github.com/idanpa/calcpy와 함께 SymPy를 계산기처럼 쓰고 있음

    • 딱 찾던 형태로 보임
      기본 SymPy는 쓰기에 조금 번거롭다고 느꼈음
  • SymPy는 Jupyter에서 아주 잘 동작함
    직접 만든 SymPy 데모 노트북들임
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... 다변수 이차식 풀이와 수학식 예쁘게 출력
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... 빠르게 그리는 NumPy/pylab 플롯 치트시트, SymPy 예제 포함
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... 기존 Python 함수를 SymPy로 기호 미분해서 닫힌형 최솟값을 찾는 예제
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... SymPy로 하는 기본 회로 해석과 기초 미적분
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... MathJax 서식과 SymPy를 여러 방식으로 만져본 내용, HAKMEM의 Minsky 원 알고리즘 분석 포함

  • 10년 전 일반상대성이론에 관심이 있을 때 Einstein 장 방정식의 기호 계산을 처리하는 간단한 프로그램을 만들고 싶었음
    계량에서 시작해 아핀 접속, Ricci 텐서 등을 계산하는 식이었고, Python이 익숙해서 SymPy가 좋은 선택지처럼 보였지만 어렵고 실제로 동작하게 만들지 못했음
    당시 처음 쓰는 Mathematica로는 몇 시간 만에 해냈고, 이후 확장해서 나중에 발표한 블랙홀 논문에서 많은 계산에 사용했음
    지금 확인해 보니 이 분야에서 SymPy 개발이 많이 진행되어 그 위에 좋은 라이브러리들이 생겼음: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
    이제는 Schwarzschild 계량을 다루는 Jupyter 노트북 예제도 있음: https://github.com/sympy/sympy/blob/master/examples/intermed...

    • Sage Manifolds를 확인해 보면 좋음: https://sagemanifolds.obspm.fr/
      SageMath 위에 만들어졌지만, 계산 엔진으로 SymPy도 쓸 수 있는 것으로 알고 있음
  • 수치 계산을 하는 “물리학자”에게 SymPy는 꽤 구세주 같았음
    더 고급 모델도 먼저 프로토타입으로 만들어 본 뒤 나중에 C++로 최적화하기 좋음
    Mathematica를 많이 써보지는 않았지만, 여전히 SymPy보다 기호 처리 능력이 더 강하거나 손이 덜 가는 느낌이 있음
    Mathematica 경험이 더 많은 사람이 실제 차이를 명확히 설명해 주면 좋겠음

    • Stephen Wolfram은 별개로 두더라도, Mathematica는 여전히 대부분의 대안보다 컴퓨터 대수 시스템으로 훨씬 앞서 있음
      Maple은 일부 적분에서 좋음
      단점은 그 언어들이 범용 언어로는 그다지 적합하지 않다는 점이고, 수행해야 할 대수 조작이 그렇게 복잡하지 않은 경우에는 “진짜” 언어에서 작업하고 싶어짐
      Python이 최고는 아니지만 충분히 쓸 만하고, 방대한 범용 생태계의 이점을 누리는 또 하나의 사례임
  • SymPy는 해야 할 일을 해냄
    보통 SageMath 조합 라이브러리 안에서 쓰는데, 아직도 그 방식이 정석인지 아니면 이제 SymPy가 단독으로 써도 될 만큼 발전했는지 궁금함

    • SageMath는 멋져 보이지만, 각자 문법이 있고 기능이 겹치는 여러 기존 도구를 조합한 것이라는 점이 조금 부담스러움
      내부 일관성이 부족해서 작업 방식이 들쭉날쭉할 것 같기 때문임
      실제로는 이 부분이 어떻게 느껴지는지 궁금함