在SymPy中,有一个有用的功能来为给定的表达式创建系数字典。
但是,我遇到了一个恼人的错误(/ feature?),其中平方根被认为是变量的一部分,而不是系数值的一部分。
最小例子:
from sympy import sqrt, symbols
k, t = symbols('k, t')
d = 1.5*t + 2.5*sqrt(2)*k
d.as_coefficients_dict()
返回:
{𝑡:1.5, sqrt(2)*𝑘:2.5}
相反,sqrt(2)应被视为系数的一部分。因此,我希望看到结果:
{𝑡:1.5, 𝑘:2.5*sqrt(2)}
NB,我正在使用最新的SymPy 1.4版
这是一个错误吗?或者使用该函数获取预期值的另一种方法是什么?
编辑:我修改了问题,注意我正在使用Sympy sqrt函数。我也尝试使用NumPy的np.sqrt,它正确评估,但给出了完整的数值,而不是k系数值的一个漂亮的整齐sqrt(2)。
documentation明确指出:
返回将术语映射到其Rational系数的字典。
首先,这是预期的行为。要看到这一点,你可以注意到sqrt不是问题,而是系数是不合理的。如果我们采用合理系数,我们会得到您预期的行为:
>>> from sympy import sqrt, symbols
>>> k, t = symbols('k, t')
>>> d = 1.5*t + 2.5*sqrt(4)*k
>>> d.as_coefficients_dict()
{k: 5.00000000000000, t: 1.50000000000000}
解决问题的一种方法是使用给定变量明确查询每个系数:
>>> from sympy import sqrt, symbols
>>> k, t = symbols('k, t')
>>> d = 1.5*t + 2.5*sqrt(2)*k
>>> {sym : d.coeff(sym) for sym in (k, t)}
{k: 2.5*sqrt(2), t: 1.50000000000000}