SymPy - 任意数量的符号

tho*_*ate 21 python symbols sympy equation-solving

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

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

我是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...
Run Code Online (Sandbox Code Playgroud)

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

MRo*_*lin 34

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??)
Run Code Online (Sandbox Code Playgroud)

  • 这里只是一个注释,同意这是一个元组而不是列表......存在细微的差别,主要是,一个不能定义列表元素的东西:a0 = t + 1会给出错误. (2认同)

asm*_*rer 10

numbered_symbols("t")将返回生成一个发电机t0,t1,t2,等你可以使用start参数来选择不同的初始值.如果你想使用虚拟变量,请使用numbered_symbols("t", cls=Dummy).


小智 7

不知道是否向该主题添加更多有用的信息,但我使用以下方法创建符号变量列表:

x = [sympy.symbols('x%d' % i) for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

然后我可以在等式中正常使用它:

eq = x[0]**2 + x[1]*2 + x[2]
print(sympy.diff(eq,x[0]))
>>> 2*x0
Run Code Online (Sandbox Code Playgroud)