for循环中的Sympy solver bug?

时间:2016-03-28 11:09:39

标签: python-3.x sympy

因此,我正在与Sympy一起努力构建物理问题的通用求解器/生成器。其中一个组成部分就是我要使用一个能够接受kwargs的函数,根据它得到的结果,重新排列等式并替换它中的值。多亏了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)时,它都有效并返回[U/R]

现在,我猜测问题是使用I表示想象单位和变量隐藏在块中,但即使我在for循环内传递符号声明(以及方程式),我仍然遇到同样的问题。

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

2 个答案:

答案 0 :(得分:2)

它更像是一个没有文档的功能,而不是一个bug。循环for x in 'RUI'相当于for x in ['R', 'U', 'I'],意味着x运行一个字符字符串,而不是同情符号。在循环中插入print(type(x))以查看此内容。请注意sympy.solve(eq, 'I')会返回[]

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

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

答案 1 :(得分:1)

问题是某些sympy函数“意外地”使用字符串作为输入,因为它们在输入上调用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