Seite 1 von 2

Kurvendiskussionen, dafür Funktionen zerlegen

Verfasst: Sonntag 6. März 2005, 20:19
von netswipe
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 :)

Verfasst: Sonntag 6. März 2005, 21:44
von mawe
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 :wink:

Gruß, mawe

Verfasst: Sonntag 6. März 2005, 23:42
von BlackJack
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.

Verfasst: Montag 7. März 2005, 13:06
von netswipe
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:

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
Der Fehler ist:

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
WIe man sieht geht die Ausgabe noch, abe rmultiplizieren geht nich, weil keine Integer. Obwohl ich vorher drauf geprüft hab :/

Verfasst: Montag 7. März 2005, 16:13
von mawe
Hi!

Versuchs mal so:

Code: Alles auswählen

if isInt ...:
    mA = float(mA)
    hochzahlA = float(hochzahlA)
PS: Symbolisches Differenzieren selbst programmieren ist WAHNSINN! Wollt ich nur mal erwähnen :)

Gruß, mawe

Verfasst: Montag 7. März 2005, 17:47
von Leonidas
mawe hat geschrieben:PS: Symbolisches Differenzieren selbst programmieren ist WAHNSINN! Wollt ich nur mal erwähnen :)
Und Maxima ist wirklich gut, ich habe es sogar auf Woody gebackportet, so toll fand ich's :)

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 
Also die float() Funktionen werden nicht gehen, da float() Floats zurückgibt, nicht vorhandene Variablen modifiziert. Somit bleiben deinen Variablen als Ints.

Verfasst: Montag 7. März 2005, 17:48
von CM
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. :x 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 ...

Verfasst: Montag 7. März 2005, 20:45
von mawe
Hi!
CM hat geschrieben: Was Du hier zeigst, ist so irgendwie von hinten durch die Brust ins Auge ...
Treffender hätte man's nicht sagen können :)

Für alle die zu faul sind die Numerical Recipes in C nach Python zu portieren, gibts hier etwas zum Schmökern :wink:

Gruß, mawe

Verfasst: Montag 7. März 2005, 23:08
von netswipe
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: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 :)

Verfasst: Dienstag 8. März 2005, 00:16
von BlackJack

Code: Alles auswählen

print "%fx%f" % (mA1, hochzahlA1)
Eine Fliesskommazahl hat immer ein Komma, aber man kann die Ausgabe ohne Komma mit dem entsprechenden Formatierungscode erreichen.

Verfasst: Dienstag 8. März 2005, 09:44
von CM
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
off-topic Kommentar zu mawes Link:
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

Verfasst: Dienstag 8. März 2005, 12:56
von Leonidas
netswipe hat geschrieben:Kirze ergänzende Frage noch, kann ich das FLoat auch ohne Kommastellen bekommen? Ne Fließkommazahl ohne Kommastellen so zusagen :D:D
Ich würde es so machen:

Code: Alles auswählen

float(int(wert))
Aber für die Ausgabe mit Print ist BlackJacks Variante besser.

Verfasst: Dienstag 8. März 2005, 14:58
von netswipe
BlackJack hat geschrieben:

Code: Alles auswählen

print "%fx%f" % (mA1, hochzahlA1)
Eine Fliesskommazahl hat immer ein Komma, aber man kann die Ausgabe ohne Komma mit dem entsprechenden Formatierungscode erreichen.
Stimmt, da hätte ich auch selber drauf kommen müssen, aber danke :)
Das mit dem Formatierungscode raff ich nich so ganz, krieg ich mal bitte nen Beispiel? :) Das wär nett.

Verfasst: Dienstag 8. März 2005, 17:46
von Leonidas
Es ist in der Python Doku beschrieben. Wobei man zugeben muss, dass die nicht wahnsinnig umfassend ist.

Edit:

Code: Alles auswählen

"%1.0f" % 1.33333
"%.10f" % 1.33333
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.

Verfasst: Dienstag 8. März 2005, 21:56
von netswipe
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

Verfasst: Mittwoch 9. März 2005, 13:29
von Leonidas
netswipe hat geschrieben:Naja vielelicht funktioniert ja sowas wie

for Funktion == 0:
print x
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.

Verfasst: Mittwoch 9. März 2005, 14:11
von mawe
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):

Code: Alles auswählen

                           f(x(i))
x(i+1) = x(i) -  ----------
                           f'(x(i))
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

Verfasst: Mittwoch 9. März 2005, 14:18
von Leonidas
mawe hat geschrieben:Mitternachtsformel? Hab ich noch nie gehört, klingt aber lustig :) *räusper*
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.

Verfasst: Mittwoch 9. März 2005, 14:24
von mawe
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 :D

Gruß, mawe

Verfasst: Mittwoch 9. März 2005, 15:21
von CM
Leonidas hat geschrieben:Nein, denke ich nicht, denn Python ist nicht für sowas ausgelegt.
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.

PS Im Moment ist gerade eine Diskussion zur Zukunft von SciPy zugange. Bei Interesse einfach mal die Numpy-Mailingliste mitlesen.

Gruß,
Christian