我在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方程中使用浮点参数?
答案 0 :(得分:1)
我认为问题在于,默认情况下求解会将浮点数转换为有理数,这会在日志反转时产生巨大的权力。 solve(rational=False)
应该关闭此功能,但对我而言,这会导致solve
失败并显示NotImplementedError
。我为它打开了an issue。
答案 1 :(得分:0)
无法说明为什么Sympy遇到麻烦,但是,我怀疑它与浮点表示不确切有关。
一种解决方法是solve
而不明确指定参数a
,b
和c
,然后使用.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