2017-03-14 6 views
2

In meinem Python-Skript zu formatieren für die LinieWie komplexe Zahl in Python

result = sp.solve(eqn)

ich ähnlich wie

result = 0.0100503358535014*I

entnehme ich, dies bedeutet, dass die folgende Ausgabe in dem Format erhalten Lösung ist eine komplexe Zahl. In diesem Fall könnte es auch als result = 0.01j gesehen werden.

Ich möchte Formatierung zu meinem Code hinzufügen, um result = 0.0100503358535014*I zu etwas mehr wie result = 0.01j zu ändern. Ich finde Probleme jedoch versuchen, dies zu tun, wie ich isinstance zu nutzen versuchte, zu überprüfen, ob result

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

Komplex war jedoch diese Schleife nie eingegeben wird (das heißt 0.0100503358535014*I ist nicht so komplex hier klassifiziert).

Wie soll ich eine if-Anweisung schreiben, um zu überprüfen, ob das Ergebnis in der Art xxxxxxx*I korrekt angegeben ist?

+0

Was ist "ich" hier? Eine spezielle Konstante? Wenn du nicht mit "komplex" arbeitest, mit was arbeitest du? – ShadowRanger

+0

Ich denke auch, dass "I" ein tatsächliches Symbol ist (es ist wahrscheinlich eine SymPy-Bibliothek) und keine Angabe einer komplexen Zahl. – leovp

+0

Was ist 'type (result)'? – Denziloe

Antwort

4

SymPy unterstützt Python eingebaute Funktion complex():

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

Es gibt einige Beispiele in http://docs.sympy.org/latest/modules/evalf.html

Eine Python komplexe Zahl kann mit einem Schwimmer ähnlich formatiert werden:

>>> 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' 

Wenn Sie die realen und imag Teile getrennt formatieren wollen, können Sie das selbst machen.

würde die Umwandlung eine Typeerror erhöhen, wenn es nicht getan werden kann:

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

Im Folgenden wird überprüft, ob das sympy-Objekt result eine komplexe Zahl darstellt und den Gleitkommawert auf 2 Dezimalpunkte abschneidet.

import sympy as sp 

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

habe ich diesen Weg versucht und es funktioniert aber, wenn ich eine if-Anweisung wie 'if (result.is_complex)' dann diese Rückgabe wahr für beide 'type (result) = 'und' type (result) = 'was ich nicht will. Wie erhalte ich eine spezifische if-Anweisung nur dann, wenn das Ergebnis am Ende einen '* I'-Teil hat? – Catherine

+0

is_complex gibt True für eine große Klasse von SymPy-Ausdrücken zurück, einschließlich symbolischer Ausdrücke und sogar reeller Zahlen. 'x.is_complex' prüft nur, ob' x' eine komplexe Zahl ist. – asmeurer

1

Hier ist eine Alternative, die übrigens gibt an, wie ein oder beide Teile einer komplexen Zahl zu überprüfen, ob verfügbar sind.

>>> 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' 

Sie könnten das Zeichen des komplexen Teils überprüfen, um zu entscheiden, ob in ein Plus Zeichen setzen. Ich mag die neumodische Formatierung verwenden konnte aber in Konflikt mit dem Bug fiel, die mit PY3 kommen .4+ in Python TypeError: non-empty format string passed to object.__format__ erwähnt, für die ich keine Abhilfe habe.