- Jika ingin menangani manipulasi dan perhitungan rumus langsung di dalam kode Python, SymPy mendukung baik penggunaan interaktif maupun penyematan ke dalam aplikasi
- Merupakan perangkat lunak gratis yang disediakan dengan lisensi BSD, dan bahasa implementasi serta bahasa yang digunakan pengguna sama-sama Python
- Dependensinya hanya mpmath, pustaka Python murni untuk operasi bilangan floating point presisi arbitrer, sehingga beban instalasi dan pemanfaatannya ringan
- Berbagai alat sains, matematika, dan pengembangan seperti Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder, dan PyTorch TorchInductor menggunakan SymPy
- Cakupan pemakaiannya luas, mulai dari aljabar tensor, kimia, relativitas umum, analisis rangkaian, optimisasi, dinamika, pembuatan kode, hingga dukungan shape dan stride dinamis
Pustaka matematika simbolik berbasis Python
- SymPy adalah pustaka untuk menangani matematika simbolik di Python
- Disediakan dengan lisensi BSD sehingga dapat digunakan secara bebas
- Seluruhnya ditulis dengan Python, dan bahasa yang digunakan di SymPy juga Python
- Dependensinya hanya satu, yaitu mpmath
- mpmath adalah pustaka Python murni untuk operasi bilangan floating point presisi arbitrer
- Dapat digunakan sebagai alat interaktif, serta bisa disematkan ke aplikasi lain atau diperluas dengan fungsi kustom
- Daftar fiturnya dapat dilihat di SymPy's features
Proyek yang mengadopsi SymPy
- Daftar yang dipublikasikan ini adalah daftar yang belum lengkap dari proyek yang menggunakan SymPy, dan permintaan penambahan proyek pengguna dapat diajukan melalui mailing list
-
Bidang komputasi sains dan matematika
- Cadabra: menggunakan SymPy untuk aljabar skalar dalam sistem aljabar tensor dan teori medan kuantum
- ChemPy: paket untuk kimia yang ditulis dengan Python
- EinsteinPy: paket Python untuk relativitas umum simbolik dan numerik
- OctSymPy: paket simbolik untuk Octave yang menggunakan SymPy
- PyDy: menangani dinamika multibodi di Python
- QMCPACK: proyek Quantum Monte Carlo berbasis C++ yang menggunakan SymPy untuk menghasilkan nilai acuan bagi unit test dan sebagian pembuatan kode
- SageMath: sistem matematika open source yang mencakup SymPy
-
Alat pengembangan dan pembuatan kode
- devito: DSL simbolik dan kompiler JIT untuk komputasi stencil berkinerja tinggi
- Optlang: paket Python untuk menyelesaikan masalah optimisasi matematis
- PyTorch TorchInductor: menggunakan SymPy untuk dukungan shape dan stride dinamis
- Spyder: lingkungan pengembangan Scientific Python, dan dukungan penuh SymPy dapat diaktifkan di IPython Console
- symjit: kompiler JIT ringan untuk ekspresi SymPy
- yt: paket Python untuk analisis dan visualisasi data volumetrik, dan sistem unit yt yaitu unyt menggunakan SymPy
1 komentar
Opini Hacker News
Dalam robotika, orang sering memakai vektor besar yang dihasilkan dari transformasi 3D, dan perlu menghitung Jacobian, yaitu turunan terhadap berbagai variabel keadaan, sehingga ekspresinya cepat menjadi berantakan
Dengan SymPy, vektor besar bisa dibuat secara deklaratif, Jacobian dihitung, lalu hasilnya diekspor langsung sebagai kode C yang bisa dipakai di proyek
Misalnya, jika ada dataset posisi robot dan posisi sensor, untuk memperkirakan posisi sensor relatif terhadap pusat robot, sistem yang overconstrained bisa diselesaikan dengan gradient descent, dan fungsi residual serta Jacobian yang diperlukan saat itu dapat dihitung dengan SymPy
Polanya adalah menuliskan persamaan terlebih dahulu, menyerahkan matematika yang merepotkan ke SymPy, lalu mengubah outputnya menjadi kode C
Alasan proyek SymPy jarang terlihat di kode produk nyata mungkin karena dipakai untuk perhitungan perantara seperti ini, lalu hanya hasilnya yang masuk ke kode produk, sementara kode komputasi simboliknya dibuang
Di bidang robotika dan computer vision, ada symforce, pustaka keren yang memakai SymPy untuk melakukan pekerjaan semacam ini: https://github.com/symforce-org/symforce
Saya ingin mencoba memperbarui posisi tiap node secara bergiliran dengan langkah Newton, sambil membiarkan node lain tetap tetap
Tanpa keluar dari Python, Jacobian bisa dihitung secara efisien, GPU juga bisa dipakai jika mau, dan API-nya kompatibel dengan NumPy
SymPy benar-benar hebat, dan selama bertahun-tahun saya memakainya sebagai alat pendidikan
Alasan saya menganggapnya opsi terbaik dibandingkan Mathematica, Maple, dan sejenisnya adalah karena fungsi API-nya sangat cocok dengan kata kerja yang dipakai siswa saat belajar matematika: solve, expand, factor, dan semacamnya
Tutorial singkat untuk yang ingin memulai: https://minireference.com/static/tutorials/sympy_tutorial.pd...
Ada juga dalam format notebook yang dapat dijalankan: https://colab.research.google.com/github/minireference/sympy... versi baca-saja: http://nbviewer.ipython.org/github/minireference/sympytut_no...
Jika ingin mencobanya tanpa instalasi, ada juga SymPy live shell: https://live.sympy.org/ Berkat WebAssembly, Python dan SymPy berjalan di browser
Saat memproses ekspresi yang dimasukkan pengguna, ini menjadi lebih sulit karena kita harus mem-parse sendiri ekspresinya untuk mengetahui variabel apa saja yang dipakai, atau meminta pengguna menyediakan simbol secara manual
Matematika simbolik sangat kurang dibahas di tingkat sarjana, dan kalaupun pernah bersentuhan dengannya, biasanya terikat pada perangkat lunak proprietary seperti Mathematica atau MATLAB
Saya mempelajarinya sebagai alat yang memperluas secara tidak sempurna cara berpikir dengan kertas dan pena, dan ketika materi yang lebih lanjut ditangani sebagai source code, semakin dalam abstraksinya, semakin rapuh rasanya
Misalnya saya bekerja di bidang matematika/rekayasa yang banyak membutuhkan komputasi tensor; saya terutama memakai Maxima, tetapi paket terkaitnya terbatas dan merepotkan: https://arxiv.org/pdf/cs/0503073.pdf
Untuk perhitungan yang lebih kompleks, sekarang saya memakai SymPy, bukan karena pemrosesan simboliknya sendiri lebih baik, melainkan karena abstraksi yang sudah dimiliki Python
Suatu hari mungkin saya akan membaca Principles karya Norvig dan memodifikasi Maxima sesuai kebutuhan saya, dan saya ingin tahu jika ada referensi yang lebih baik tentang source code Maxima, implementasi komputasi tensor, atau tensor simbolik/aljabar geometri
Setahu saya Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage, dan lainnya semuanya bergantung pada teks bergaya mesin tik saat menulis dan memasukkan ekspresi matematika
Karena satu alasan ini saja Maple terasa paling pas bagi saya, karena bisa memasukkan ekspresi dalam bentuk seperti tulisan tangan, dan saya tidak mengerti mengapa fitur seperti ini tidak lebih umum
Saya penasaran apakah ini juga menjadi hambatan bagi orang lain
Bagi dia, itu benar-benar alat pekerja keras
Dahulu sekali saya bermain-main dengan Derive5; saat itu itu adalah sistem aljabar komputer paling murah, dan saya belajar memprogram dengan bahasa pemrograman satu baris yang aneh, yang menghapus semua spasi dan selalu menuntut kehati-hatian pada keseimbangan tanda kurung
Saya harus mencari file lama dan mengunggahnya ke GitHub, dan sebenarnya saya ingin mengimplementasikan ulang operasi-operasi itu dengan sistem aljabar komputer yang lebih modern untuk menggambar lebih rapat keluarga kurva eksponensial dengan panjang tanda sama dengan di sekitar titik (0,1)
Ada benchmark SymPy dan Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
Dari hasilnya, Mathematica tidak bisa menyelesaikan 1.523 soal, sedangkan SymPy tidak bisa menyelesaikan 48.529 soal
Masih ada cukup banyak hal yang perlu dikejar
Selain itu, SageMath yang bergantung pada SymPy adalah produk yang lebih dekat sebagai pembanding, dan yang ini juga open source
Misalnya, ingin tahu apakah ada cacat mendasar dalam pendekatan SymPy
SymPy: https://en.wikipedia.org/wiki/SymPy
“How should logarithms be taught?” menggunakan Python dan 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
Menggunakan SymPy seperti kalkulator bersama https://github.com/idanpa/calcpy
SymPy bawaan terasa agak merepotkan untuk digunakan
SymPy bekerja dengan sangat baik di Jupyter
Berikut adalah notebook demo SymPy buatan sendiri
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... penyelesaian persamaan kuadrat multivariabel dan tampilan ekspresi matematika yang rapi
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... cheatsheet plot NumPy/pylab cepat, termasuk contoh SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... contoh mencari nilai minimum bentuk tertutup dengan mendiferensiasikan fungsi Python yang sudah ada secara simbolik menggunakan SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... analisis rangkaian dasar dan kalkulus dasar dengan SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... eksplorasi format MathJax dan SymPy dalam berbagai cara, termasuk analisis algoritma lingkaran Minsky dari HAKMEM
10 tahun lalu, saat tertarik pada relativitas umum, ingin membuat program sederhana yang menangani perhitungan simbolik persamaan medan Einstein
Idenya menghitung koneksi afin, tensor Ricci, dan sebagainya mulai dari metrik; karena terbiasa dengan Python, SymPy tampak seperti pilihan yang bagus, tetapi sulit dan pada praktiknya tidak berhasil dibuat berjalan
Dengan Mathematica yang saat itu baru pertama kali dipakai, hal itu selesai dalam beberapa jam, lalu kemudian diperluas dan digunakan untuk banyak perhitungan dalam makalah lubang hitam yang diterbitkan belakangan
Setelah dicek sekarang, pengembangan SymPy di bidang ini sudah banyak berjalan dan muncul pustaka-pustaka bagus di atasnya: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
Sekarang juga ada contoh Jupyter notebook yang menangani metrik Schwarzschild: https://github.com/sympy/sympy/blob/master/examples/intermed...
Dibuat di atas SageMath, tetapi setahu saya SymPy juga bisa digunakan sebagai mesin komputasinya
Bagi “fisikawan” yang melakukan komputasi numerik, SymPy terasa cukup seperti penyelamat
Model yang lebih canggih pun enak dibuat prototipenya terlebih dahulu, lalu dioptimalkan ke C++ belakangan
Saya belum banyak memakai Mathematica, tetapi rasanya kemampuan pemrosesan simboliknya masih lebih kuat daripada SymPy atau membutuhkan lebih sedikit campur tangan
Akan bagus kalau ada orang yang lebih berpengalaman dengan Mathematica bisa menjelaskan perbedaan nyatanya dengan jelas
Maple bagus untuk beberapa integral
Kekurangannya adalah bahasa-bahasa itu tidak terlalu cocok sebagai bahasa serbaguna, dan ketika manipulasi aljabar yang harus dilakukan tidak begitu rumit, kita jadi ingin bekerja dalam bahasa yang “sungguhan”
Python memang bukan yang terbaik, tetapi cukup layak dipakai, dan ini satu lagi contoh yang mendapat manfaat dari ekosistem serbaguna yang sangat besar
SymPy melakukan apa yang perlu dilakukannya
Biasanya saya memakainya di dalam pustaka kombinatorika SageMath, dan saya masih penasaran apakah cara itu masih dianggap standar atau apakah kini SymPy sudah cukup berkembang untuk dipakai sendiri
Karena kurang konsisten secara internal, rasanya cara kerjanya bisa tidak seragam
Saya penasaran bagaimana sebenarnya bagian ini terasa dalam praktik