Bonjour,
Quelqu'un sait-il comment éviter ça :
Je parle évidemment des 1.22...e-06jCode:
1
2
3
4
5 IDLE 2.6.4 >>> from scipy import * >>> p = poly1d([0.000025, 0.01, 1]) >>> p.r array([-200. +1.22664340e-06j, -200. -1.22664340e-06j])
Merci d'avance
Version imprimable
Bonjour,
Quelqu'un sait-il comment éviter ça :
Je parle évidemment des 1.22...e-06jCode:
1
2
3
4
5 IDLE 2.6.4 >>> from scipy import * >>> p = poly1d([0.000025, 0.01, 1]) >>> p.r array([-200. +1.22664340e-06j, -200. -1.22664340e-06j])
Merci d'avance
Les racines d'un polynômes peuvent toujours être complexes, c'est à toi de voir si la partie imaginaire est négligeable ou pas.
J'ai déjà un code pour çaCitation:
c'est à toi de voir si la partie imaginaire est négligeable ou pas
Je suis juste un peu étonné par le manque de précision du résultat ... et un peu déçu peut-être.
Merci pour ta réponse.
Bonjour,
Les calculs sont faits en double précision, et même si tous les chiffres significatifs ne sont pas affichés, ils sont cependant présents et utilisés dans les calculs:
Dans cet exemple, on retrouve bien les 17 chiffres de la double précision.Code:
1
2
3
4
5
6
7
8
9
10 from scipy import * p = poly1d([0.0025, 0.01, 1]) print p.r [-2.+19.89974874j -2.-19.89974874j] print repr(p.r[0].imag) 19.899748742132402
Si on a besoin de définir plus précisément l'affichage complet de p.r avec un nombre donné de chiffres significatifs (en plus ou en moins), il faut utiliser une fonction d'affichage plus paramétrable que print. Je ne sais pas si elle existe déjà, mais sinon, ça pourrait ressembler à ça:
Avec une fonction de ce genre, l'affichage de p.r devient:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import numpy def affiche(L, n): if isinstance(L,float): format = "%." +str(n) +"g" return format % L elif isinstance(L,complex): ch = affiche(L.real,n) if L.imag>=0: ch += "+" ch += affiche(L.imag,n) + "j" return ch elif isinstance(L,numpy.ndarray): ch = "[" if L!=[]: for e in L: ch += affiche(e,n) + " " ch = ch[:-1] ch += "]" return ch
TyrtamosCode:
1
2
3 print affiche(p.r, 17) [-2+19.899748742132402j -2-19.899748742132402j]
Tyrtamos,
Merci pour ta réponse, mais ce n'est pas le manque de précision de l'affichage qui me chiffonne, mais plutôt le manque de précision du calcul des racines :
avec p = poly1d([0.000025, 0.01, 1])
on devrait obtenir une racine double réelle !! (-200)
Mais bon, en comparant la partie réelle à la partie imaginaire, on arrive bien à savoir s'il faut en négliger une ... mais on est loin des 17 chiffres significatifs !
Elle est bien bonne celle-là: figure toi qu'avec tes données, je ne trouvais qu'un résultat réel, et c'est pour ça que je les ai modifiées pour avoir un résultat complexe comme toi!
Avec tes données, je trouve ça:
???Code:
1
2
3
4
5
6 p = poly1d([0.000025, 0.01, 1]) print p.r [-200. -200.]
(Python 2.6.4 avec les numpy et scipy qui vont avec)
Tyrtamos