使用 Sympy 查找系数不包括平方根 (sqrt) 作为值

Finding coefficients using Sympy doesn't include square root (sqrt) as value

在 SymPy 中,有一个有用的功能可以为给定的表达式创建系数字典。

但是,我遇到了一个恼人的错误(/功能?),平方根被认为是变量的一部分,而不是系数值的一部分。

最小示例:

from sympy import sqrt, symbols
k, t = symbols('k, t') 
d = 1.5*t + 2.5*sqrt(2)*k 
d.as_coefficients_dict()           

这个returns:

{:1.5, sqrt(2)*:2.5}

相反,sqrt(2) 应被视为系数的一部分。因此,我希望看到结果:

{:1.5, :2.5*sqrt(2)}

注意,我使用的是最新的 SymPy 1.4 版

这是一个错误吗?或者使用该函数获取预期值的替代方法?

编辑:我修改了问题以注意我正在使用 Sympy sqrt 函数。我还尝试使用 NumPy 的 np.sqrt,它的计算正确,但给出的是完整的数值,而不是 k 系数值的漂亮整洁的 sqrt(2)。

documentation 明确指出:

Return a dictionary mapping terms to their Rational coefficient.

首先,这是预期的行为。要看到这一点,您可以注意到 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}