Calculs avec SYMPY : Comment obtenir des évaluations numériques fractionnaires

Fermé
getudir78 Messages postés 29 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 - 6 mai 2019 à 15:14
getudir78 Messages postés 29 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 - 14 mai 2019 à 00:09
Bonjour,

Pour pouvoir calculer simplement le quotient euclidien de deux polynômes à coefficients fractionnaires , j'utilise SYMPY comme le montre le programme ci-après. Tous les calculs se passent bien et donnent des résultats avec des coefficients fractionnaires comme souhaité.
Le problème apparaît lors des calculs de valeurs numériques avec evalf() ou N() : Les résultats sont automatiquement donnés en nombres flottants.
Est-il possible de les les obtenir au choix, soit en nombres fractionnaires (Rational), soit en nombre flottants ?
Je vous remercie par avance, pour l'aide que vous pourrez m'apporter.
Cordialement vôtre,
Getudir78
------------------------------------------------------------------------------------------------------
from sympy import *
x = symbols('x', domain='QQ')
f = Rational('5/7')*x**2 + Rational('10/7')*x +Rational('3/7')
ff = f.as_poly(domain='QQ')
print(" ff = ", ff)

g = Rational('2/3')*x + Rational('7/2')
gg = g.as_poly(domain='QQ')
print(" gg = ", gg)
q, r = div(ff, gg, domain='QQ')
print(" q = ", q)
print(" r = ", r)
cc = (q*gg + r).expand()
print(" cc = ", cc)
# Les calculs formels se passent bien
# Evaluation numérique des résultats
print(" val num = ", ff(Rational('2/7')).evalf(5))
print(" val num = ", N(ff(Rational('2/7'))))
# les résultats sont des nombres flottants
#
# EST-IL POSSIBLE DE FORCER evalf() ou N() A FOURNIR DES RESULTATS FRACTIONNAIRES (Rational)

Configuration: Windows / Firefox 66.0

1 réponse

Bonjour,

Tu peux peut-être mettre le résultat d'un nombre flottant dans une variable et transformer cette variable en résultat fractionnaire avec simpify:

sympify("0.2345", rational=True)

469/2000
0
getudir78 Messages postés 29 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 33
14 mai 2019 à 00:09
Merci pour ta contribution. Si le nombre flottant a un développement décimal qui inclut moins de chiffre que le nombre de chiffres significatifs du format flottant, on obtient bien par sympify un nombre rationnel rigoureusement égal au nombre flottant. Mais si le développement décimal du nombre flottant est périodique, la fraction est fabriquée sur la base du nombre de chiffres significatifs, ce qui introduit une différence entre le flottant et le rationnel qui ne sont
plus rigoureusement égaux.
Je suis parti sur d'autres bases : J'ai utilisé "sympy" pour créer des polynômes à coefficients rationnels
x = symbols('x', domain='QQ')
f = Rational('5/1')*x**2 + Rational('10/1')*x +Rational('3/1') (per exemple)
et j'ai utilisé la fonction "div" pour diviser des polynômes à coefficients rationnels, par exemple, le polynôme ff par gg,
q, r = div(ff, gg, domain='QQ')
où a = quotient et r = reste.Dans ces conditions, la division de deux polynômes à coefficients rationnels, fournit les polynômes quotient et reste avec des coefficients rationnels exacts; ce qui résout la problème que je m'étais posé.
0