Gibt es eine einfache Methode, um alle numerischen Werte in einem Ausdruck innerhalb eines bestimmten Deltas zu rationalisieren, ähnlich wie Rationalize[] in Mathematica?

Ein Beispiel in Mathematica:

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

Ich sehe die nsimplify() Funktion, aber das scheint übertrieben.

5
eacousineau 8 Okt. 2012 im 07:03

3 Antworten

Beste Antwort

Ich sehe nicht, wie nsimplify vorbei ist. nsimplify macht genau das, was Sie wollen, weil Sie ihm einen SymPy-Ausdruck übergeben können, und es wird die Begriffe im Ausdruck rationalisieren

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

(Das Toleranz-Schlüsselwort scheint nicht zu funktionieren, was meiner Meinung nach ein Fehler ist.)

4
asmeurer 9 Okt. 2012 im 04:04

Da Sie Sympy verwenden, können Sie auch über das mpmath-Modul auf die Funktion pslq zugreifen. Auf diese Weise können Sie die relevanteste lineare Beziehung zwischen einer rationalen Zahl und 1 finden:

>>> from mpmath import pslq, mpf
>>> from sympy import sympify
>>> l = pslq([ mpf('.3333333333333333333333', 1])
>>> -l[1]/sympify(l[0])
1/3
0
Thomas Baruchel 25 Nov. 2015 im 16:26

Sie können Fraction.from_float verwenden:

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

Auch wenn es weniger klug erscheint als Mathematica:

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

Es konvertiert den Float tatsächlich einfach in seine exakte rationale Darstellung (Zahlen, die nicht genau als Floats geschrieben werden können, werden also nicht "korrekt" konvertiert).

Sie können den Nenner besser "lesbar" machen:

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

Auch wenn es schwieriger ist zu verstehen, welche Grenze Sie setzen sollten, um den "richtigen" Bruch zu erhalten, und es kann vorkommen, dass es aufgrund der Float-Darstellung immer noch unmöglich ist, ihn zu erhalten.

Wenn Sie bei sympy bleiben müssen, können Sie die Verwendung von nsimplify meiner Meinung nach nicht vermeiden. das scheint genau für solche Zwecke geschrieben zu sein.

Edit: ab python2.7 + kannst du einfach Fraction(0.5) aufrufen, anstatt die from_float Methode zu verwenden.

2
Bakuriu 8 Okt. 2012 im 07:21