2017-03-14 1 views
2

Dans mon script Python pour la ligneComment formater un nombre complexe en Python

result = sp.solve(eqn)

Je reçois la sortie suivante dans le format similaire à

result = 0.0100503358535014*I

Je déduis cela signifie que le la solution est un nombre complexe. Donc, dans ce cas, il pourrait également être considéré comme result = 0.01j.

Je veux ajouter un formatage à mon code pour changer result = 0.0100503358535014*I à quelque chose de plus comme result = 0.01j. Cependant, je me rends compte des questions qui tentent de le faire comme je l'ai essayé d'utiliser isinstance pour vérifier si result était complexe

if isinstance(result, complex): 
     print "Result is complex!" 
     ... my code here... 

Cependant, cette boucle est jamais entré (i.e. 0.0100503358535014*I n'est pas considérée comme complexe ici).

De quelle façon dois-je écrire une instruction if pour vérifier si le résultat est donné de la manière xxxxxxx*I correctement?

+0

Qu'est-ce que 'I' ici? Une constante spéciale? Si vous ne travaillez pas avec 'complex', avec quoi travaillez-vous? – ShadowRanger

+0

Je pense aussi que 'I' est un symbole réel (c'est probablement une bibliothèque SymPy), et non une indication d'un nombre complexe. – leovp

+0

Qu'est-ce que 'type (result)'? – Denziloe

Répondre

4

sympy prend en charge la fonction intégrée de Python complex():

>>> import sympy 
>>> x = sympy.sqrt(-2) 
>>> x 
sqrt(2)*I 
>>> complex(x) 
1.4142135623730951j 

Il y a quelques exemples dans http://docs.sympy.org/latest/modules/evalf.html

Un nombre complexe Python peut être mis en forme similaire à un flotteur:

>>> format(complex(x), 'e') 
'0.000000e+00+1.414214e+00j' 
>>> format(complex(x), 'f') 
'0.000000+1.414214j' 
>>> format(complex(x), 'g') 
'0+1.41421j' 

Si vous souhaitez formater séparément les parties réelle et imag, vous pouvez le faire vous-même.

La conversion soulèverait un TypeError si elle ne peut se faire:

>>> complex(sympy.Symbol('x')) 
Traceback (most recent call last): 
TypeError: can't convert expression to float 
0

Vérifie si l'objet sympy result représente un nombre complexe et tronque la valeur flottante en 2 points décimaux.

import sympy as sp 

result = 0.0100503358535014*sp.I 
print(result.is_complex) 
print(sp.N(result,2)) 
True 
0.01*I 
+0

J'ai essayé de cette façon et cela fonctionne cependant si j'utilise une instruction if comme 'if (result.is_complex)' alors cela retourne true pour les deux 'type (resultat) = 'et' type (result) = 'ce qui n'est pas ce que je veux. Comment puis-je obtenir une instruction if spécifique uniquement lorsque le résultat a une partie "* I" à la fin? – Catherine

+0

is_complex retournera True pour une grande classe d'expressions SymPy, y compris des expressions symboliques et même des nombres réels. 'x.is_complex' vérifie simplement si' x' est un nombre complexe. – asmeurer

1

est ici une alternative qui indique d'ailleurs comment vérifier si un ou les deux parties d'un nombre complexe sont disponibles.

>>> from sympy import * 
>>> var('x') 
x 
>>> expr = (x+0.*I)*(x-0.2346678934)*(x-(3-2.67893455*I)) 
>>> solve(expr) 
[0.234667893400000, -0.*I, 3.0 - 2.67893455*I] 
>>> roots = solve(expr) 
>>> for root in roots: 
...  r, i = root.as_real_imag() 
...  '%10.3f %10.3f i' % (r,i) 
...  
'  0.235  0.000 i' 
'  0.000  -0.012 i' 
'  3.000  -2.679 i' 

Vous pouvez vérifier le signe de la partie complexe de décider de mettre un en plus signe. Je voudrais avoir été en mesure d'utiliser la mise en forme dernier cri, mais tombèrent sous du bug qui vient avec PY3 .4+ mentionné dans Python TypeError: non-empty format string passed to object.__format__ pour lequel je n'ai aucun remède.