Hallo!
Wollte mich erstmal vorstellen, bin ein neues Pythonforum mitglied und hab auch schon nen etwas umfassenderes Prog geschrieben.
Als nächstes Projekt würde ich gerne eine Kurvendiskussion schreiben (keine grafische Ausgabe der Funktion, nur Ausrechnen der Nullstellen, Extremwerte, Wendepunkte und der ABleitungsfunktionen natürlich). Problem dabei ist, dass ich keine Ahnung hab, wie ich nen input zerlege. Soll heißen ich bekomme eine Funktion alá 5x², so muss ich natürlich diese EIngabe zerlegen können in Steigung = 5 & x & Hochzahl von 2. Nur wie mache ich das?
Da is so mein "latein" am Ende (was übrigens auch nicht sehr umfassend ist nur so nebenbei ^^).
Wär cool, wenn ihr mir da helfen könntet. Würde meine Hausaufgaben erleichtern =)
Grüße netswipe
Kurvendiskussionen, dafür Funktionen zerlegen
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi und willkommen!
Musst Du die Funktion überhaupt zerlegen?
Dookie hat mal ein Programm zu Nullstellenberechnug geschrieben. Such mal im Showcase-Forum danach, vielleicht hilfts Dir
Gruß, mawe
Musst Du die Funktion überhaupt zerlegen?
Dookie hat mal ein Programm zu Nullstellenberechnug geschrieben. Such mal im Showcase-Forum danach, vielleicht hilfts Dir
Gruß, mawe
Die Nullstellen und Extremwerte bekommt man wohl auch ohne Zerlegen hin, aber für die Ableitung muss man mit der Formel auf "symbolischer" Ebene arbeiten.
Wenn Du nicht selbst programmieren willst und auch eine Lösung nimmst, die nicht in Python sondern Lisp programmiert ist, dann wirf mal einen Blick auf (X)Maxima. Das ist ein recht brauchbares, freies Computer Algebra System.
Wenn Du nicht selbst programmieren willst und auch eine Lösung nimmst, die nicht in Python sondern Lisp programmiert ist, dann wirf mal einen Blick auf (X)Maxima. Das ist ein recht brauchbares, freies Computer Algebra System.
-
- User
- Beiträge: 12
- Registriert: Sonntag 6. März 2005, 20:12
- Wohnort: Edermünde
- Kontaktdaten:
ich kenne auch noch ein paar andere Programme, aber würde es wirklich gerne slebstprogrammieren. Erstmal ohne gui. Danke schopnmal für die Tipps.
Edit: Mmm...schade da sind kaum Kommentare drin. Is nen bissl schwer nachzuvollziehen :/ dann versuche ichs doch mal über ne teilung mit split()
Oder ne andere idee jemand (bitte genau erklären )
// €dit 2: Hab gerad nen kleines Script gebastelt. Geht auch alles, nur bei der 1. ABleitung komtm nen komischer Fehler:
Der Fehler ist:
WIe man sieht geht die Ausgabe noch, abe rmultiplizieren geht nich, weil keine Integer. Obwohl ich vorher drauf geprüft hab :/
Edit: Mmm...schade da sind kaum Kommentare drin. Is nen bissl schwer nachzuvollziehen :/ dann versuche ichs doch mal über ne teilung mit split()
Oder ne andere idee jemand (bitte genau erklären )
// €dit 2: Hab gerad nen kleines Script gebastelt. Geht auch alles, nur bei der 1. ABleitung komtm nen komischer Fehler:
Code: Alles auswählen
#! /usr/bin/env python
# Prototyp Kurvendiskussion
# 0.01alpha by Maik Wachsmuth 2005
import sys
# Validierung auf Integer
# -> Funktion isInt
def isInt(eingabe):
try:
int(eingabe)
except ValueError:
return False
return True
# Ende der Validierfunkt.
funktion = raw_input('Die Funktion: ')
funktionspl = funktion.split("x")
mA = funktionspl[0]
hochzahlA = funktionspl[-1]
if isInt(mA) and isInt(hochzahlA):
# ...und anschließendes Floaten!
float(mA)
float(hochzahlA)
else:
sys.exit()
print funktion
print mA
print hochzahlA
mA1 = mA * hochzahlA
hochzahlA1 = hochzahlA - 1
print mA1, 'x', hochzahlA1
Code: Alles auswählen
Die Funktion: 2x2
2x2
2
2
Traceback (most recent call last):
File "./kurvendisk.py", line 37, in ?
mA1 = mA * hochzahlA
TypeError: can't multiply sequence by non-int
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Versuchs mal so:
PS: Symbolisches Differenzieren selbst programmieren ist WAHNSINN! Wollt ich nur mal erwähnen
Gruß, mawe
Versuchs mal so:
Code: Alles auswählen
if isInt ...:
mA = float(mA)
hochzahlA = float(hochzahlA)
Gruß, mawe
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Und Maxima ist wirklich gut, ich habe es sogar auf Woody gebackportet, so toll fand ich'smawe hat geschrieben:PS: Symbolisches Differenzieren selbst programmieren ist WAHNSINN! Wollt ich nur mal erwähnen
Code: Alles auswählen
if isInt(mA) and isInt(hochzahlA):
# ...und anschließendes Floaten!
float(mA)
float(hochzahlA)
else:
sys.exit()
print funktion
print mA
print hochzahlA
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hm, Du müsstest Dich vielleicht zunächst einmal etwas mit numerischen Algorithmen beschäftigen. Da ist der Umgang mit Polynomen wohl ein guter Einstieg.
Kennst Du Mastering Algorithms in C? Das sind zwar, wie der Titel sagt, Algorithmen in C, aber sie sind sehr einfach in Python umzusetzen (Das Buch bietet nur die Lösungen für drei numerische Probleme: Nullstellen, Interpolation und Least-Square.)
Für Fortgeschrittene ist dann schon Numerical Recipies in C (gibt es inzwischen auch in C++ und Fortran). Dieser Link führt Dich zu PDF-Dokumenten, die frei verfügbar sind. Numerical Recipies bietet einen detaillierten Einstieg in die Fragestellung und verdammt gute Lösungen.
Und schließlich könntest Du Dir noch den Quellcode von SciPy anschauen - aber das ist sehr unübersichtlich.
Tut mir leid - damit erschöpft sich mein Wissen und die Links weisen alle auf Englische Seiten.
Gruß,
Christian
PS Habe meinen Beitrag schon heute mittag fertig gehabt und dann kam ein Kollege dazwischen. Da hatte ich also noch nicht den Code und alles andere gesehen. Dennoch schicke ich den Beitrag mal un-überarbeitet ab, vielleicht hilft es ja.
Im Übrigen finde ich nummerische Algorithmen nicht soooo besonders schwer, allerdings solltest Du die Herangehensweise etwas systematischer lernen: Was Du hier zeigst, ist so irgendwie von hinten durch die Brust ins Auge ...
Kennst Du Mastering Algorithms in C? Das sind zwar, wie der Titel sagt, Algorithmen in C, aber sie sind sehr einfach in Python umzusetzen (Das Buch bietet nur die Lösungen für drei numerische Probleme: Nullstellen, Interpolation und Least-Square.)
Für Fortgeschrittene ist dann schon Numerical Recipies in C (gibt es inzwischen auch in C++ und Fortran). Dieser Link führt Dich zu PDF-Dokumenten, die frei verfügbar sind. Numerical Recipies bietet einen detaillierten Einstieg in die Fragestellung und verdammt gute Lösungen.
Und schließlich könntest Du Dir noch den Quellcode von SciPy anschauen - aber das ist sehr unübersichtlich.
Tut mir leid - damit erschöpft sich mein Wissen und die Links weisen alle auf Englische Seiten.
Gruß,
Christian
PS Habe meinen Beitrag schon heute mittag fertig gehabt und dann kam ein Kollege dazwischen. Da hatte ich also noch nicht den Code und alles andere gesehen. Dennoch schicke ich den Beitrag mal un-überarbeitet ab, vielleicht hilft es ja.
Im Übrigen finde ich nummerische Algorithmen nicht soooo besonders schwer, allerdings solltest Du die Herangehensweise etwas systematischer lernen: Was Du hier zeigst, ist so irgendwie von hinten durch die Brust ins Auge ...
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Für alle die zu faul sind die Numerical Recipes in C nach Python zu portieren, gibts hier etwas zum Schmökern
Gruß, mawe
Treffender hätte man's nicht sagen könnenCM hat geschrieben: Was Du hier zeigst, ist so irgendwie von hinten durch die Brust ins Auge ...
Für alle die zu faul sind die Numerical Recipes in C nach Python zu portieren, gibts hier etwas zum Schmökern
Gruß, mawe
-
- User
- Beiträge: 12
- Registriert: Sonntag 6. März 2005, 20:12
- Wohnort: Edermünde
- Kontaktdaten:
okay, werde es mir ansehen...
Kirze ergänzende Frage noch, kann ich das FLoat auch ohne Kommastellen bekommen? Ne Fließkommazahl ohne Kommastellen so zusagen :D
Und...btw: Wie krieg ich das doofe Leerzeichen bei der Ausgabe mit
# print mA1, 'x', hochzahlA1
-> 4.0 x 1.0
weg? Danke für eure Löwe (Ich wage mich gerne von hinten durch die Brust ins Auge. Und wenn ich dabei noch das Herz erwische: Umso besser =)
grüße und dank, netswipe
Kirze ergänzende Frage noch, kann ich das FLoat auch ohne Kommastellen bekommen? Ne Fließkommazahl ohne Kommastellen so zusagen :D
Und...btw: Wie krieg ich das doofe Leerzeichen bei der Ausgabe mit
# print mA1, 'x', hochzahlA1
-> 4.0 x 1.0
weg? Danke für eure Löwe (Ich wage mich gerne von hinten durch die Brust ins Auge. Und wenn ich dabei noch das Herz erwische: Umso besser =)
grüße und dank, netswipe
Code: Alles auswählen
print "%fx%f" % (mA1, hochzahlA1)
off-topic Kommentar zu mawes Link:mawe hat geschrieben:Für alle die zu faul sind die Numerical Recipes in C nach Python zu portieren, gibts hier etwas zum Schmökern
Wirklich schöner Link! Keine Frage: Was der William Park da zusammengeschrieben hat ist wirklich toll. Habe ich auch schon als Bookmark gespeichert!
Allerdings muß sehr darauf achten, was man als Input gibt und als Output erwartet. Numarray und Numpy auf der anderen Seite sind ziemlich gut nach bugs durchforstet und (fast) garantiert stabil.
(Nur mal so nebenbei )
Gruß,
Christian
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich würde es so machen:netswipe hat geschrieben:Kirze ergänzende Frage noch, kann ich das FLoat auch ohne Kommastellen bekommen? Ne Fließkommazahl ohne Kommastellen so zusagen :D
Code: Alles auswählen
float(int(wert))
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 12
- Registriert: Sonntag 6. März 2005, 20:12
- Wohnort: Edermünde
- Kontaktdaten:
Stimmt, da hätte ich auch selber drauf kommen müssen, aber dankeBlackJack hat geschrieben:Eine Fliesskommazahl hat immer ein Komma, aber man kann die Ausgabe ohne Komma mit dem entsprechenden Formatierungscode erreichen.Code: Alles auswählen
print "%fx%f" % (mA1, hochzahlA1)
Das mit dem Formatierungscode raff ich nich so ganz, krieg ich mal bitte nen Beispiel? Das wär nett.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Es ist in der Python Doku beschrieben. Wobei man zugeben muss, dass die nicht wahnsinnig umfassend ist.
Edit:
Wobei die eins nach dem Prozent angibt, wie viele stellen vor dem Komma sind, und die Null nach dem Punkt, wie viele nach dem Komma sind.
Edit:
Code: Alles auswählen
"%1.0f" % 1.33333
"%.10f" % 1.33333
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 12
- Registriert: Sonntag 6. März 2005, 20:12
- Wohnort: Edermünde
- Kontaktdaten:
Ich danke euch!
Solangsam bekomme ich glaub ich den Dreh raus, jetz muss ich mir noch überlegen, wie ich die Nullstellen rausbekomme.
Naja vielelicht funktioniert ja sowas wie
for Funktion == 0:
print x
mal sehen.
Wenn nich melde ich mich ^^
Bis denn netswipe
Solangsam bekomme ich glaub ich den Dreh raus, jetz muss ich mir noch überlegen, wie ich die Nullstellen rausbekomme.
Naja vielelicht funktioniert ja sowas wie
for Funktion == 0:
print x
mal sehen.
Wenn nich melde ich mich ^^
Bis denn netswipe
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nein, denke ich nicht, denn Python ist nicht für sowas ausgelegt. Aber es gibt ja viele Möglichkeiten Nullstellen auszurechnen, so gibt es für Quadratische Gleichungen ja die Mitternachtsformel.netswipe hat geschrieben:Naja vielelicht funktioniert ja sowas wie
for Funktion == 0:
print x
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Mitternachtsformel? Hab ich noch nie gehört, klingt aber lustig *räusper*
Also die bekannteste Methode um Nullstellen numerisch zu berechnen ist wohl das Newton'sche Näherungsverfahren. (Hier muss allerdings die erste Ableitung der Funktion bekannt sein):
Man beginnt also mit einem Schätzwert, x(i).
Dann gehts so weiter:
x(i+1) = Schätzwert - Funktionswert an der Stelle x(i) / Funktionswert der ersten Ableitung an der Stelle x(i).
x(i) = x(i+1), und weiter gehts ...
Wenn x(i+1) und x(i) sich kaum mehr unterscheiden, bricht man ab, dann ist man bei der Nullstelle.
Dookie hat bei seinem Programm (soweit ich das erkennen kann) die sog. Intervallschachtelung verwendet.
Hier braucht man 2 Schätzwerte, x(0) und x(1), aber nicht die erste Ableitung.
- Man berechnet mal die Funktionswerte von x(0) und x(1), f(x(0)) und f(x(1))
- und prüft, ob eine Nullstelle dazwischen liegt: man prüft einfach ob f(x(0)) * f(x(1)) < 0.Wenn ja gehts weiter, wenn nein muss man neue Startwerte wählen.
- Das intervall zwischen x(0) und x(1) wird halbiert, dort liegt der neue Punkt x(2).
- Liegt zwischen x(1) und x(2) eine Nullstelle (also ist f(x(1)) * f(x(2)) < 0?)
- Wenn ja, wieder halbieren, usw.
- Wenn nein, dann liegt die Nullstelle zwischen x(0) und x(2), und wir machen mit diesem Intervall weiter (halbieren, ...)
Tja, das geht so lange, bis der Funktionswert beim Halbierunspunkt ungefähr bei Null liegt.
Gut, ich glaube ich hab jetzt mehr verwirrt als geholfen, aber denk Dir die Methoden mal durch, sind eigentlich ganz leicht und durchschaubar
PS: Mir is grad eingefallen: Statt der ersten Ableitung beim Newton, kann man auch die numerische Ableitung einsetzen, aber ich glaube das verwirrt jetzt noch mehr ...
Gruß, mawe
Mitternachtsformel? Hab ich noch nie gehört, klingt aber lustig *räusper*
Also die bekannteste Methode um Nullstellen numerisch zu berechnen ist wohl das Newton'sche Näherungsverfahren. (Hier muss allerdings die erste Ableitung der Funktion bekannt sein):
Code: Alles auswählen
f(x(i))
x(i+1) = x(i) - ----------
f'(x(i))
Dann gehts so weiter:
x(i+1) = Schätzwert - Funktionswert an der Stelle x(i) / Funktionswert der ersten Ableitung an der Stelle x(i).
x(i) = x(i+1), und weiter gehts ...
Wenn x(i+1) und x(i) sich kaum mehr unterscheiden, bricht man ab, dann ist man bei der Nullstelle.
Dookie hat bei seinem Programm (soweit ich das erkennen kann) die sog. Intervallschachtelung verwendet.
Hier braucht man 2 Schätzwerte, x(0) und x(1), aber nicht die erste Ableitung.
- Man berechnet mal die Funktionswerte von x(0) und x(1), f(x(0)) und f(x(1))
- und prüft, ob eine Nullstelle dazwischen liegt: man prüft einfach ob f(x(0)) * f(x(1)) < 0.Wenn ja gehts weiter, wenn nein muss man neue Startwerte wählen.
- Das intervall zwischen x(0) und x(1) wird halbiert, dort liegt der neue Punkt x(2).
- Liegt zwischen x(1) und x(2) eine Nullstelle (also ist f(x(1)) * f(x(2)) < 0?)
- Wenn ja, wieder halbieren, usw.
- Wenn nein, dann liegt die Nullstelle zwischen x(0) und x(2), und wir machen mit diesem Intervall weiter (halbieren, ...)
Tja, das geht so lange, bis der Funktionswert beim Halbierunspunkt ungefähr bei Null liegt.
Gut, ich glaube ich hab jetzt mehr verwirrt als geholfen, aber denk Dir die Methoden mal durch, sind eigentlich ganz leicht und durchschaubar
PS: Mir is grad eingefallen: Statt der ersten Ableitung beim Newton, kann man auch die numerische Ableitung einsetzen, aber ich glaube das verwirrt jetzt noch mehr ...
Gruß, mawe
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ist eingentlich grundlegendes Lösen von sehr einfachen Gleichungen, vielleicht kennst du es ja unter dem Namen der Großen Lösungsformel oder abc-Formel. Weiteres dazu steht auch in der Wikipedia.mawe hat geschrieben:Mitternachtsformel? Hab ich noch nie gehört, klingt aber lustig *räusper*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi Leonidas!
Ja, die Formel kenn ich natürlich, aber nicht unter dem Namen Mitternachtsformel. Wir sagen dazu ... hmmm ... Formel zum Lösen quadratischer Gleichungen
Gruß, mawe
Ja, die Formel kenn ich natürlich, aber nicht unter dem Namen Mitternachtsformel. Wir sagen dazu ... hmmm ... Formel zum Lösen quadratischer Gleichungen
Gruß, mawe
Nun, so will ich das nicht sehen: Python ist nicht unbedingt numerisch stabil, ja. Aber sehr gut für viele wissenschaftliche Anwendungen geeignet - darunter liegt dann manches Mal C oder Fortran Code.Leonidas hat geschrieben:Nein, denke ich nicht, denn Python ist nicht für sowas ausgelegt.
PS Im Moment ist gerade eine Diskussion zur Zukunft von SciPy zugange. Bei Interesse einfach mal die Numpy-Mailingliste mitlesen.
Gruß,
Christian