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

Kurvendiskussionen, dafür Funktionen zerlegen

Beitragvon netswipe » Sonntag 6. März 2005, 20:19

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])

Beitragvon mawe » Sonntag 6. März 2005, 21:44

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

Beitragvon BlackJack » Sonntag 6. März 2005, 23:42

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

Beitragvon netswipe » Montag 7. März 2005, 13:06

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])

Beitragvon mawe » Montag 7. März 2005, 16:13

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 7. März 2005, 17:47

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

Beitragvon CM » Montag 7. März 2005, 17:48

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])

Beitragvon mawe » Montag 7. März 2005, 20:45

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

Beitragvon netswipe » Montag 7. März 2005, 23:08

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

Beitragvon BlackJack » Dienstag 8. März 2005, 00:16

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:

Beitragvon CM » Dienstag 8. März 2005, 09:44

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 8. März 2005, 12:56

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

Beitragvon netswipe » Dienstag 8. März 2005, 14:58

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 8. März 2005, 17:46

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

Beitragvon netswipe » Dienstag 8. März 2005, 21:56

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]