6

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

Mathematica 中的一个例子:

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

我看到了这个nsimplify()功能,但这似乎有点矫枉过正。

4

3 回答 3

6

我不明白nsimplify杀戮是如何结束的。 nsimplify完全符合您的要求,因为您可以将 SymPy 表达式传递给它,它将使表达式中的术语合理化

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

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

于 2012-10-09T04:04:38.930 回答
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方法。

于 2012-10-08T07:05:31.100 回答
0

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

>>> from mpmath import pslq, mpf
>>> from sympy import sympify
>>> l = pslq([ mpf('.3333333333333333333333', 1])
>>> -l[1]/sympify(l[0])
1/3
于 2015-11-25T16:26:05.163 回答