SymPy: Xử lý toán học ký hiệu trong Python
(sympy.org)- 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
Ý 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
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
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
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
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
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
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
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
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ở
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
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ó đượ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ế
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
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