因此,我正在与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循环内传递符号声明(以及方程式),我仍然遇到同样的问题。
我不确定最终我会非常需要这个,但至少可以说这很有趣。
答案 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。