Sympy可以使用int params,但可以使用浮点数旋转

时间:2016-08-07 18:35:54

标签: floating-point sympy

我在mac上使用sympy 1.0和python 2.7.10。问题是如果我使用浮点数作为参数而不是整数,那么solve()似乎永远旋转。

这是我的脚本,其中a,b和c指定为int,如图所示。它提供以下输出,包括或不包括a,b和c:

from sympy import *

x = symbols('x')
a = 500
b = 10
c = 333

y = a + b * (x - c) - (a * (x / c) + x * b * log(x / c))

print 'y=', y

solution = solve(y, x)
print 'solve() gives:', solution

打印:

y= -10*x*log(x/333) + 2830*x/333 - 2830
solve() gives: [333*exp(LambertW(-283*exp(-283/333)/333) + 283/333)]

这是正确的,因为我已经通过使用nsolve()进行数值求解并与独立计算的解决方案进行比较来验证。

现在,我将a,b和c的定义更改为:

a = 500.0
b = 10.0
c = 333.0

然后输出如下:

y= -10.0*x*log(0.003003003003003*x) + 8.4984984984985*x - 2830.0

有了这个,solve()旋转,似乎永远。请注意,此表达式在数值上显示正确。

同样,问题是:如何在sympy方程中使用浮点参数?

2 个答案:

答案 0 :(得分:1)

我认为问题在于,默认情况下求解会将浮点数转换为有理数,这会在日志反转时产生巨大的权力。 solve(rational=False)应该关闭此功能,但对我而言,这会导致solve失败并显示NotImplementedError。我为它打开了an issue

答案 1 :(得分:0)

无法说明为什么Sympy遇到麻烦,但是,我怀疑它与浮点表示不确切有关。

一种解决方法是solve而不明确指定参数abc,然后使用.subs()

import sympy as sp
x, a, b, c = sp.symbols('x, a, b, c')
y = a + b * (x - c) - (a * (x / c) + x * b * sp.log(x / c))
sol = sp.solve(y, x)

# find the second root manually by considering the k=-1 branch 
# (solve provides only the k=0 branch)
sol_two_branches = [sol[0], sol[0].replace(sp.LambertW, lambda *args: sp.LambertW(*args,-1))]

print([s.subs({a:500,b:10,c:333}).n() for s in sol_two_branches])
[333.000000000000, 242.528588686908]

P.S。:@asmeuer因为LambertW

的分支选择选项而对我不屑一顾