Kurvendiskussionen, dafür Funktionen zerlegen

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.
netswipe
User
Beiträge: 12
Registriert: Sonntag 6. März 2005, 20:12
Wohnort: Edermünde
Kontaktdaten:

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 :)
mawe
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 :wink:

Gruß, mawe
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.
netswipe
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:

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 :/
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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 ...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
netswipe
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: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 :)
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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
netswipe
User
Beiträge: 12
Registriert: Sonntag 6. März 2005, 20:12
Wohnort: Edermünde
Kontaktdaten:

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.
Leonidas
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:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
netswipe
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
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):

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
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 :D

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten