2012-02-29 127 views
15

我正在編寫一個函數來解決任意數量的聯立方程。等式的數量由函數的其中一個參數設置,每個等式都由多個符號構成 - 與等式一樣多的符號。這意味着我不能簡單地對方程進行硬編碼,甚至不需要將方程組合在一起所需的符號;該功能需要能夠處理任意數量的等式。所以,我的問題是,我如何產生一個符號列表?SymPy - 任意數量的符號

我有一個可能的解決方案,但我的直覺告訴我,它不會非常有效。請讓我知道是否有更好的方法來做到這一點。

我是新來的SymPy,我仍然感覺我的方式。就我所見,符號需要用一個字符串來定義。因此,我可以通過在字母上添加遞增數字(例如't0','t1'等)來產生一系列字符串,將它們添加到列表中,然後使用這些字符串作爲參數來創建符號。這些符號本身將存儲在一個列表中,並將用於生成方程。

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... 

這是做這件事的最好方法,還是有更高效的方法?

回答

24

symbols功能可用於方便地生成的符號列表

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

謝謝!這看起來很簡單。 – thornate 2012-02-29 07:22:47

+1

它也適用於字母:'符號('a:g')'。 – asmeurer 2012-12-28 10:06:13

+2

只是在這裏注意,在sympy這是一個元組,而不是一個列表...主要是一個不能定義的東西列表中的元素:a0 = t + 1會給出錯誤。 – user836925 2014-01-31 16:50:24

1

您的方法很好,但不需要單獨存儲符號名稱(您可以通過其name屬性訪問符號名稱)。

此外,您還可以表達符號創建多一點簡潔(雖然沒有更有效的),例如:

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

然而,對於你的使用情況(臨時變量),虛擬變量可能的方式去:

symbolList = map(Dummy, xrange(numEquations)) 

這是不是真的任何更有效,因爲內部的Dummy類也使用一個計數器來生成唯一的名稱,但它是一個有點更乾淨,更清晰。

1

你可以做的dict自動返回一個子類Symbols

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發電機,t1t2等。您可以使用start參數來選擇不同的起始v ALUE。如果您想使用虛擬變量,請使用numbered_symbols("t", cls=Dummy)

1

隨着locals()和字典的理解,你可以反覆生成符號和python局部變量具有相似的名稱。例如:

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

檢查它的工作原理:

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