Ich suche ein möglichst einfaches, numerisches Verfahren, welches mir lokale Extrema bei einer solchen Funktion findet - dieses würde ich gerne in C oder C++ implementieren.
Das ist keine Hausaufgabe, mich interessiert nur, ob man solche nichtlinearen Optimierungsprobleme mit moderatem Aufwand programmatisch lösen kann.
Hmm, ich würde mir einen Punkt heraussuchen und dann drumherum die Funktionswerte auslesen. Dann vergleichen und in Richtung abnehmender bzw. zunehmender Werte weiter wandern.
Lokale Extrema zu finden ist meist nie das Problem. Einfach entlang des Gradienten wandern. Lohnt sich aber nicht fuer solch simple Beispiele.
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 10:07:38 17.01.2012, insgesamt 1-mal bearbeitet
Wie man damit in der Analysis umgeht, ist mir klar. Aber mal schnell Ableitungen bilden und nach 0-Stellen in dieser suchen, ist ja programmatisch so eine Sache. Genau darum geht es mir ja.
Wie ein lokales Extremum definiert ist, sollte klar sein. Jedes Extremum ist lokal, ich wollte nur betonen, dass es mir nicht auf das globale Extremum ankommt, welches, soweit ich weiß, auch nicht effizient gefunden werden kann in der nichtlinearen Optimierung.
Falls du nichts über die Funktion weist, könntest du den Nelder-Mead Algorithmus verwenden. Ansonsten ein Gradientenverfahren (wie schon erwähnt), Verfahren des steilsten Abstiegs (Steepest Decent), wobei du halt das Vorzeichen der Funktion umdrehen musst, wenn du ein Maximum suchst.
Ein Gradientenverfahren sucht nicht nach der Nullstelle der 1. Ableitung. Und kannst die Ableitung auch numerisch berechnen/approximieren.
Die Steigung der Tangente an der Interpolierten Stelle (quasi Partielle Ableitung):
§m=\frac{f(x_1,y_1+h)-f(x_1,y_1)}{h}=\frac{2(f(x_1,y_1+\frac{y_1-y2}{2})-f(x_1,y_2))}{y_1-y_2}§
--Stimmt, das newton Verfahren ist ganz gut (Gradientenverfahren),..
_________________ Der Contrapart in einer Diskussion zu sein, heißt nicht das dieser Standpunkt
der eigene sein muss!
Die meisten Verfahren der nichtlinearen Optimierung sind darauf ausgelegt, von einem gegebenen Startpunkt aus EINE Nullstelle möglichst schnell und genau zu finden. Die genannten Verfahren, Gradientenverfahren und Newtonverfahren sind sowas. Nelder-Mead kenn ich leider nicht, aber laut Wikipedia funktioniert es auch nur für unimodale Funktionen (also welche mit nur einem Extremalpunkt).
Ich muss also hier erstmal fragen: Geht es darum, ALLE Nullstellen zu finden oder genügt obiges? Falls letzteres, ist das Gradientenverfahren sicher das einfachste, das kann aber auch bei manchen Funktionen richtig langsam sein, wenn es sich in winzigen Zickzackschritten an den Optimalpunkt herantastet. Eventuell ist also ein globalisiertes Newton-Verfahren angeraten, bei solchen einfachen Funktionen ist das in jedem Fall drin.
(Falls ersteres: Keine Ahnung.)
Ich muss also hier erstmal fragen: Geht es darum, ALLE Nullstellen zu finden oder genügt obiges?
(Falls ersteres: Keine Ahnung.)
"falls ersteres:" alle Nullstellen eines Systems F zu finden, ist schon ein ziemlich nichttriviales problem, egal ob numerisch oder exakt, schon im relativ einfachen Fall von Polynomen - von komplizierteren Funktionen ganz zu schweigen.
Eine allgemeine methode ist, erstmal ein System G aufzustellen, dessen Nullstellen man sehr leicht berecchnen kann (sagen wir: x(x-1)(x-2)(x-3)), und dann mit einer Homotopie
Hom(t) = t*F+(1-t)*G
das Startsystem G nach und nach in F zu verwandeln, während man mit Newton die Lösungspfade trackt.
Und hofft, daß man nicht auf eine "Mine latscht", etwa eine Singularität auf einem der Lösungspfade, oder auf einen Lösungspfad, der nach einigen Pirouetten zum Anfangspunkt zurückkehrt.
Braucht man sämtliche Lösungen, und zwar alle exakt, dann: Gröbnerbasen
Vielen Dank für eure Beiträge. Da die Sache doch ziemlich kompliziert zu sein scheint, gebe ich mich erstmal mit irgendeinem lokalen Extremum zufrieden und verwende ein Gradientenverfahren
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.