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.
3 Antworten
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.)
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
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.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.