首页 文章

SymPy - 任意数量的符号

提问于
浏览
17

我正在编写一个函数来解决任意数量的联立方程 . 方程的数量由函数的一个参数设置,每个方程由许多符号构成 - 与方程一样多的符号 . 这意味着我不能简单地对方程式进行硬编码,甚至不需要将方程组合在一起所需的符号;该函数需要能够处理任意数量的方程 . 所以,我的问题是,如何生成符号列表?

我有一个可能的解决方案,但我的直觉告诉我,它不会非常有效 . 如果有更好的方法,请告诉我 .

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

这是最好的方法吗,还是有更有效的方法?

5 回答

  • 7

    你的方法没问题,尽管 name 的名字来自 name .

    此外,您可以更简洁地表达符号创建(尽管不会更有效),例如:

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

    但是,对于您的用例(临时变量),虚拟变量可能是要走的路:

    symbolList = map(Dummy, xrange(numEquations))
    

    这实际上并没有更高效,因为 Dummy 类内部也使用计数器生成唯一的名称,但它更清晰,更清晰 .

  • 2

    你可以创建 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]
    
  • 1

    numbered_symbols("t") 将返回生成 t0t1t2 等的生成器 . 您可以使用 start 参数选择不同的起始值 . 如果要使用虚拟变量,请使用 numbered_symbols("t", cls=Dummy) .

  • 1

    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₁₄)
    
  • 28

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

相关问题