求解方程 - 溢出误差

时间:2013-07-19 20:30:23

标签: equation sympy

基本上我只想解决k。请注意,等式等于1.12

import math
from sympy import *

a = 1.45
b = 4.1
c = 14.0

al = math.log(a, 2)
bl = math.log(b, 2)
cl = math.log(c, 2)

k = symbols('k')

print solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k)

这会引发OverflowError: Python int too large to convert to C long

也欢迎使用其他图书馆的解决方案。

2 个答案:

答案 0 :(得分:4)

由于您使用的是数值,我假设您正在寻找数值解法。在这种情况下,您不应该使用solve,因为它试图找到符号解决方案。这里的问题是它将这些浮点指数转换为有理指数,它们具有非常大的分子和分母,然后它在某个时刻试图使度数的多项式对应于那些大数,这是它失败的地方。

要以数字方式解决,您可以使用nsolve

>>> print nsolve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), 2)
1.82427203413783

如果您对数字解决方案感兴趣,最好使用像SciPy这样的数字库。您可以使用lambdify将SymPy表达式转换为更适合使用NumPy数组的SciPy等库的函数。

答案 1 :(得分:1)

这是一个众所周知的issue

您可以尝试

solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k, rational=False)