1 poin oleh GN⁺ 2024-03-01 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-03-01
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

    • Dengan cara serupa, saya pernah memakai SymPy untuk menangani turunan yang berantakan yang diperlukan dalam perhitungan mekanika orbit
      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
    • Pustaka ini mungkin menarik: https://github.com/symforce-org/symforce
    • Dulu saya melihat orang melakukan pekerjaan seperti ini dengan Maple, jadi menyenangkan sekarang ada opsi open source
      Di bidang robotika dan computer vision, ada symforce, pustaka keren yang memakai SymPy untuk melakukan pekerjaan semacam ini: https://github.com/symforce-org/symforce
    • Baru hari ini saya melakukan pekerjaan ini saat membuat simulator kain
      Saya ingin mencoba memperbarui posisi tiap node secara bergiliran dengan langkah Newton, sambil membiarkan node lain tetap tetap
    • Saya penasaran apakah Anda sudah mempertimbangkan jax
      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

    • Kelemahan terbesar SymPy adalah semua simbol harus didefinisikan lebih dulu
      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

    • Saya penasaran apakah ada aplikasi selain Maple yang mendukung input typeset apa yang terlihat itulah yang ditulis seperti Maple
      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
    • Seorang teman dekat sering bercerita bahwa di Coherence ia membuat notebook produksi yang melakukan perhitungan optik dan termal dengan Mathematica Notebook
      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

    • SymPy adalah open source, sedangkan Mathematica bukan
      Selain itu, SageMath yang bergantung pada SymPy adalah produk yang lebih dekat sebagai pembanding, dan yang ini juga open source
    • Memang menarik, tetapi situs web yang disebutkan hanya membahas integral
    • Penasaran mengapa perbedaannya sebesar ini
      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

    • Tampaknya persis seperti bentuk yang dicari
      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...

    • Sebaiknya lihat Sage Manifolds: https://sagemanifolds.obspm.fr/
      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

    • Terlepas dari Stephen Wolfram, Mathematica masih jauh lebih unggul sebagai sistem aljabar komputer dibanding sebagian besar alternatifnya
      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

    • SageMath terlihat keren, tetapi agak terasa membebani karena merupakan gabungan dari berbagai alat yang sudah ada, masing-masing dengan sintaksnya sendiri dan fitur yang saling tumpang tindih
      Karena kurang konsisten secara internal, rasanya cara kerjanya bisa tidak seragam
      Saya penasaran bagaimana sebenarnya bagian ini terasa dalam praktik