1 điểm bởi GN⁺ 2024-03-01 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nếu bạn muốn trực tiếp thao tác và tính toán biểu thức ngay trong mã Python, SymPy hỗ trợ cả sử dụng tương tác lẫn nhúng vào ứng dụng
  • Đây là phần mềm miễn phí được cung cấp theo giấy phép BSD, và cả ngôn ngữ triển khai lẫn ngôn ngữ hướng tới người dùng đều là Python
  • Chỉ có một phụ thuộc duy nhất là mpmath, thư viện Python thuần cho phép toán dấu phẩy động với độ chính xác tùy ý, nên việc cài đặt và sử dụng khá nhẹ nhàng
  • Nhiều công cụ khoa học, toán học và phát triển như Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder, PyTorch TorchInductor sử dụng SymPy
  • Phạm vi ứng dụng rất rộng, từ đại số tensor, hóa học, thuyết tương đối rộng, phân tích mạch, tối ưu hóa, động lực học, sinh mã cho đến hỗ trợ dynamic shape và stride

Thư viện toán học ký hiệu dựa trên Python

  • SymPy là thư viện dùng để xử lý toán học ký hiệu trong Python
  • Được phát hành theo giấy phép BSD nên có thể sử dụng tự do
  • Toàn bộ được viết bằng Python, và ngôn ngữ sử dụng trong SymPy cũng là Python
  • Chỉ có một phụ thuộc là mpmath
    • mpmath là thư viện Python thuần dành cho phép toán dấu phẩy động với độ chính xác tùy ý
  • Có thể dùng như công cụ tương tác, đồng thời có thể nhúng vào ứng dụng khác hoặc mở rộng bằng hàm tự định nghĩa
  • Có thể xem danh sách tính năng tại SymPy's features

Các dự án đã áp dụng SymPy

  • Danh sách công khai này là danh sách chưa đầy đủ các dự án sử dụng SymPy, và có thể yêu cầu bổ sung dự án thông qua mailing list
  • Lĩnh vực tính toán khoa học và toán học

    • Cadabra: sử dụng SymPy cho đại số vô hướng trong hệ thống đại số tensor và lý thuyết trường lượng tử
    • ChemPy: gói dành cho hóa học được viết bằng Python
    • EinsteinPy: gói Python cho thuyết tương đối rộng ký hiệu và số
    • OctSymPy: gói ký hiệu cho Octave sử dụng SymPy
    • PyDy: xử lý động lực học đa vật thể trong Python
    • QMCPACK: dự án Quantum Monte Carlo dựa trên C++, sử dụng SymPy để tạo giá trị chuẩn cho unit test và sinh một phần mã
    • SageMath: hệ thống toán học mã nguồn mở có tích hợp SymPy
  • Công cụ phát triển và sinh mã

    • devito: DSL ký hiệu và trình biên dịch JIT cho tính toán stencil hiệu năng cao
    • Optlang: gói Python để giải các bài toán tối ưu hóa toán học
    • PyTorch TorchInductor: sử dụng SymPy để hỗ trợ dynamic shape và stride
    • Spyder: môi trường phát triển Scientific Python, có thể kích hoạt hỗ trợ SymPy đầy đủ trong IPython Console
    • symjit: trình biên dịch JIT nhẹ cho biểu thức SymPy
    • yt: gói Python để phân tích và trực quan hóa dữ liệu thể tích; unyt, hệ thống đơn vị của yt, sử dụng SymPy

