Sympy - 合理化表达式中的所有数值? (就像Mathematica的Rationalize [])

时间:2012-10-08 03:03:11

标签: python fractions sympy

是否有一种简单的方法(尝试)合理化给定delta中表达式中的所有数值,就像Mathematica中的Rationalize[]一样?

Mathematica中的一个例子:

In[25]:= Rationalize[0.5 x^2 - 3.333333 x, 10^-4]
Out[25]= x^2/2-(10 x)/3

我看到了nsimplify()功能,但这看起来有点矫枉过正。

3 个答案:

答案 0 :(得分:4)

我不知道nsimplify是如何过度杀人的。 nsimplify完全符合您的要求,因为您可以将它传递给SymPy表达式,并且它将合理化表达式中的术语

>>> print nsimplify(0.5*x**2 - 3.333333*x, tolerance=0.001, rational=True)
x**2/2 - 3333333*x/1000000

(容差关键字似乎不起作用,我猜这是一个错误)。

答案 1 :(得分:2)

您可以使用Fraction.from_float

>>> from fractions import Fraction
>>> Fraction.from_float(0.5)
Fraction(1, 2)

即使它似乎不如Mathematica聪明:

>>> Fraction.from_float(3.33333333)
Fraction(7505999371444827, 2251799813685248)

它实际上只是简单地将浮点数转换为其精确的有理表示(因此不能将浮点数精确写入的数字不能“正确”转换)。

你可以获得更多“人类可读”的限制分母:

>>> Fraction.from_float(3.333333333).limit_denominator(10)
Fraction(10, 3)

即使理解为获得“正确”分数应该设置哪个限制也很棘手,并且由于浮动表示,可能仍然无法获得它。

如果你必须留在sympy,我认为你不能避免使用nsimplify, 这似乎是出于这样的目的写的。

编辑:从python2.7 +您只需拨打Fraction(0.5)而不是使用from_float方法。

答案 2 :(得分:0)

由于您使用的是Sympy,您还可以从mpmath模块访问pslq函数;这将使您能够找到有理数与1之间最相关的线性关系:

>>> from mpmath import pslq, mpf
>>> from sympy import sympify
>>> l = pslq([ mpf('.3333333333333333333333', 1])
>>> -l[1]/sympify(l[0])
1/3