Ableitung eines Polynoms

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.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Hallo Leute,
da ich ein absoluter Neuling bin in der Programmierung, wollte ich euch mal fragen ob ihr mir helfen könnt.
Nun zur Aufgabe:
Schreiben Sie eine Funktion abl zur Ableitung eines Polynoms. Das Polynom soll durch ein Dictionary beschrieben werden. Die Funktion abl erhält als Funktionargument das Polyno in Form eines Dictionaries und gibt das abgeleitete Polynom wieder in Form eines Dictionaries zurück.

Um ehrlich zu sein habe ich überhaupt keine Ahnung wie man das machen soll. Und währe euch sehr dankbar wenn ihr mir helfen könntet. :K
BlackJack

@lalalu: Was hast Du denn bis jetzt? Hast Du das Tutorial aus der Python-Dokumentation schon mindestens bis vor Klassen durchgearbeitet, oder etwas was Dich auf einen vergleichbaren Wissensstand bringt?

Wie sieht ein Polynom allgemein aus? Wie eine Ableitung davon? Wie kann man ein Polynom als Wörterbuch darstellen? Beantworte (Dir) diese Fragen und dann ist das eigentlich ganz einfach.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

naja ein Polynom wäre doch zb. x²+3x-2 ... und die erste Ableitung wäre doch 2x+3...
In einem Dictionary können beliebige Typen als Werte verwendet werden. Dort werden doch praktisch wie bei einer Variablen Werte zugewiesen oder nicht?...

Und Allgemein lautet die Ableitungsregel doch ... y=a*x(hoch n) ... y'=n*a*x(hoch n-1)

und wie soll ich das ganze jetzt in ein dictionary bringen?...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Indem du die Exponenten und die Koeffizienten in dem Dictionary codierst. Jetzt musst du dir nur noch überlegen, welchen der beiden du als Schlüssel verwendest und welchen als Wert.
Das Leben ist wie ein Tennisball.
deets

Eine Moeglichkeit waere zB die Schluessel als Koeffizienten aufzufassen, und die Werte alt Potenz. Also

y = a**n + b**n-1 + c**n - 2 + ...

Damit ergibt sich ein dict

{ a : n, b : n - 1, c : n - 2, ...}

Und danach das abgeleitete:

{ n*a : n - 1, b * (n - 1), ... }

Sollte sich fast schon in einer einzigen List-Comprehension ausdruecken lassen.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Vielen dank für eure Antworten aber ich seh da grad überhaupt nicht durch. Wäre echt nett wenn ihr mir einen Quelltext zukommen lassen könntet...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

deets hat geschrieben:Eine Moeglichkeit waere zB die Schluessel als Koeffizienten aufzufassen, und die Werte alt Potenz.
Zumindest für den Spezialfall, dass alle Koeffizienten != 0 verschieden sind ^^
deets hat geschrieben:y = a**n + b**n-1 + c**n - 2 + ...
Du meintest wohl: y = a*x**n + b*x**(n-1) + c*x**(n-2) + ...
lalalu hat geschrieben:Vielen dank für eure Antworten aber ich seh da grad überhaupt nicht durch. Wäre echt nett wenn ihr mir einen Quelltext zukommen lassen könntet...
Dann zeig doch mal, was du bisher versucht hast. Deine Hausaufgaben wird hier sicher niemand für dich machen, auch wenn es nur ein Einzeiler ist.
Das Leben ist wie ein Tennisball.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

also bisher habe ich das hier...

bsp.: -3x+2x**3-x**5

polynom = {0: -3, 3: 2, 5: -1}

def abl(polynom):
return sum([polynom[p]*x**p for p in polynom])
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

deets hat geschrieben:y = a**n + b**n-1 + c**n - 2 + ...

Damit ergibt sich ein dict

{ a : n, b : n - 1, c : n - 2, ...}
So müssten doch die Koeffizienten eindeutig sein. --> { n : a, n-1 : b, n-2 : c, ...}
Das riecht dann natürlich nach Liste .... aber soll wohl eine Übungsaufgabe zu Dictionaries sein (um jeden Preis) ...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Rekrul: Damit musst du allerdings alle Potenzen aufbauen deren Koeffizient = 0 ist.

@lalalu: Ich sehe da nur Code, der ein Polynom auswerten wuerde, aber in einem NameError resultiert, weil `x` nicht bekannt ist. Wenn da wieder ein Dictionary rauskommen soll, musst du auch eines erstellen. deets hat dir die Loesung ja eigentlich schon gezeigt, auch wenn du Keys und Values vertauschen solltest.
deets

Rekrul hat geschrieben:
deets hat geschrieben:y = a**n + b**n-1 + c**n - 2 + ...

Damit ergibt sich ein dict

