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。
所以我正在使用 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。