使用范围创建的 Sympy Call 符号

Sympy Call symbols created using a range

我正在尝试能够为 DH table 创建符号,而是将其写出来,创建一个函数。但是,我不知道如何在制作table时调用变量。这是问题的概要:

from sympy import *


def naming_symbols(N):
    theta = symbols(f"theta:{N}")
    L = symbols(f"L:{N}")
    alpha=symbols(f"alpha:{N}")
    d=symbols(f"d:{N}")
    pprint(theta[:])
    pprint(L[:])
    pprint(alpha[:])
    pprint(d[:])
    return theta, L, alpha, d


naming_symbols(3)
print(theta2)

returns:

"*FileName*", line 18, in <module>
    print(theta2)
NameError: name 'theta2' is not defined
(θ₀, θ₁, θ₂)
(L₀, L₁, L₂)
(α₀, α₁, α₂)
(d₀, d₁, d₂)

Process finished with exit code 1

这与“theta_2”和“theta”相同

如何调用创建的符号?例如,我想将“theta2”放在 table 中,但它不会将其识别为创建的符号。我想我需要将符号添加到字典或其他东西中,但也不知道该怎么做。我还以为创作会把它加到字典里呢……不过……好吧,求助啊

符号(SymPy 创建的 python 对象)和您分配给它的变量之间存在差异。您已经知道可以随意调用 1 之类的值:

>>> x = 1
>>> y = 1

您创建的符号也是如此。

>>> my_x = Symbol('x'); my_x
x

惯例是经常使用与符号名称匹配的变量名称,但这不是必需的。请注意,打印 my_x(变量)显示 x(符号)。

symbols 命令创建符号元组。您可以随意调用该元组,就像您可以使用数值一样

>>> v = (1, 2); v[0]
1
>>> my_v = symbols('v:3'); my_v[0]
v0

您的函数正在创建符号元组。您正在从函数中分配(并返回)这些元组。为了在函数的 外部 本地使用那些,你必须为元组的元素创建 python 变量名,或者你可以像元组一样通过索引访问它们 v 上面定义:

>>> one, two = v  # assigning names for the tuple elements
>>> one
1
>>> v[1]  # using index to the tuple name `v`
2

>>> naming_symbols(2)
(θ₀, θ₁)
(L₀, L₁)
(α₀, α₁)
(d₀, d₁)
((theta0, theta1), (L0, L1), (alpha0, alpha1), (d0, d1))
>>> t, l, a, d = _  # assigning names to the tuples
>>> t[0]
theta0
>>> t0,t1 = t  # assigning names to the elements of a tuple
>>> t0
theta0

___ 可能到此为止,但请注意...

可以使用 var 命令而不是 symbols 命令在本地为变量创建名称。学习如何执行上述操作可能对您更好,但这是使用 var:

的示例
>>> def do(n):
...     var(f'y:{n}')
...

直到这个函数是运行,y0没有定义

>>> y0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y0' is not defined

但是在运行n=3 之后,y0、y1 和 y2 将存在于 python:

的本地命名空间中
>>> do(3)
>>> y0
y0
>>> y1
y1

请注意,使用了命名约定——通过匹配的变量名称调用 SymPy 符号。这仅在您创建的符号名称是有效的 python 变量名称时才有效。因此,尽管 var('x(1)') 将创建一个名称为 x(1) 的符号,但您不能键入它来使用变量:

>>> var('x(1)')
x(1)
>>> x(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Symbol' object is not callable
>>> y=_  # assign the name y to this Symbol
>>> y
x(1)