{ a : n, b : n - 1, c : n - 2, ...}
So müssten doch die Koeffizienten eindeutig sein. --> { n : a, n-1 : b, n-2 : c, ...}
Das riecht dann natürlich nach Liste .... aber soll wohl eine Übungsaufgabe zu Dictionaries sein (um jeden Preis) ...
Ups (und EyDu auch) - stimmt. Ich finde ehrlich gesagt auch, das ein dict da voellig ungeeignet ist. Ich hatte erstmal ueber die Potenzen nachgedacht, und da ergibt sich natuerlich dasselbe Problem. Kann aber natuerlich sein, dass die per Definition eindeutig sind. Damit dreht sich das dict dann um. Auch nicht wirklich viel anders :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn wir einfach mal dünn besetzte Polynome mit einem sehr hohen Grad annehmen, dann ist ein Dictionary schon gar nicht mehr die schlechteste Lösung.
Das Leben ist wie ein Tennisball.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich denke für den Fall wär eine Liste eine deutlich einfachere Lösung. Für dünn besetzte Polynome ist ein Dictionary besser, aber ich denk das ist eher eine Hausaufgabe und da muss man jetzt nicht Overengineeren ;) Oh Listen, da war ja was... richtig, in der SICP-Vorlesung wird vorgemacht wie man sowas in Scheme implementiert, mit Listen natürlich :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Zitat Aufgabenstellung: „Das Polynom soll durch ein Dictionary beschrieben werden.” Den Freiheitsgrad eine Liste zu wählen haben wir also nicht. Also *wir* schon, aber der OP nicht. ;-)
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

y = a**n + b**n-1 + c**n - 2

und so muss ich das jetzt schreiben? d = { a : n, b : n - 1, c : n - 2}

und so gibt er mir das denn nachher aus oder wie? { n*a : n - 1, b * (n - 1)}
aber wie printe ich das denn?...

... Das Fach Programmierung habe ich mir auch nicht ausgesucht, das ist ein Semester was ich da überstehen muss, vielleicht erbarmt sich ja doch jemand und kann mir ein Quelltext zeigen.
BlackJack

@lalalu: Nein so kannst Du das nicht schreiben:

Code: Alles auswählen

In [158]: d = { a : n, b : n - 1, c : n - 2}
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

NameError: name 'n' is not defined
Was auch irgendwie klar sein sollte wenn man auch nur ein ganz bisschen Python verstehen würde. So wird das wohl nichts, wenn es echt darauf hinausläuft dass Du nur fertige Lösungen erbetteln möchtest.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Wenn ichs verstehen würde, würde ich wohl kaum euch fragen...
BlackJack

@lalalu: Was Dir hier an Wissen fehlt kann Dir niemand auf magische Weise in den Kopf einpflanzen.

Du brauchst ein mathematisches Grundverständnis, hier insbesondere über Polynome. Und ein Grundverständnis was programmieren ist, die Bedeutung von grundlegender Syntax von Python, und wie so ein Programm abgearbeitet wird. Und sowohl für den mathematischen als auch den Programmierteil die Fähigkeit vom konkreten Problem, also zum Beispiel ein konkretes Polynom oder den Vorgang eine Ableitung davon zu erstellen, auf eine allgemeine Darstellung eines Polynoms und eine formale Beschreibung des Ableitungsvorgangs zu abstrahieren, so dass Du beides einem Rechner in einer Programmiersprache vermitteln kannst.

Ein Polynom allgemein und konkret inklusive der konkreten Ableitung und der allgemeinen Ableitungsregel hast Du ja schon gegeben. Und ja, Wörterbücher bilden Objekte (Schlüssel) auf andere Objekte (Werte) ab. Dabei müssen die Schlüssel einmalig sein, genau wie man zu jeder gegebenen Zeit nur ein Objekt an einen (Variablen)Namen binden kann.

Jetzt musst Du Dir anschauen wie Du ein allgemeines Polynom in seine Bestandteile zerlegen kannst, die veränderlich sind, und die das Polynom eindeutig beschreiben. Dann wie man die Bestandteile zu (Schlüssel, Wert)-Paaren aufteilt, und was davon der Schlüssel und was der Wert sein muss. Dann weisst Du wie Du x²+3x-2 als Wörterbuch aufschreiben kannst. Kleiner Tipp: Schreibe Dir beim Überlegen die Polynome so regelmässig wie möglich auf, damit sie der allgemeinen Form am nächsten kommen. Bei dem Beispiel x²+3x-2 wird dabei ja so einiges weg gelassen.

Wenn Du Polynome als Wörterbücher kodieren kannst, muss Du eine Funktion entwickeln, die ein solches Wörterbuch als Argument bekommt und daraus ein neues Wörterbuch mit der Ableitung erstellt. Da reicht es nicht das irgendwie so ähnlich hin zu schreiben wie es in der allgemeinen Vorschrift zum ableiten aussieht, und zu hoffen das der Rechner oder die Programmiersprache schon irgendwie wissen was man möchte und das richtige tun. Du musst Dir überlegen wie die einzelnen Schritte bei einer Ableitung aussehen und diese dann mit Mitteln ausdrücken, welche die Programmiersprache zum Beschreiben von Abläufen anbietet.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

sooo... was sagt ihr denn hierzu?

Code: Alles auswählen

def abl(a, b, c, n):
    abl = {n*a:n-1, b*(n-1):n-2, c*(n-2):n-3}
    return abl
... er schmeißt jetzt ein dic raus aber verkehrt herum warum?
Zuletzt geändert von Anonymous am Sonntag 3. Juni 2012, 21:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dictionaries sind nicht "sortiert". Wenn Du eine bestimmte Ausgabeform haben willst, musst Du Dir z.B. mittels `sorted` die Schlüssel des Dicts in eine sortierte Liste übertragen, mit deren Hilfe Du Dir dann die Elemente sortiert anzeigen lassen kannst. Oder Du holst Dir die Tupel mittels `dict.items` und sortiert diese.

Deine "Lösung" ist wenig generisch. Zum einen muss man da eine andere Struktur übergeben, als man zurück bekommt, zum anderen klappt das ja nur für Polynome 2. Grades. Alles in allem also wenig flexibel.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten