Python’da sembolik matematik için SymPy
(sympy.org)- Formül manipülasyonu ve hesaplamalarını doğrudan Python kodu içinde ele almak istediğinizde, SymPy hem etkileşimli kullanımı hem de uygulamalara gömülü kullanımı destekler
- BSD lisansıyla sunulan özgür bir yazılımdır; hem uygulama dili hem de kullanıcıya dönük dil Python’dır
- Tek bağımlılığı, keyfi duyarlıkta kayan nokta işlemleri için saf Python kütüphanesi mpmath olduğundan kurulum ve kullanım yükü düşüktür
- Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder, PyTorch TorchInductor gibi birçok bilim, matematik ve geliştirme aracı SymPy kullanır
- Kullanım alanları tensör cebiri, kimya, genel görelilik, devre analizi, optimizasyon, dinamikler, kod üretimi, dinamik shape ve stride desteğine kadar genişler
Python tabanlı sembolik matematik kütüphanesi
- SymPy, Python’da sembolik matematikle çalışmak için bir kütüphanedir
- BSD lisansıyla sunulur ve özgürce kullanılabilir
- Tamamı Python ile yazılmıştır; SymPy’de kullanılan dil de Python’dır
- Tek bağımlılığı mpmath’dır
- mpmath, keyfi duyarlıkta kayan nokta işlemleri için saf Python kütüphanesidir
- Etkileşimli bir araç olarak kullanılabilir; başka uygulamalara gömülebilir veya kullanıcı tanımlı fonksiyonlarla genişletilebilir
- Özellik listesine SymPy's features üzerinden bakılabilir
SymPy’yi benimseyen projeler
- Yayımlanan liste, SymPy kullanan projelerin eksik bir listesidir; kullanan projeler posta listesi üzerinden ekleme talep edebilir
-
Bilimsel ve matematiksel hesaplama alanı
- Cadabra: Tensör cebiri ve kuantum alan teorisi sistemlerinde skaler cebir için SymPy kullanır
- ChemPy: Python ile yazılmış bir kimya paketidir
- EinsteinPy: Sembolik ve sayısal genel görelilik için bir Python paketidir
- OctSymPy: SymPy kullanan Octave için sembolik pakettir
- PyDy: Python’da çok cisimli dinamikleri ele alır
- QMCPACK: C++ tabanlı Quantum Monte Carlo projesidir; birim testleri için referans değer üretiminde ve bazı kod üretimlerinde SymPy kullanır
- SageMath: SymPy’yi de içeren açık kaynaklı bir matematik sistemidir
-
Geliştirme araçları ve kod üretimi
- devito: Yüksek performanslı stencil hesaplamaları için sembolik DSL ve JIT derleyicisidir
- Optlang: Matematiksel optimizasyon problemlerini çözen bir Python paketidir
- PyTorch TorchInductor: Dinamik shape ve stride desteği için SymPy kullanır
- Spyder: Scientific Python geliştirme ortamıdır; IPython Console’da tam SymPy desteği etkinleştirilebilir
- symjit: SymPy ifadeleri için hafif bir JIT derleyicisidir
- yt: Hacimsel veri analizi ve görselleştirmesi için bir Python paketidir; yt’nin birim sistemi unyt SymPy kullanır
1 yorum
Hacker News yorumları
Robotikte, 3B dönüşümlerin sonucu olan büyük vektörler kullanılıyor ve birçok durum değişkenine göre türev olan Jacobian’ı hesaplamak sık gerektiğinden ifadeler hızla karmaşıklaşıyor.
SymPy ile büyük vektörleri deklaratif biçimde oluşturuyor, Jacobian’ı hesaplıyor, ardından sonucu doğrudan projede kullanılabilecek C kodu olarak dışa aktarıyorum.
Örneğin robot konumu ve sensör konumu veri kümeniz varsa, robot merkezine göre sensör konumunu tahmin etmek için aşırı kısıtlı bir sistemi gradyan inişiyle çözebilirsiniz; bunun için gereken artık fonksiyonu ve Jacobian SymPy ile hesaplanabilir.
Önce denklemleri yazıp, sıkıcı matematiği SymPy’ye bıraktım, sonra çıktıyı C koduna dönüştürdüm.
SymPy projesinin gerçek ürün kodunda pek görünmemesinin nedeni de muhtemelen bu tür ara hesaplamalarda kullanıldıktan sonra yalnızca sonucun ürün koduna girmesi ve sembolik hesaplama kodunun atılması olabilir.
Robotik ve bilgisayarlı görü tarafında bu tür işleri yapan, SymPy kullanan güzel bir kütüphane var: symforce: https://github.com/symforce-org/symforce
Diğer düğümleri sabit tutarak her düğüm konumunu sırayla bir Newton adımıyla güncellemeyi denemek istedim.
Python’dan çıkmadan Jacobian’ları verimli biçimde hesaplayabiliyor, isterseniz GPU da kullanabiliyorsunuz; API’si de NumPy ile uyumlu.
SymPy gerçekten harika ve yıllardır bir eğitim aracı olarak kullanıyorum.
Mathematica veya Maple gibi seçeneklere kıyasla en iyi tercih olduğunu düşünmemin nedeni, API fonksiyonlarının öğrencilerin matematik öğrenirken kullandığı fiillerle birebir örtüşmesi: solve, expand, factor gibi.
Başlamak isteyenler için kısa bir eğitim: https://minireference.com/static/tutorials/sympy_tutorial.pd...
Çalıştırılabilir notebook biçimi de var: https://colab.research.google.com/github/minireference/sympy... salt okunur: http://nbviewer.ipython.org/github/minireference/sympytut_no...
Kurulum yapmadan denemek isterseniz SymPy live shell de var: https://live.sympy.org/ WebAssembly sayesinde Python ve SymPy tarayıcıda çalışıyor.
Kullanıcı tarafından girilen ifadeleri işlerken hangi değişkenlerin kullanıldığını bulmak için ifadeyi kendiniz ayrıştırmanız ya da kullanıcıdan sembolleri elle sağlamasını istemeniz gerekiyor; bu da işi zorlaştırıyor.
Sembolik matematik lisans eğitiminde ciddi biçimde eksik ele alınıyor; karşılaşsanız bile çoğunlukla Mathematica veya MATLAB gibi tescilli yazılımlara bağlı kalıyordu.
Kâğıt kalemle düşünme biçimini kusurlu biçimde genişleten bir araç olarak öğrenildi ve daha ileri konuları kaynak kodla ele aldığınızda, soyutlama derinleştikçe işler kırılganlaşıyor.
Örneğin çok sayıda tensör hesabı gerektiren matematik/mühendislik alanlarında çalışıyorum; çoğunlukla Maxima kullanıyorum ama ilgili paketler sınırlı ve zahmetli: https://arxiv.org/pdf/cs/0503073.pdf
Daha karmaşık hesaplar için artık SymPy kullanıyorum; bunun nedeni sembolik işlemenin kendisinin daha iyi olması değil, Python’ın zaten sahip olduğu soyutlamalar.
Bir gün Norvig’in Principles’ını okuyup Maxima’yı ihtiyaçlarıma göre değiştirebilirim; ayrıca Maxima kaynak kodu ya da tensör hesabı uygulamaları, sembolik tensör/geometrik cebir üzerine daha iyi başvuru kaynakları varsa bilmek isterim.
Bildiğim kadarıyla Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage gibi araçların hepsi matematiksel ifadeleri yazarken ve girerken daktilo tarzı metne dayanıyor.
Sırf bu nedenle Maple bana tek anlamlı seçenek gibi gelmişti; çünkü elle yazılan biçime çok yakın şekilde girdi yapabiliyorsunuz. Bu özelliğin daha yaygın olmamasını anlayamıyorum.
Bunun başkaları için de bir engel olup olmadığını merak ediyorum.
Onun için gerçekten iş gören, ağır işçi gibi bir araçtı.
Çok uzun zaman önce Derive5 ile oynamıştım; o dönemde en ucuz bilgisayar cebiri sistemiydi ve tüm boşlukları kaldırmanız, parantez dengesine sürekli dikkat etmeniz gereken tuhaf, tek satırlık bir programlama diliyle programlamayı öğrenmiştim.
Eski dosyaları bulup GitHub’a koymam gerekiyor; ayrıca o işlemleri daha modern bir bilgisayar cebiri sisteminde yeniden uygulayıp (0,1) noktası yakınındaki eşit yay uzunluklu üstel fonksiyon ailesi eğrilerini daha sık aralıklarla çizmek istemiştim.
SymPy ile Mathematica arasında bir benchmark var: https://www.12000.org/my_notes/CAS_integration_tests/reports...
Sonuçlara bakınca Mathematica 1.523 problemi çözememiş, SymPy ise 48.529 problemi çözememiş
Hâlâ yetişmesi gereken epey alan var
Üstelik SymPy’ye bağımlı olan SageMath karşılaştırma için daha yakın bir ürün ve o da açık kaynak
Örneğin SymPy’nin yaklaşımında temel bir kusur olup olmadığını bilmek isterim
SymPy: https://en.wikipedia.org/wiki/SymPy
“Logaritmalar nasıl öğretilmeli?” Python ve SymPy kullanımı: https://news.ycombinator.com/item?id=28518565#28519356
“SymPy - sembolik matematik için bir Python kütüphanesi” (2020): https://news.ycombinator.com/item?id=23767513
Matlab kullanıcıları için NumPy: 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 ile birlikte SymPy’yi hesap makinesi gibi kullanıyorum
Varsayılan SymPy’nin kullanımını biraz zahmetli bulmuştum
SymPy, Jupyter içinde çok iyi çalışıyor
Kendi hazırladığım SymPy demo notebook’ları
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... çok değişkenli ikinci dereceden ifadeleri çözme ve matematiksel ifadeleri güzel biçimde yazdırma
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... hızlı çizilen NumPy/pylab grafik cheat sheet’i, SymPy örnekleri dahil
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... mevcut Python fonksiyonlarını SymPy ile sembolik olarak türevleyip kapalı formda minimum bulma örneği
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... SymPy ile temel devre analizi ve temel kalkülüs
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... MathJax biçimlendirmesi ve SymPy ile çeşitli denemeler; HAKMEM’in Minsky çember algoritmasının analizi dahil
10 yıl önce genel görelilik ile ilgilenirken Einstein alan denklemlerinin sembolik hesaplamalarını yapan basit bir program yazmak istemiştim
Metrikten başlayıp afin bağlantıyı, Ricci tensörünü vb. hesaplayacak türden bir şeydi; Python’a alışık olduğum için SymPy iyi bir seçenek gibi görünüyordu ama zordu ve gerçekten çalışır hâle getiremedim
O sırada ilk kez kullandığım Mathematica ile bunu birkaç saat içinde başardım; sonra genişletip daha sonra yayımladığım kara delik makalesindeki birçok hesaplamada kullandım
Şimdi baktığımda, bu alanda SymPy geliştirmesinin epey ilerlediğini ve onun üzerinde iyi kütüphaneler oluştuğunu görüyorum: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
Artık Schwarzschild metriğini ele alan bir Jupyter notebook örneği de var: https://github.com/sympy/sympy/blob/master/examples/intermed...
SageMath üzerine yapılmış, ama bildiğim kadarıyla hesaplama motoru olarak SymPy de kullanılabiliyor
Sayısal hesaplama yapan bir “fizikçi” için SymPy epey kurtarıcı gibiydi
Daha gelişmiş modelleri de önce prototipleyip sonra C++ ile optimize etmek için uygun
Mathematica’yı çok fazla kullanmadım, ama hâlâ SymPy’den daha güçlü sembolik işlem yeteneklerine sahip ya da daha az uğraştırıyor gibi geliyor
Mathematica deneyimi daha fazla olan biri gerçek farkı net biçimde açıklasa iyi olurdu
Maple bazı integrallerde iyi
Dezavantajı, bu dillerin genel amaçlı dil olarak pek uygun olmaması; yapılması gereken cebirsel manipülasyonlar o kadar karmaşık değilse “gerçek” bir dilde çalışmak istiyorsunuz
Python en iyisi değil ama yeterince kullanılabilir; geniş genel amaçlı ekosisteminin avantajından yararlanan bir başka örnek
SymPy yapması gerekeni yapıyor
Genelde SageMath kombinatorik kütüphanesinin içinde kullanıyorum; bunun hâlâ standart yol olup olmadığını, yoksa SymPy’nin artık tek başına kullanılacak kadar gelişip gelişmediğini merak ediyorum
İç tutarlılığı eksik olduğu için çalışma biçimlerinin tutarsız olabileceğini düşündürüyor
Pratikte bunun nasıl hissettirdiğini merak ediyorum