初始化可变数量的 sympy 符号

问题描述 投票:0回答:2

每当你想使用 python 包 sympy(一个用于符号计算的包)时,你需要将变量初始化为

x, y, z = symbols('x y z')

对于我的应用程序,我需要的符号数量不是固定的。我只有必须计算的信息,例如4个变量。

有没有一种聪明的方法可以写信给例如初始化

a,b,c = symbols('a b c')

当我需要三个变量时

a,b,c,d,e = symbols('a b c d e')

当我需要五个变量时? 如果我需要比字母表中的字母更多的变量, 该函数应该开始初始化

aa, ab, ac,... .
sympy python-3.7
2个回答
4
投票

您可以使用

symbols
中的切片符号来创建编号符号,例如

In [16]: symbols('a1:100')                                                                                                        
Out[16]: 
(a₁, a₂, a₃, a₄, a₅, a₆, a₇, a₈, a₉, a₁₀, a₁₁, a₁₂, a₁₃, a₁₄, a₁₅, a₁₆, a₁₇, a₁₈, a₁₉, a₂₀, a₂₁, a₂₂, a₂₃, a₂₄, a₂₅, a₂₆, a₂₇, a
₂₈, a₂₉, a₃₀, a₃₁, a₃₂, a₃₃, a₃₄, a₃₅, a₃₆, a₃₇, a₃₈, a₃₉, a₄₀, a₄₁, a₄₂, a₄₃, a₄₄, a₄₅, a₄₆, a₄₇, a₄₈, a₄₉, a₅₀, a₅₁, a₅₂, a₅₃,
 a₅₄, a₅₅, a₅₆, a₅₇, a₅₈, a₅₉, a₆₀, a₆₁, a₆₂, a₆₃, a₆₄, a₆₅, a₆₆, a₆₇, a₆₈, a₆₉, a₇₀, a₇₁, a₇₂, a₇₃, a₇₄, a₇₅, a₇₆, a₇₇, a₇₈, a₇
₉, a₈₀, a₈₁, a₈₂, a₈₃, a₈₄, a₈₅, a₈₆, a₈₇, a₈₈, a₈₉, a₉₀, a₉₁, a₉₂, a₉₃, a₉₄, a₉₅, a₉₆, a₉₇, a₉₈, a₉₉)

如果你想要 n 个符号,其中 n 是一个整数,你可以这样做

syms = symbols('a1:%d' % n)

0
投票

您可以使用

locals()
定义新的变量符号,如下所示:

from sympy import Symbol
for i in range(10):
    locals()[f"x{i}"] = Symbol(f"x{i}")

检查:

type(x0)
# Out: 
# sympy.core.symbol.Symbol

print((x0+x1**2)/x3)
# Out:
# (x0 + x1**2)/x3

精美印刷:

from sympy import init_printing
init_printing()
display((x0+x1*x1)/x3)
#        2
# x₀ + x₁ 
# ────────
#    x₃   

这样,变量

x0
就是符号
x₀
,并且您不需要额外的括号来从列表中获取符号。

来自文档:函数

locals()
返回

表示当前局部符号表的映射对象,以变量名作为键,其当前绑定的引用作为值。

使用
vars()

或者,使用

vars(obj)
为模块、类、实例或任何其他具有
obj
的对象
__dict__
中的符号提供更好的定义范围(请注意,没有参数
vars()
是等效的)到
locals()
)。

这是一个使用

vars()
的小演示:

from sympy import Symbol

class MyClass:
    def sum_vars(self):
        return sum([vars(self)[v] for v in vars(self)])
a = MyClass()

a.sum_vars()
# Out:
# 0

for i in range(10): 
     vars(a)[f"y{i}"] = Symbol(f"y{i}")
a.sum_vars()
# Out:
#  y₀ + y₁ + y₂ + y₃ + y₄ + y₅ + y₆ + y₇ + y₈ + y₉

s = a.sum_vars()
type(s)
# Out: 
# sympy.core.add.Add
s*s
# Out:
#                                                  2
# (y₀ + y₁ + y₂ + y₃ + y₄ + y₅ + y₆ + y₇ + y₈ + y₉) 

但请注意

type(y0)
# Out:
# NameError: name 'y0' is not defined
© www.soinside.com 2019 - 2024. All rights reserved.