2016-09-19 2 views
1

Ich versuche, den Schnittpunkt zwischen den Kurven $ y = x^2 + 3x + 2 $ und $ y = x^2 + 2x + 1 $ zu finden. Dazu habe ich folgende Python-Programm geschrieben:Unerwartete Anzahl von Dezimalstellen und syntaktische Abfrage

from numpy import * 
import numpy as np 
for x in np.arange(-100, 100, 0.0001): 
    y_1=x**2+3*x+2 
    y_2=x**2+2*x+1 
    if round(y_1, 5)==round(y_2,5): 
     print x 
print 'end' 

Die Konsole zeigt:

-0.999999996714 
end 

Ich habe drei Fragen.

1) Warum muss ich y_1=x**2+3*x+2 und y_2=x**2+2*x+1 in die for-Anweisung aufnehmen? Warum kann ich sie nicht einfach nach der Zeile from numpy import* einfügen?

2) Warum ist die Ausgabe auf 12 Dezimalstellen, wenn ich den Schritt in np.arange auf 4 Dezimalstellen angegeben habe?

3) Warum wird -1.0000 nicht ausgegeben?

Bitte gehen Sie einfach auf mich, ich fange gerade an, Python zu benutzen und dachte, ich würde versuchen, einige simultane Gleichungen damit zu lösen.

Danke,

Jack

+3

1) Sie können 'x' nicht verwenden, bevor es erstellt wird. – Jeon

+0

warum? weil du Variablen verwendest. Ihre Äquivalenz wird EINMAL berechnet und dann das Ergebnis gespeichert.Python wird keine Zeitreise machen und die Gleichungen für Sie rückwirkend neu berechnen, weshalb Sie die Berechnungen INNERHALB der Schleife durchführen, so erhalten Sie ein Ergebnis für jeden Wert von 'x', den Sie generieren. –

+0

https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems –

Antwort

2
  1. Da die y_1 und y_2 Linien spezifische Werte Berechnung nicht Funktionen definieren. Plain Python hat kein integriertes Konzept von symbolischen Gleichungen. (Obwohl Sie symbolische Gleichungen auf verschiedene Arten implementieren können.)
  2. Da Binär-Gleitkomma, wie in Python verwendet, nicht genau 0.0001 (Basis 10) darstellen kann. Daher ist der Schritt gerundet, also sind Ihre Schritte nicht genau Zehntausendstel. Die Python-Anweisung print wird nicht abgerundet, wenn keine spezifischen Anweisungen dafür vorhanden sind. Sie erhalten also genau den Wert, den das System verwendet, obwohl dies nicht unbedingt der von Ihnen geforderte Wert ist.
  3. Der gleiche Grund: Da die Schritte nicht genau Zehntausendstel sind, ist der Punkt, an dem die Funktionen nahe genug sind, um unter Rundung als gleich zu testen, nicht genau bei -1.
+0

Danke, Ihre Antwort ist sehr hilfreich. – Jack

1

1) Zuerst müssen Sie (wahrscheinlich) redundante Import-Anweisungen:

from numpy import * 
import numpy as np 

Die erste Anweisung importiert die __all__ Variable aus dem Paket Aliase es dann als np das numpy Paket der zweite Anweisung importiert. Die normale Konvention besteht darin, numpy als np zu importieren, also würde ich Ihre erste Zeile löschen und die zweite behalten.

Jetzt, um Ihre Frage klarer zu beantworten, müssen Sie Ihre Gleichungen in die for-Schleife einfügen, da x jedes Element in der np.array unter Verwendung der for Schleife darstellt.

2 und 3) Der Wert wird wahrscheinlich in Ihren Gleichungen als Float interpretiert. Der Rundungsfehler hängt davon ab, wie Python (und die meisten Programmiersprachen) Brüche interpretieren. See more here.

+0

was bedeutet 'np'? Ich habe nur "import numpy als np" aufgenommen, weil (nach einer Google Suche) ich brauchte es die np.arange Funktion – Jack

+1

'np' bedeutet nichts. Die Anweisung 'as' ändert den Namen eines Moduls in Ihrer Datei. Ich kann schreiben "import numpy als hype_math_library" und dann implementieren Sie Ihre 'for' Schleife als' für x in hyped_math_library.arange (-100, 100, 0.0001) ' –

+0

Danke Liam das ist sehr hilfreich – Jack

Verwandte Themen