1 bình luận

 
GN⁺ 2024-03-01
Ý kiến trên Hacker News
  • Trong robotics, người ta thường dùng các vector lớn sinh ra từ kết quả biến đổi 3D, và thường phải tính Jacobian là đạo hàm theo nhiều biến trạng thái, nên biểu thức nhanh chóng trở nên rối rắm
    Với SymPy, có thể tạo các vector lớn theo kiểu khai báo, tính Jacobian, rồi xuất kết quả thành mã C để mang dùng ngay trong dự án
    Ví dụ, khi có bộ dữ liệu vị trí robot và vị trí cảm biến, nếu muốn ước lượng vị trí cảm biến theo hệ quy chiếu tâm robot thì có thể giải một hệ thừa ràng buộc bằng gradient descent, và khi đó chỉ cần dùng SymPy để tính hàm residual cùng Jacobian cần thiết

    • Tương tự, tôi từng dùng SymPy để xử lý các đạo hàm rắc rối cần cho tính toán cơ học quỹ đạo
      Trước hết viết các phương trình ra, giao phần toán phiền phức cho SymPy, rồi chuyển đầu ra thành mã C
      Có lẽ lý do dự án SymPy không dễ thấy trong mã sản phẩm thực tế cũng là vì nó được dùng cho các phép tính trung gian kiểu này, sau đó chỉ kết quả mới đi vào mã sản phẩm, còn phần mã tính toán ký hiệu thì bị bỏ đi
    • Có thể thư viện này sẽ thú vị: https://github.com/symforce-org/symforce
    • Trước đây tôi từng thấy người ta làm việc này bằng Maple, nên thật mừng khi giờ đã có lựa chọn mã nguồn mở
      Trong robotics và computer vision, có symforce dùng SymPy như một thư viện rất hay cho kiểu công việc này: https://github.com/symforce-org/symforce
    • Hôm nay tôi vừa làm đúng việc này khi xây dựng một trình mô phỏng dây
      Tôi muốn thử cập nhật vị trí từng nút lần lượt bằng bước Newton trong khi giữ cố định các nút còn lại
    • Không biết bạn đã cân nhắc jax chưa
      Nó có thể tính Jacobian hiệu quả mà không cần rời khỏi Python, có thể dùng cả GPU nếu muốn, và API cũng tương thích với NumPy
  • SymPy thật sự rất tuyệt vời, và tôi đã dùng nó như một công cụ giảng dạy suốt nhiều năm
    So với Mathematica hay Maple, tôi cho rằng đây là lựa chọn tốt nhất vì các hàm API khớp chính xác với những động từ mà sinh viên dùng khi học toán: solve, expand, factor, v.v.
    Đây là một tutorial ngắn cho người mới bắt đầu: https://minireference.com/static/tutorials/sympy_tutorial.pd...
    Cũng có bản notebook có thể chạy được: https://colab.research.google.com/github/minireference/sympy... chỉ đọc: http://nbviewer.ipython.org/github/minireference/sympytut_no...
    Nếu muốn thử mà không cần cài đặt, cũng có SymPy live shell: https://live.sympy.org/ Nhờ WebAssembly, Python và SymPy chạy được ngay trong trình duyệt

    • Điểm yếu lớn nhất của SymPy là phải định nghĩa trước mọi ký hiệu
      Khi xử lý biểu thức do người dùng nhập vào, việc này trở nên khó hơn vì phải tự phân tích biểu thức để biết biến nào đã được dùng, hoặc buộc người dùng cung cấp các ký hiệu thủ công
  • Toán học ký hiệu bị xem nhẹ nghiêm trọng trong chương trình đại học, và ngay cả khi có tiếp cận thì thường cũng bị trói vào phần mềm độc quyền như Mathematica hay MATLAB
    Nó được dạy như một công cụ mở rộng không trọn vẹn cho cách suy nghĩ bằng giấy và bút, và khi xử lý nội dung nâng cao hơn bằng mã nguồn thì càng đi sâu vào trừu tượng lại càng dễ bất ổn
    Ví dụ, tôi làm việc trong một lĩnh vực toán học/kỹ thuật đòi hỏi rất nhiều phép tính tensor; tôi chủ yếu dùng Maxima, nhưng các gói liên quan khá hạn chế và bất tiện: https://arxiv.org/pdf/cs/0503073.pdf
    Với các phép tính phức tạp hơn, giờ tôi dùng SymPy, không hẳn vì bản thân xử lý ký hiệu của nó tốt hơn mà vì mức độ trừu tượng mà Python vốn đã có
    Có lẽ một ngày nào đó tôi sẽ đọc Principles của Norvig và chỉnh Maxima cho phù hợp nhu cầu của mình; nếu ai có tài liệu tham khảo tốt hơn về mã nguồn Maxima, cách hiện thực tính toán tensor, hoặc về tensor ký hiệu/đại số hình học, tôi rất muốn biết

    • Tôi thắc mắc ngoài Maple ra còn ứng dụng nào hỗ trợ nhập công thức với dàn trang đúng như hiển thị giống vậy không
      Theo tôi biết thì Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage, v.v. đều phụ thuộc vào văn bản kiểu máy đánh chữ khi soạn và nhập công thức toán
      Chỉ riêng lý do này đã khiến Maple là công cụ duy nhất thực sự hợp với tôi, vì có thể nhập theo đúng hình thức viết tay, và tôi không hiểu tại sao tính năng này lại không phổ biến hơn
      Tôi cũng tò mò không biết đây có phải là một rào cản với người khác không
    • Một người bạn rất thân thường kể rằng anh ấy đã tạo ra các notebook sản xuất trong Mathematica Notebook để thực hiện tính toán quang học và nhiệt tại Coherence
      Với anh ấy, đó đúng là một công cụ cày việc thực thụ
      Rất lâu trước đây tôi từng nghịch Derive5; lúc đó đây là hệ đại số máy tính rẻ nhất, và tôi đã học lập trình bằng một ngôn ngữ một dòng kỳ quặc nơi phải bỏ hết khoảng trắng và luôn cẩn thận cân bằng dấu ngoặc
      Tôi nên tìm lại các tệp cũ rồi đưa lên GitHub, và thực sự muốn hiện thực lại các phép toán đó bằng một hệ đại số máy tính hiện đại hơn để vẽ dày hơn họ đường cong của họ hàm mũ có độ dài đẳng thức quanh điểm (0,1)
  • Có một bài benchmark giữa SymPy và Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
    Nhìn vào kết quả thì Mathematica không giải được 1.523 bài toán, còn SymPy không giải được 48.529 bài toán
    Vẫn còn khá nhiều điểm cần bắt kịp

    • SymPy là mã nguồn mở còn Mathematica thì không
      Hơn nữa, SageMath vốn phụ thuộc vào SymPy mới là sản phẩm gần hơn để so sánh, và bên đó cũng là mã nguồn mở
    • Khá thú vị, nhưng website được nhắc tới chỉ xử lý tích phân
    • Tò mò không hiểu vì sao lại có khác biệt lớn như vậy
      Ví dụ, tôi muốn biết liệu cách tiếp cận của SymPy có một khiếm khuyết mang tính nền tảng nào không
  • SymPy: https://en.wikipedia.org/wiki/SymPy
    “How should logarithms be taught?” dùng Python và 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

  • Tôi đang dùng SymPy như một máy tính cùng với https://github.com/idanpa/calcpy

    • Trông đúng kiểu tôi đang tìm
      Tôi cảm thấy SymPy mặc định hơi bất tiện khi sử dụng
  • SymPy hoạt động rất tốt trong Jupyter
    Đây là các notebook demo SymPy tôi tự làm
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... giải phương trình bậc hai nhiều biến và in công thức toán đẹp mắt
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... cheat sheet vẽ đồ thị NumPy/pylab nhanh, có kèm ví dụ SymPy
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... ví dụ lấy hàm Python có sẵn, vi phân ký hiệu bằng SymPy để tìm cực tiểu dạng đóng
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... phân tích mạch cơ bản và giải tích nhập môn bằng SymPy
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... thử nghiệm định dạng MathJax và SymPy theo nhiều cách, gồm cả phân tích thuật toán vòng tròn Minsky trong HAKMEM

  • Khoảng 10 năm trước, khi tôi quan tâm đến thuyết tương đối rộng, tôi muốn tạo một chương trình đơn giản để xử lý tính toán ký hiệu cho phương trình trường Einstein
    Nó bắt đầu từ metric rồi tính kết nối affine, tensor Ricci, v.v.; vì tôi quen Python nên SymPy có vẻ là lựa chọn tốt, nhưng nó khó và tôi không thể làm cho nó thực sự chạy được
    Khi đó, với Mathematica mà tôi mới dùng lần đầu, tôi đã làm xong chỉ trong vài giờ, rồi sau đó mở rộng nó và dùng cho nhiều phép tính trong một bài báo hố đen mà tôi công bố về sau
    Giờ kiểm tra lại thì thấy SymPy trong lĩnh vực này đã phát triển rất nhiều và đã có những thư viện tốt được xây trên nó: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
    Bây giờ thậm chí đã có cả ví dụ notebook Jupyter xử lý metric Schwarzschild: https://github.com/sympy/sympy/blob/master/examples/intermed...

    • Nên xem thử Sage Manifolds: https://sagemanifolds.obspm.fr/
      Nó được xây trên SageMath, nhưng tôi biết là cũng có thể dùng SymPy làm engine tính toán
  • Với những “nhà vật lý” làm tính toán số, SymPy khá giống một vị cứu tinh
    Cũng rất phù hợp để trước hết tạo nguyên mẫu cho các mô hình phức tạp hơn rồi sau đó tối ưu hóa bằng C++
    Tôi chưa dùng Mathematica quá nhiều, nhưng vẫn có cảm giác khả năng xử lý ký hiệu của nó mạnh hơn SymPy hoặc đòi hỏi ít công sức hơn
    Sẽ rất tốt nếu ai có nhiều kinh nghiệm hơn với Mathematica có thể giải thích rõ sự khác biệt thực tế

    • Bỏ qua Stephen Wolfram sang một bên, Mathematica vẫn vượt xa phần lớn các lựa chọn thay thế khác với tư cách là một hệ đại số máy tính
      Maple mạnh ở một số phép tích phân
      Nhược điểm là các ngôn ngữ đó không thực sự phù hợp như ngôn ngữ đa dụng, và nếu các phép biến đổi đại số cần làm không quá phức tạp thì người ta sẽ muốn làm việc trong một ngôn ngữ “thực thụ”
      Python không phải tốt nhất, nhưng đủ dùng tốt, và đây là thêm một ví dụ về việc tận dụng lợi thế của hệ sinh thái đa dụng khổng lồ của nó
  • SymPy làm được đúng việc cần làm
    Tôi thường dùng nó trong bộ thư viện tổ hợp của SageMath, và vẫn băn khoăn không biết đó có còn là cách làm chuẩn hay giờ SymPy đã phát triển đến mức có thể dùng riêng lẻ được rồi

    • SageMath trông rất tuyệt, nhưng việc nó là sự kết hợp của nhiều công cụ sẵn có, mỗi thứ có cú pháp riêng và chức năng chồng lấn, khiến tôi hơi ngại
      Vì có cảm giác thiếu tính nhất quán nội bộ nên cách làm việc có thể sẽ khá chắp vá
      Tôi muốn biết trên thực tế cảm nhận về điểm này như thế nào