2012-02-29 4 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

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

+1

그것은 또한 문자 :'symbols ('a : g')'에서 작동합니다. – asmeurer

+2

sympy에서 이것은 튜플이 아니라 목록입니다.약간의 차이가 있습니다. 원칙적으로 목록의 요소에 대해 사물을 정의 할 수 없습니다. a0 = t + 1은 오류를 줄 것입니다. – user836925

1

심볼 이름을 따로 저장할 필요는 없지만 (심볼 이름은 name 속성을 통해 액세스 할 수 있습니다.) 접근법은 훌륭합니다.

또한, 당신은 좀 더 간결하게 (더 효율적으로하지만) 심볼 생성을 표현할 수있는, 예를 들면 :

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

그러나, 사용 사례 (임시 변수)에 대한 더미 변수는 아마로가는 길이다 내부적으로 Dummy 클래스는 고유 한 이름을 생성하는 카운터를 사용하고 있기 때문에,

symbolList = map(Dummy, xrange(numEquations)) 

이 정말 더 이상 효율적이지 않습니다,하지만 조금 더 깨끗하고 선명한입니다 : 이동합니다.

당신은 자동으로 반환 dict의 서브 클래스를 만들 수
1

Symbols :

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를 생성하는 발전기를 반환합니다 , t1, t2start 매개 변수를 사용하여 다른 시작 v를 선택할 수 있습니다 alue. 더미 변수를 사용하려면 numbered_symbols("t", cls=Dummy)을 사용하십시오.

1

locals()으로 사전의 독해력을 사용하면 비슷한 이름의 기호와 파이썬 지역 변수를 반복적으로 생성 할 수 있습니다. 예를 들어 :

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