2010-06-22 27 views
6

Çok değişkenli polinomları üretme ve işleme ile ilgilenen bir kod yazmam gerekiyor. Görevimi basitleştirilmiş bir örnekle özetleyeceğim.Çok değişkenli polinomları manipüle etmek için kütüphaneler

Üç ifade verdiğimi söyleyelim: 2x^2, 3y + 1 ve 1z. Daha sonra bana 6x^2yz + 2x^2z verecek olanları çoğaltmaya ihtiyacım var. Sonra bu ifadenin kısmi türevlerini x, y ve z'ye göre bulmak istiyorum. Bu bana 12xyz + 4xz, 6x^2z ve 6x^2y + 2x^2 verir.

Sorunum, binlerce değişken içeren ifadelerde bunun gibi basit işlemler yapmayı ele alıyor ve sistematik olarak bunu yapmanın kolay bir yoluna ihtiyacım var. Python'u kullanmak istiyorum çünkü numpy/scipy/matplotlib kullanılarak tamamlanmış çok sayıda proje ile ilgili işlevsellik var, ancak başka bir dilde güçlü bir araç kutusu varsa bunu kullanmaya da açıkım. Üniversite araştırması yapıyorum, bu yüzden Matlab'ı kullanmaya da açıkım.

Kolayca ve ideal olarak çok boyutlu polinomlar üzerinde çalışabilecek scipy polynomial routines benzeri bir şeyi beğenmek isteyebilecek iyi bir python kitaplığı bulamadım. Bu problem için uygun görünen ve zaten var olan python koduna entegre edilmesi kolay olan iyi bir kütüphane bilen var mı?

Teşekkürler!

Takip etmek: Birkaç günlüğünü, kullanımı kolay olduğu ortaya çıkarılan semiyeyle çalışarak geçirdim. Ancak, üzerinde çalışmakta olduğum problemin büyüklüğü çok yavaştı, bu yüzden şimdi matlab'ı keşfetmeye gideceğim. Küçük bir numune boyutu kullanarak hızın son derece kaba bir tahminini vermek için, 250 değişken içeren bir sipariş 2 polinomunun kısmi türevlerinin her birinin hesaplanması yaklaşık 5 saniye sürdü.

Takip # 2: Muhtemelen hala bu sorun üzerinde çalışıyordu bu geri yapmalıydım, ama ben de herkes matlab sembolik kütüphane hızı sympy için son derece kıyaslanabilir olduğunu bildirmek olabilir. Başka bir deyişle, büyük hesaplamalar için vahşice yavaştı. Her iki kütüphanede çalışmak inanılmaz derecede kolaydı, bu yüzden küçük hesaplamalar için tavsiye ederim.

Sorunumu çözmek için degradeleri el ile hesapladım, basitleştirdim ve daha sonra kodda bulduğum kalıpları kodun bazı değerlerinde kullandım. Daha fazla iş oldu, ama kodumu üstel olarak daha hızlı ve nihayet kullanılabilir hale getirdi.

+0

Örneğinizin temsilcisi nedir? Eğer başlangıç ​​polineriniz sadece bir varyantın fonksiyonlarıysa, problem daha kolay gözüküyor. –

+1

+1: Gerçekten güzel bir soru. Ben sembolik hesaplama (etiketli kütüphanelerden farklı olarak) yapan SymPy'yi önermek için * gidiyordum, ama sadece sayısal farklılaşma gibi görünüyor! http://docs.sympy.org/modules/mpmath/calculus/differentiation.html –

+0

@Nikhil: semp ayrıca sembolik farklılaşmayı da yapar. Aşağıdaki örneğime bakın. –

cevap

9

Sympy bunun için idealdir: http://code.google.com/p/sympy/

Dokümantasyon: öğreticisindeki farklılaşma http://docs.sympy.org/

Örnekler: http://docs.sympy.org/tutorial.html#differentiation

import sympy 

x, y, z = sympy.symbols('xyz') 

p1 = 2*x*x 
p2 = 3*y + 1 
p3 = z 

p4 = p1*p2*p3 

print p4 

print p4.diff(x) 
print p4.diff(y) 
print p4.diff(z) 

Çıktı: Eğer

2*z*x**2*(1 + 3*y) 
4*x*z*(1 + 3*y) 
6*z*x**2 
2*x**2*(1 + 3*y) 
+0

+1: Dokümanları tekrar okurken, sayısal yayınların isteğe bağlı olduğunu ve neden sadece ... sembolik farklılaştırmaya sahip ** ** örneklerinin olmadıklarını belirtiyorlar. –

+0

Bu, ihtiyacım olan şey için mükemmel. Örnek için de teşekkürler! – Spike

+0

@Nikhil: Bana da bunun için teşekkürler! Ben burada – Spike

1

Matlab ve bahsettiğiniz diğer araçlar genellikle sayısal bilgi işlem yapar. Sembolik hesaplama için Mathematica veya alternatif bir Computer Algebra System (CAS) kullanmayı düşünmelisiniz. Çeşitli CAS'ların karşılaştırması için wiki bağlantısına bakınız: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems.

+0

Giriş için teşekkürler. İlk önce semiyeyi deneyeceğim çünkü python'u çok seviyorum ve kod yazmanın en kolay yolu olacak. Hangi nedenle olursa olsun çok yavaşsa (daha önce büyük veri kümelerinde yavaş olmak için belirli scipy optimizasyon yöntemlerini buldum), kesinlikle başka bir ortamda deneyeceğim. – Spike

2

kullanıyorsanız MATLAB, n sembolik TB iyi çalışıyor, eğer varsa. Değilse, sympoly araç kutusunu kullanın. Sadece dosya değişiminden indirin.

sympoly x y z 
A = 2*x^2; B = 3*y + 1;C = 1*z; 
gradient(A*B*C) 

ans = 
Sympoly array has size = [1 3] 

Sympoly array element [1 1] 
    4*x*z + 12*x*y*z 
Sympoly array element [1 2] 
    6*x^2*z 
Sympoly array element [1 3] 
    2*x^2 + 6*x^2*y 

Bu sorunun, sonucunuzdaki z'ye göre sonucunu ayırt etmede bir hata yaptığınıza dikkat edin.

+0

üzerinde kazandım yardım tarafından gerçekten etkilendim Benim hata bulmak için teşekkürler. Sizin sempatik alet kutunuz güzel görünüyor ve eğer Matlab'ı bu problem için kullanmak zorunda kalırsam, ona bir girdap vereceğim. – Spike

İlgili konular