Frage bzgl. Spyder (oder: Unterschied Python und iPython)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cr0n
User
Beiträge: 3
Registriert: Mittwoch 7. Mai 2014, 11:16

Moin,

ich führe in Spyder folgendes Worksheet aus:

Code: Alles auswählen

lam_vac=linspace(250,1600,num=1351)

Re = 
real(1.54*(1-(1/((177.5**2)*((1/(lam_vac**2))+(1j/(14500*lam_vac)))))) + ((1.27/470) * ((e**(1j*(-pi/4))/((1/470)-(1/lam_vac)-(1j/1900))) + ((e**(-1j*(-pi/4))/((1/470)+(1/lam_vac)+(1j/1900))) ) )) + (1.10/325 * ((e**(1j*(-pi/4))/((1/325)-(1/lam_vac)-(1j/1060))) + ((e**(-1j*(-pi/4))/((1/325)+(1/lam_vac)+(1j/1060))) ) ) ))

Im = 
imag(1.54*(1-(1/((177.5**2)*((1/(lam_vac**2))+(1j/(14500*lam_vac)))))) + ((1.27/470) * ((e**(1j*(-pi/4))/((1/470)-(1/lam_vac)-(1j/1900))) + ((e**(-1j*(-pi/4))/((1/470)+(1/lam_vac)+(1j/1900))) ) )) + (1.10/325 * ((e**(1j*(-pi/4))/((1/325)-(1/lam_vac)-(1j/1060))) + ((e**(-1j*(-pi/4))/((1/325)+(1/lam_vac)+(1j/1060))) ) ) ))

Im50 = 
imag(1.54*(1-(1/((177.5**2)*((1/(lam_vac[50]**2))+(1j/(14500*lam_vac[50])))))) + ((1.27/470) * ((e**(1j*(-pi/4))/((1/470)-(1/lam_vac[50])-(1j/1900))) + ((e**(-1j*(-pi/4))/((1/470)+(1/lam_vac[50])+(1j/1900))) ) )) + (1.10/325 * ((e**(1j*(-pi/4))/((1/325)-(1/lam_vac[50])-(1j/1060))) + ((e**(-1j*(-pi/4))/((1/325)+(1/lam_vac[50])+(1j/1060))) ) ) ))

Im300nm = 
imag(1.54*(1-(1/((177.5**2)*((1/(300**2))+(1j/(14500*300)))))) + ((1.27/470) * ((e**(1j*(-pi/4))/((1/470)-(1/300)-(1j/1900))) + ((e**(-1j*(-pi/4))/((1/470)+(1/300)+(1j/1900))) ) )) + (1.10/325 * ((e**(1j*(-pi/4))/((1/325)-(1/300)-(1j/1060))) + ((e**(-1j*(-pi/4))/((1/325)+(1/300)+(1j/1060))) ) ) ))

TestLamVac = lam_vac[50]

Die Gleichungen sehen erstmal kompliziert aus, sind aber jedenfalls allesamt die selben. Bei Im50 wird allerdings nur der 50. Eintrag von lam_vac verwendet wird und bei Im300nm steht dort direkt der Wert aus dem 50. Eintrag (der da ist: 300). Entschuldigt die tausend Klammern zuviel, die sind noch drin weil ich zunächst Syntaxfehler ausschließen wollte.
Mein Problem ist nun folgendes: Wenn ich dies als .py Datei ausführe erhalte ich für Im50 den Wert 212,6 und für Im300nm den Wert 2,5. Wenn ich die beiden Ausdrücke jeweils einzeln im Python Interpreter berechnen lasse erhalte ich beide Male 5.6. Wenn man die Berechnung mit anderen Programmen überprüft bekommt ist 5.6 der richtige Wert.

Ich könnte mir jetzt vorstellen, dass die genutzten Mathepakete, warum auch immer, beim ausführen der .py Datei und beim direkten Eingeben im Interpreter unterschiedlich sind.
Aber TestLamVac hat in beiden Fällen den Wert 300. Warum liefern die Berechnungen dann unterschiedliche Ergebnisse?!

Wo liegt mein Denk- oder Verständnisfehler?


Danke!

Cr0n

PS.: Ich habe gerade entdeckt, dass ich den Fehler reproduzieren kann wenn ich eine iPython Console statt einer Python Console benutze. Dann bekomme ich auch verschiedene Werte wenn ich die Berechnungen direkt in der Console ausführe!

Wo liegt also hierauf bezogen der Unterschied zwischen einer Python und iPython Console?!
Zuletzt geändert von Anonymous am Mittwoch 7. Mai 2014, 12:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@cr0n: Da sollte es keinen Unterschied geben. Das scheint dann wohl alles irgendwie mit Spyder zu tun zu haben, denn ich nehme mal an Du meinst nicht tatsächlich den Unterschied zwischen einer Python- und einer IPython-Shell, sondern den Unterschied zwischen beiden wenn sie von Spyder gestartet werden.

Bei normalen Shells fängt das schon mal damit an das `linspace()` nicht definiert ist. Das müsste man erst importieren.

Ich würde mal ganz stark vermuten es ist die ``/``-Operation. Teste mal in den verschiedenen Interpretern was die bei 1/2 heraus bekommen. Ob das 0 oder 0.5 ist. Falls es 0 ist, dann verwendest Du Python 2.x und es wurde kein ``from __future__ import division`` am Anfang gemacht, was aus dem ``/`` bei ganzen Zahlen aus einer ganzzahligen Division eine macht, die auch Dezimalbrüche als Ergebnis haben kann.
cr0n
User
Beiträge: 3
Registriert: Mittwoch 7. Mai 2014, 11:16

Top, danke! Deine Vermutung war richtig, die "/" Operation war es tatsächlich!

Wenn ich nun in Spyder jeweils eine iPython oder eine Python Console starte, und dort einfach 1/2 eingebe kommt bei der iPython Console 0 und bei der Python Console 0.5 raus.
Wenn ich in mein Worksheet nun die Division aus der Zukunft einbinde (haha!) wird der Fehler behoben.

Trotzdem frage ich mich, warum die Division in der Console an sich funktioniert, aber nicht, wenn ich mit genau der selben Console eine Zeile später eine .py Datei ausführe...

Nunja, Problem behoben, vielen Dank!
BlackJack

@cr0n: Die `__future__`-Importe gelten nur für das Modul in dem sie am Anfang gemacht wurden, nicht global im Prozess. Man verändert damit ja das Verhalten von Python, teilweise sogar die Syntax. Das wäre ziemlich fatal wenn das für *alles* gelten würde. Es gibt ja durchaus Module die erwarten das für Python 2.x traditionelle Verhalten vom ``/``-Operator und rechnen falsch wenn da plötzlich Dezimalbrüche heraus kommen.
cr0n
User
Beiträge: 3
Registriert: Mittwoch 7. Mai 2014, 11:16

Okay, das ergibt natürlich Sinn.
Antworten