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

时间:2019-04-15 10:27:45

标签: python sympy symbolic-math sqrt

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

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

最小示例:

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)}

注意,我正在使用最新的SymPy版本1.4

这是一个错误吗?还是使用该函数获取期望值的另一种方法?

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

1 个答案:

答案 0 :(得分:1)

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}