for循环中的Sympy求解器错误?

Sympy solver bug in a for loop?

所以我正在使用 Sympy 来构建一个通用的 solver/generator 物理问题。一个组成部分是我正在寻找一个函数,该函数将接受 kwargs,并根据它得到的结果,rear运行ge 方程并替换其中的值。感谢 SO,我设法找到了我需要的东西。

但是.....我已经尝试将sympy.solve放入for循环中以生成所有这些表达式并且我已经运行进入...一些东西。

import sympy
R, U, I, eq = sympy.symbols('R U I eq')
eq = R - U/I
for x in 'RUI':
    print(x)
    print(sympy.solve(eq, x))

输出?

R
[U/I]
U
[I*R]
I
[]

但是,每当我执行 sympy.solve(eq, I) 时它都有效并且 returns [U/R].

现在,我猜问题出在 sympy 使用 I 作为虚数单位并且变量隐藏在块中,但即使我 t运行sfer 循环中的符号声明(还有等式),我仍然遇到同样的问题。

我不确定我最终是否会非常需要它,但至少可以说这很有趣。

它更像是一个未记录的功能,而不是一个错误。循环 for x in 'RUI' 等同于 for x in ['R', 'U', 'I'],这意味着 x 在一个字符 strings 上运行,而不是 sympy 符号。在循环中插入 print(type(x)) 可以看到这一点。并注意 sympy.solve(eq, 'I') returns [].

循环 for x in [R, U, I] 对每个变量都正确求解。这是编写此循环的正确方法。

令人惊讶的是,当将字符串作为 solve 的第二个参数传递时,您会得到任何结果。 Sympy documentation 不在可接受的参数中列出字符串。显然,它试图将字符串强制转换为一个 sympy 对象,并且并不总是正确地猜测您的意思:适用于 sympy.solve(eq, 'R') 但不适用于 sympy.solve(eq, 'I')

问题是一些 sympy 函数 "accidentally" 使用字符串作为输入,因为它们在输入时调用 sympify。但是 sympify('I') 给出的是虚数单位 (sqrt(-1)),而不是符号 ('I')。

你应该总是像

那样明确地定义你的符号
R, U, I = symbols("R U I")

并使用它们代替字符串。

有关为什么应避免将字符串与 SymPy 一起使用的更多信息,请参阅 https://github.com/sympy/sympy/wiki/Idioms-and-Antipatterns#strings-as-input