2012-02-29 25 views
15

Rasgele sayıdaki eşzamanlı denklemleri çözen bir işlevi kodluyorum. Denklemlerin sayısı, fonksiyonun parametrelerinden biri tarafından belirlenir ve her bir denklem, bir dizi sembolden oluşur - denklemler olduğu kadar çok sembol. Bu, denklemleri, hatta denklemleri bir araya getirmek için gerekli sembolleri bile kodlayamıyorum anlamına gelir; fonksiyonun herhangi bir sayıda denklemi işleyebilmesi gerekir. Öyleyse, sorum şu, sembollerin bir listesini nasıl üreteceğim?SymPy - Sembollerin rastgele sayıları

Tek bir çözümüm var ama bağırsağımın çok verimli olmayacağını söyledi. Bunu yapmanın daha iyi bir yolu varsa lütfen bana bildirin.

SymPy'ye yeni geliyorum ve hala yolumu hissediyorum. Görebildiğim kadarıyla, Sembollerin bir dizgeyle tanımlanması gerekiyor. Bu nedenle, bir diziye artan bir sayı ekleyerek ('t0', 't1', vb.) Bir dizi dizesi oluşturabilir, bunları bir listeye ekleyebilir ve daha sonra bu dizeleri parametre olarak kullanarak sembolleri oluşturabilirim. Bu semboller bir listede saklanacak ve denklemleri üretmek için kullanılacaktır.

def solveEquations(numEquations): 
    symbolNameList = [] 
    symbolList = [] 
    equationList = [] 
    for i in range(numEquations): 
     name = 't' + str(i) 
     symbolNameList.append(name) 
     symbolList.append(Symbol(name)) 

    for i in range(numEquations): 
     equation = 0 
     for sym in symbolList: 
      equation += sym ** i # Or whatever structure the equation needs 
     equationList.append(equation) 


    #Then go on to solve the equations... 

Bunu yapmanın en iyi yolu bu mu yoksa daha etkili bir yaklaşım var mı?

cevap

24

In [1]: symbols('a0:3') 
Out[1]: (a₀, a₁, a₂) 

In [2]: numEquations = 15 

In [3]: symbols('a0:%d'%numEquations) 
Out[3]: (a₀, a₁, a₂, a₃, a₄, a₅, a₆, a₇, a₈, a₉, a₁₀, a₁₁, a₁₂, a₁₃, a₁₄) 
+1

Teşekkür! Bu gerçekten basit görünüyor. – thornate

+1

Ayrıca harfler için çalışır: 'sembolleri ('a: g')'. – asmeurer

+2

sadece bir not burada, bu sembette bu bir tuple ve bir liste değil ...küçük bir fark olmakla birlikte, temel olarak, bir listenin öğelerine bir şeyleri tanımlayamazsınız: a0 = t + 1 bir hata verecektir. – user836925

1

Yaklaşımınız iyidir, ancak sembol adlarını ayrı ayrı kaydetmeniz gerekmez (sembolün adına name özelliği aracılığıyla erişebilirsiniz).

Ayrıca, biraz daha öz (hayır daha verimli olsa da) sembolü oluşturma ifade edebileceği, örneğin:

symbolList = map(lambda i: Symbol('t' + str(i)), xrange(numEquations)) 

Ancak, kullanımı durumda (geçici değişkenler) için, kukla değişkenler muhtemelen yoludur içten Dummy sınıfı da benzersiz isimler oluşturma için bir sayaç kullanıyor beri

symbolList = map(Dummy, xrange(numEquations)) 

Bu gerçekten artık verimli değildir, ama biraz daha temiz ve çok daha net: gidin.

otomatik döner dict bir alt sınıfını yapabilir
1

Symbols:

symbols fonksiyonu kolayca sembollerin listeleri oluşturmak için kullanılabilir
import sympy as sym 

class SymDict(dict): 
    # http://stackoverflow.com/a/3405143/190597 
    def __missing__(self, key): 
     self[key]=sym.Symbol(key) 
     return self[key] 

def solveEquations(numEquations): 
    symbol = SymDict() 
    symbolList = ['t'+str(i) for i in range(numEquations)] 
    equationList = [sum(symbol[s]**i for s in symbolList) 
        for i in range(numEquations)] 
    print(equationList) 

solveEquations(3)  
# [3, t0 + t1 + t2, t0**2 + t1**2 + t2**2] 
7

numbered_symbols("t")t0 üreten bir jeneratör dönecektir , t1, t2, vb. Farklı bir başlangıç ​​seçmek için start parametresini kullanabilirsiniz. alue. Kukla değişkenler kullanmak istiyorsanız, numbered_symbols("t", cls=Dummy)'u kullanın.

1

locals() ve sözlük anlamında, yinelemeli olarak benzer bir adla hem sembolleri hem de python yerel değişkenlerini oluşturabilirsiniz. Örneğin:

>>> symbols_dict = dict(('a%d'%k, symbols('a%d'%k)) for k in range(3)) 
>>> locals().update(symbols_dict) 

çalıştığını kontrol edilmesi:

>>> print(expand((a0+a2)*(a0+a1**2))) 
a0**2 + a0*a1**2 + a0*a2 + a1**2*a2