是否有一种简单的方法(尝试)合理化给定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()
功能,但这看起来有点矫枉过正。
答案 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