ankon Geschrieben 15. Juli 2018 Geschrieben 15. Juli 2018 Hallo, als Beginner übe ich Einstiegsprogramme auf Python. Hier geht es um Berechnung einer mathematischen Funktion (Wertebereich) Ich schreibe ein Python-Programm das vom Benutzer zwei Zahlenwerte x_anfang und x_ende (Ganzzahlen) anfordert. Die mathematische Funktion soll dann für alle Werte in diesem Wertebereich berechnet werden: y = ½ x³ – ½ x² + 2x + 3 Die jeweiligen x und y Werte sollen auf dem Bildschirm ausgeben werden. --------------------- Das Programm habe ich so geschrieben: from math import * x_anfang=float(input("Eingabe_Anfangswert:")) x_ende=float(input("Eingabe_Endwert:")) sw=float(input("Eingabe_Schrittweite:")) x=float y = 1/2*x**3 - 1/2*x**2 + 2*x + 3 for x in arange(x_anfang, x_ende, sw): print("x=", x) print("y=", y) #print() Nach dem "RUN" erhalte ich Eingabenaufforderungen, aber danach Fehlermeldung: >>> RESTART: C:/....... Berechnung math Funkion.py Eingabe_Anfangswert:1 Eingabe_Endwert:3 Eingabe_Schrittweite:1 Traceback (most recent call last): File "C:/........... Berechnung math Funkion.py", line 9, in <module> y = 1/2*x**3 - 1/2*x**2 + 2*x + 3 TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'int' >>> Was ist mein Fehler und wie kann ich das Programm fehlerfrei und lauffähig machen? Bitte um Korrektur. Zitieren
RubberDog Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 (bearbeitet) Ich halte nichts davon, Lösungen zu geben. Man lernt mehr, wenn man sich die selbst erarbeitet. Aber deinen Fehler zeige ich dir gern, du hast ihn nämlich bereits dort stehen. vor 8 Stunden schrieb ankon: TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'int' pow(), bzw dein ** erwartet also einen bestimmten Datentyp zur Verarbeitung. Und du übergibst ihm.. vor 8 Stunden schrieb ankon: x_anfang=float(input("Eingabe_Anfangswert:")) x_ende=float(input("Eingabe_Endwert:")) Bearbeitet 16. Juli 2018 von RubberDog Zitieren
Rienne Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 (bearbeitet) Huhu, also ich kenne mich jetzt nicht so sehr mit Python aus, aber rein syntaktisch hat dein x doch gar keinen Wert zu dem Zeitpunkt, wo du damit y berechnen möchtest. Natürlich gibt es dann einen Fehler. Du solltest sowohl die Berechnung als auch die Ausgabe in die Schleife packen. @RubberDog er übergibt seiner Berechnung nicht x_anfang bzw. x_ende, sondern lediglich x, was aber nur einen Typ besitzt und keinen Wert, afaik. Bearbeitet 16. Juli 2018 von Rienne JimTheLion reagierte darauf 1 Zitieren
RubberDog Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 vor 14 Minuten schrieb Rienne: @RubberDog er übergibt seiner Berechnung nicht x_anfang bzw. x_ende, sondern lediglich x, was aber nur einen Typ besitzt und keinen Wert, afaik. In der for-schleife versucht er aber genau das mit x_anfang und x_ende. Zitieren
Whiz-zarD Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 vor 1 Minute schrieb RubberDog: In der for-schleife versucht er aber genau das mit x_anfang und x_ende. Nein, eben nicht. Die Formel wird außerhalb der Schleife berechnet und er verwendet dort x und x eine Klasse von Typ "float". x=float print(x) Ausgabe: <class 'float'> Gefordert ist auch laut Aufgabe, dass nur Ganzzahlen verwendet werden sollen und keine Fließkommazahlen. Die Umwandlung ist somit überflüssig. Zu mal die range()-Funktion mit Fließkommazahlen ebenfalls nicht umgehen kann. Zitieren
Rienne Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 (bearbeitet) Mal ganz davon abgesehen, dass die Aufgabenstellung ganze Zahlen fordert: Ich habe den Code getestet und die Berechnung selber klappt einwandfrei mit Zahlen vom Typ float. Das Problem ist einfach, dass zum Zeitpunkt, wo y berechnet werden soll, x keinen verwertbaren Wert enthält. vor 28 Minuten schrieb RubberDog: In der for-schleife versucht er aber genau das mit x_anfang und x_ende. Ich finde es immer wieder interessant, wie schnell einige doch die rudimentären Abarbeitungsschritte eines Algorithmus' übersehen bzw. nicht sehen. Das ist genauso wie in vielen Programmiersprachen beispielsweise die Klammern bei einer Schleife vergessen werden und entsprechend natürlich nur die erste Zeile hinter dem Schleifenkopf abgearbeitet wird und man sich wundert, warum das Programm nicht das macht, was man möchte. vor 22 Minuten schrieb Whiz-zarD: Zu mal die range()-Funktion mit Fließkommazahlen ebenfalls nicht umgehen kann. Wie gesagt, ich habe bisher noch nie mit Python gearbeitet, aber laut Google und der Suchergebnisse kann arange() sehr wohl mit Fließkommazahlen umgehen. (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.arange.html ) Allerdings muss man dafür, soweit ich gesehen habe das Modul numpy importieren. Und ob man dieser Operation dann einfach eine Variable zuordnen kann, weiß ich auch nicht. Bearbeitet 16. Juli 2018 von Rienne Zitieren
Whiz-zarD Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 vor 3 Stunden schrieb Rienne: Wie gesagt, ich habe bisher noch nie mit Python gearbeitet, aber laut Google und der Suchergebnisse kann arange() sehr wohl mit Fließkommazahlen umgehen. (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.arange.html ) Allerdings muss man dafür, soweit ich gesehen habe das Modul numpy importieren. Und ob man dieser Operation dann einfach eine Variable zuordnen kann, weiß ich auch nicht. Ich hatte bis jetzt auch nur sehr wenig mit Python zu tun gehabt und ich dachte, dass sei ein Schreibfehler gewesen, da ich arange() nicht kannte und auch nicht zum Standard gehört aber offenbar gibt es aber wohl ein Package mit dieser Funktion. Mea Culpa. Ich denke auch nicht, dass das NumPy-Package eingebunden werden sollte, da auf Ganzzahlen beschränkt wurde und die range()-Funktion aus dem Standard unterstützt nur Ganzzahlen. https://www.pythoncentral.io/pythons-range-function-explained/ Zitieren
äymm Geschrieben 16. Juli 2018 Geschrieben 16. Juli 2018 x_anfang, x_ende, und sw sollten Ganzzahlen sein, du verwendest aber floats. Die Berechnung von y muss mit in die Schleife (muss ja für jeden Wert von x neu berechnet werden). Wenn du dir mal die Fehlermeldung anschaust, beschwert Python sich, dass pow nicht mit den Typen int und type klar kommt. Klar, zu dem Zeitpunkt wo du pow aufrufst ist x ja auch erstmal nur als float definierst (was übrigend auch eine Ganzzahl sein sollte, und kein Float). Es halt also bis jetzt nur einen Typ, aber noch keinen Wert. Diesen erhält es erst in der Schleife. Das heißt wiederum, dass wenn du die Berechnung in der Schleife machst x dann auch einen Wert hat und nicht mehr nur ein Typ ist. Generell würd ich die Definition von x eh einfach weg lassen, bei Python brauchst du das nicht Zitieren
ankon Geschrieben 18. Juli 2018 Autor Geschrieben 18. Juli 2018 Vielen Dank an alle. Ich habe Programm-Code wie folgt geändert: from math import * x_anfang=float(input("Eingabe_Anfangswert:")) x_ende=float(input("Eingabe_Endwert:")) sw=float(input("Eingabe_Schrittweite:")) for x in range(x_anfang, x_ende, sw): y = 1/2*x**3 - 1/2*x**2 + 2*x + 5 print("x=", x) print("y=", y) #print() es ergab sich folgende Meldung (beim "RUN"): RESTART: C:/....../....Berechnung math Funkion.py Eingabe_Anfangswert:1 Eingabe_Endwert:3 Eingabe_Schrittweite:1 Traceback (most recent call last): File "C:/.../..Berechnung math Funkion.py", line 11, in <module> for x in range(x_anfang, x_ende, sw): TypeError: 'float' object cannot be interpreted as an integer >>> 1. es scheint mir zu sein, dass mein PC die "numpy" nicht verwenden kann. Ich verstehe, dass "numpy" soll eine Bibliothek für Befehle/Funktionen ... zu sein und bei mir ist die "nupmy" ist nicht dabei. Kann ich die Numpy importieren aus internet? Wenn ja chan welchen Spreicherort? 2. Ich habe -arange- (fliessende komma) zu -range- geändert. 3. Ich habe die Zeile x=float intfernt. In der Fehlermelnung wird mitgeteilt, dass "TypeError: 'float' object cannot be interpreted as an integer" Warum interpretiert das Programm die Variable x (? oder was?) als integer? Ich habe niergendwo 'integer' zugewiesen. Hat das stillschweigend passiert? Wo/wie genau? Was muss man ändern damit das nicht passiert? Zitieren
Rienne Geschrieben 18. Juli 2018 Geschrieben 18. Juli 2018 Das wurde doch schon von @Whiz-zarDoben geschrieben. Range funktioniert nur mit Integer und nicht mit Float. Du sagst aber, dass deine eingelesenen Werte vom Typ Float sein sollen. Wenn du das änderst, sollte es eigentlich funktionieren. Zu numpy: Nicht-Standard-Module müssen afaik vor dem Einbinden in einen Quelltext installiert bzw. gespeichert sein. Zitieren
arlegermi Geschrieben 19. Juli 2018 Geschrieben 19. Juli 2018 (bearbeitet) vor 11 Stunden schrieb ankon: x_anfang=float(input("Eingabe_Anfangswert:")) Wie kommst du denn genau auf diese Zeile? Kannst du das Teil für Teil erklären? Wenn nicht, dann fehlen dir die Grundlagen, die du dir erst anlesen solltest, bevor du versuchst, dich irgendwie durchzuschlängeln, indem du Code hinzufügst/änderst/entfernst, den du nicht verstehst. Die Teile in der Zeile, die zu erklären wären, sind: x_anfang float(...) input(...) "Eingabe_Anfangswert:" Wenn du verstanden hast, was jeder dieser Teile tut, dann gehst du weiter zu dieser Zeile: vor 11 Stunden schrieb ankon: for x in range(x_anfang, x_ende, sw): Hier zu erklären wären: for ... in ... x range(...) x_anfang x_ende sw Sobald du diese Teile (und die oben) verstanden hast, kannst du dir auch erklären, was die Fehlermeldung bedeutet. Wenn dir an irgendeiner Stelle beim Erklären nicht klar ist, was das tut, dann musst du dir das entweder in einem Tutorial oder der Python-Dokumentation durchlesen (oder von mir aus fragst du hier). Bearbeitet 19. Juli 2018 von arlegermi äymm und JimTheLion reagierten darauf 2 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.