【发布时间】:2018-01-16 14:58:34
【问题描述】:
我尝试在 sympy 中解决以下不等式:
(10000 / x) - 1 < 0
于是我发出了命令:
solve_poly_inequality( Poly((10000 / x) - 1 ), '<')
但是,我得到了:
[Interval.open(-oo, 1/10000)]
但是,我的手动计算给出了 x 10000。
我错过了什么?由于 -1,我无法将其表示为有理函数。
提前致谢!
【问题讨论】:
我尝试在 sympy 中解决以下不等式:
(10000 / x) - 1 < 0
于是我发出了命令:
solve_poly_inequality( Poly((10000 / x) - 1 ), '<')
但是,我得到了:
[Interval.open(-oo, 1/10000)]
但是,我的手动计算给出了 x 10000。
我错过了什么?由于 -1,我无法将其表示为有理函数。
提前致谢!
【问题讨论】:
您正在使用低级求解程序。我建议使用更高级别的例程 solve 或 solveset,例如
>>> solveset((10000 / x) - 1 < 0, x, S.Reals)
(−∞, 0) ∪ (10000, ∞)
您的尝试正确但看起来错误的原因是您没有指定要使用的生成器,因此 Poly 使用 1/x 作为其变量(我们称之为 g)因此它解决了问题 1000*g - 1 < 0.. .当 g 小于您发现的 1/1000 时,这是正确的。
你可以通过写来查看这个生成器标识
>>> Poly(1000/x - 1)
Poly(1000*1/x - 1, 1/x, domain='ZZ')
【讨论】:
solve_poly_inequality 吸引的原因也是它的solve_poly_inequalities 不等式系统的变体。再次感谢!
Poly 命令的基本文档。因此,如果有人缺少基础知识,那么接下来的一切都会变得非常复杂。如果你在网上搜索“sympysolvequality”,你最终会在这里:docs.sympy.org/latest/modules/solvers/inequalities.html,没有任何评论说最好只使用 solveset(这也更舒服)
10000/x-1 不是x 中的多项式,而是1/x 中的多项式。相反,10000/x-1 是x 中的rational function。虽然你可以尝试输入Poly(1000*1/x - 1, x, domain='ZZ'),但会有错误
PolynomialError: 1/x contains an element of the generators set
因为根据定义10000/x-1 不能是x 中的多项式。因此,你不能用这个来进行计算。
您也可以尝试关注或其他求解器。
from sympy.solvers.inequalities import reduce_rational_inequalities
from sympy import Poly
from sympy.abc import x
reduce_rational_inequalities([[10000/x - 1 < 0]], x)
((-oo < x) & (x < 0)) | ((10000 < x) & (x < oo))
【讨论】: