每当你想使用 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,... .
您可以使用
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)
您可以使用
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