Thema: Nichtlineare Optimierung

Hallo guys,<P>hier mal was aus dem wahren Leben:<P>Für die Funktion <BR>x=y/a+(y/b)^(1/c)<BR>sind bei gegebenen (x,y)-Wertepaaren die Parameter a,b, und c zu bestimmen.<BR>Als Test sollte man sich beispielsweise folgende (sinnvolle!) Werte vorgeben:<BR>a=180000<BR>b=1400<BR>c=0.16<BR>0<=y<=1000<BR>Mit den erhaltenen (x,y)-Werteparren soll man jetzt versuchen die Parameter a,b und c zu ermitteln (natürlich müssen dann die o.g. rauskommen     [img]images/icons/grin.gif" border="0[/img])<P>Hinwiese:<BR>Wer ein bissel pfiffig ist, der findet schnell ne Lösung mittels der linearen Regression. Die könnte auch mal gepostet werden, um zu zeigen, wie man eine nichtlineare Optimierung auf eine lineare zurückführen kann (wird aber nicht als Lösung anerkannt).<BR>Die brachiale Lösung - Absuchen von sinnvollen diskreten a,b,c-Kombinationen und Auffinden eines Minimums - wird auch nicht akzeptiert.<BR>Wer das ableitungsfreie Optimierungverfahren nach ROSENBROCK kennen sollte (gute Konvergenz bei Gräben und Nebenminimas), der wird damit auf die Nase fallen - geht hier nicht. Kanns aber trotzdem versuchen.<BR>Der zu minimierende Fehler kann in x- oder in y-Richtung gebildet werden(*****). Sinnvoll ist meiner Meinung nach ein gewichteter Fehler aus beiden (kann man einfach mit ner linearen Regression überprüfen).<P>(*****)Anmerkungen zu dem Fehler:<BR>Das ist leichtverstaendlich an einem Beispiel der brachialen Methode zu erlaeutern:<BR>1. Ich habe z.B. 30 (y,x)-Wertepaare fuer a=180000 b=14000 c =0.16 und 0<=y<=1000 erzeugt = Ausgangskurve<BR>2. Ich lasse die Parameter in den Grenzen 100000<=a<=250000, 1000<=b<=2000 und 0.1 <=c<=0.2 mit einer jeweils konstanten Schrittweite (sagen wir 100 mögliche Realisierungen fuer jeden Parameter) laufen und berechne mir für jede mögliche Kombination von a,b, und c eine neue Kurve für 0<=y<=1000, d.h. ich habe zu der Ausgangskurve noch 100*100*100 andere Kurven, von denen eine die von mir gewuenschte Loesung beinhaltet<BR>3. Wie kann ich die finden?: Ueber ein Fehlerkriterium - sicher bekannt das Fehlerquadratminimum von Gauss. Da wo der Fehler fuer eine der Kurven minimal wird, da ist die Kurve mit meinen zu findenden Parametern a=180000 b =1400 c=0.16<BR>4. Wie funktioniert das: Man nehme die Wertepaare der Ausgangskurve und die Wertepaare einer Kurve aus den möglichen Kombinationen fuer a,b und c. Fuer jedes y(i) bilde man die Diffenenz und quadriere sie. Aufsummiert ergibt das einen Fehler (der auch noch durch die Anzahl der Wertepaare geteilt werden kann - hier waren es 30), der mir angibt, wie weit meine momentane Kurve von der Ausgangskurve abweicht. Ist der Fehler 0, dann liegt die momentane Kurve auf der Ausgangskurve. Aber!!! NUR in der y-Richtung, deshalb sollte man auch die x-Richtung mit beachten und dort das gleiche machen. Da der Fehler in der beschriebenen Art und Weise ein absoluter ist sollte man die Groessenordnung noch vereinheitlichen, d.h. Wichten.<BR>5. Das Fehlerquadratminimum funktioniert fuer viele Sachen gut, bei der Gleichung nicht, weshalb noch andere Fehlerkriterien aufgefuehrt sind:<BR>5.1. von der Differenz den Betrag<BR>5.2. die Wurzel aus 5.1<BR>5.3. die 4.te Wurzel aus 5.1<BR>Mit der beschriebenen Herangehensweise kann man eine Sensitivitaetsanalyse (wie Empfindlich reagiert meine Gleichung auf Störungen der (y,x)-Werte, wie gut kann ich einen minimalen Fehler finden) durchfuehren. Stellt man sich z.B. fuer ein konstantes a und laufendem b und c den Fehler aller möglichen Kurven dar, dann erhaelt man 3D ein sehr schoenes Bild, wie der Fehler fuer eine Stelle gegen 0 geht - das Minimum des Fehlers, d.h. meine gesuchten Parameter. Wenn die Kurve ein Trichter ist, dann hat mein Optimierer auch keine grossen Schwierigkeiten das Minimum zu finden, das Problem konvergiert gut. Wenn nicht, dann muss ich nen anderen suchen. Fuer die Gleichung siehts relativ schlecht aus.<BR>Das alles ist nur zum Testen und Erkunden. Das eigentliche Ziel aber ist es für z.B. gemessene Wertepaare (y,x) dann a,b und c zu bestimmen, wobei man sich doch schon auf sein Verfahren verlassen sollte - deshalb vorher schaun, ob der Optimierer auch funktioniert.<p>[ 03.06.2001: Beitrag editiert von: wintel ]

Re: Nichtlineare Optimierung

Heheheeh   [img]images/icons/shocked.gif" border="0[/img] da muss man ja ewig scrollen  [img]images/icons/wink.gif" border="0[/img]<P>Wie ist das mit dem Problem der signierten Scripte gemint?<P>Ich werd versuchen mirs auszudrucken.   [img]images/icons/cool.gif" border="0[/img]

mfG whitehouse

Re: Nichtlineare Optimierung

Ausgedruckt (Querformat) VIER Seiten, allein das ERSTE Posting... hui<P>Und wie importiert man das nun in ein lesbares Format (viele $ und  und {}...)<p>[ 03.06.2001: Beitrag editiert von: whiteheart ]

mfG whitehouse

Re: Nichtlineare Optimierung

@wintel: Beantworte doch mal meine Frage in dem kleinen Puzzle. Is eigentlich ganz einfach, hab alles gesagt.

mfG whitehouse

5

Re: Nichtlineare Optimierung

<BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">Zitat:</font><HR>Und wie importiert man das nun in ein lesbares Format (viele $ und  und {}...)<BR><HR></BLOCKQUOTE><P>Via TEX - ftp.dante.de  [img]images/icons/wink.gif" border="0[/img]

6

Re: Nichtlineare Optimierung

<BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">Zitat:</font><HR>Wie ist das mit dem Problem der signierten Scripte gemint?<BR><HR></BLOCKQUOTE><BR>Da hab ich mal ein Problem und keiner antwortet.<BR>Siehe<BR><A HREF="http://www.devshare.de/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=5&t=002004" TARGET=_blank>Signierte Scripte</A>

7

Re: Nichtlineare Optimierung

O.K.:<BR>Zum Einstieg in die Angelegenheit kann man ja folgende Sache versuchen (mal andere Bezeichner):<BR>x       = y/e + (y/k)^(1/n) | -y/e<BR>x - y/e = (y/k)^(1/n)<BR>Hintergrund: Ich habe bekannte diskrete (y,x) und ziehe den linearen Teil ab. Dabei setze ich voraus, daß man sich über eine gesonderte Rechnung das e ermittelt.<BR>ln-drüber:<BR>ln{x - y/e}=ln{(y/k)^(1/n)}<BR>           =(1/n)*ln{y/k}<BR>           =(1/n)*[ln{y} - ln{k}]<BR>           =(1/n)*ln{y} - (1/n)*ln{k}<BR>Im doppelt ln-Netz ist das eine Gerade:<BR>y = ax + b<BR>dabei ist hier konkret (immer an die diskreten (y,x)-Werte denken und das e bereits bekannt ist)<BR>y = ln{x - y/e}<BR>x = ln(y)<BR>a = 1/n<BR>b = (1/n)*ln{k}<BR>Wenn ich jetzt alle Punkte mal im doppelt ln-Netz darstelle erhalt ich eine wunderschöne Gerade (ich kann natürlich auch die Punkte mit dem ln-Umrechnen und dann im linearen Netz darstellen). Darüber kann ich einen lineare Regression durchführen und erhalte daraus mein a und b der Geradengleichung.<BR>Umgerechnet ergibt sich:<BR>n = 1/a<BR>b   = (1/n)*ln{k} = a*ln{k}<BR>b/a = ln{k}<BR>k   = e^(b/a)<P>Ist das nicht was für den Anfang?<p>[ 03.06.2001: Beitrag editiert von: wintel ]

Re: Nichtlineare Optimierung

Grrr, dafür bin ich viell. zu jung. Auf jeden Fall imuss mir des mal genauer anssehen.

mfG whitehouse

Re: Nichtlineare Optimierung

Sorry, aber mit Logarithmen kann ich (fast)überhaupt nix anfangen (weiss nur, dass lg x das y für das 10^y=x oder lb x das y für 2^y=x und loga x das y für das a^y=x und ln x das y für e^y=x). Ich bin nunmal erst in der 7. Klasse.<p>[ 03.06.2001: Beitrag editiert von: whiteheart ]

mfG whitehouse

10

Re: Nichtlineare Optimierung

[img]images/icons/confused.gif" border="0[/img]  Tut mir leid, ich dachte das wär schon drangewesen.

Re: Nichtlineare Optimierung

Na ja, kann ich auch nix machen  [img]images/icons/frown.gif" border="0[/img] .<P>Kannst aber doch mein neuestes Rätsel lösen. Wie mans macht ist einfach, doch den Beweis, den kenn ich selber nich (was nich sehr viel heist  [img]images/icons/wink.gif" border="0[/img]).

mfG whitehouse

12

Re: Nichtlineare Optimierung

Tach wintel,<BR>ich hab mir mal erlaubt, für all die, die kein bessres Matheprogramm haben, ein kleines<BR>Script zu machen, das die Art der Kurven zeigt, um die's geht:<P><html><head><title>optimierung</title><BR><script><BR>j=0;i=0;z=0;a=100000;b=1000;c=0.1;<BR>function T()<BR>{t=window.setInterval("B()",1);}<P>function B()<BR>{z++;j++;i++;a+=1000;b+=10;c+=0.01;<BR> x=z;<BR> y1=x/a+(Math.pow(x/b,1/c));<BR> y2=x/a+(Math.pow(x/b,1/(c*0.9)));<BR> document.getElementsByTagName("p")[0].appendChild(document.createElement("div"));<BR> document.getElementsByTagName("p")[1].appendChild(document.createElement("span"));<BR> with(document.getElementsByTagName("div")[j-1].style){fontSize=0;backgroundColor="yellow";height=1;width=1;position="absolute";marginTop=y1*500+190;marginLeft=x;}<BR> with(document.getElementsByTagName("span")[i-1].style){fontSize=0;backgroundColor="red";height=1;width=1;position="absolute";marginTop=y2*500+200;marginLeft=x;}<BR> document.bgColor="black";}<BR></script><BR></head><BR><body onclick="T()"><BR><p></p><p></p><BR></body></html><P>Das hat zwar nichts mit der Lösung zu tun, aber vielleicht kann der eine oder die andre sich's dann besser vorstellen, und außerdem isses hübsch bunt.......<P>grüße nach Sachsen<P>matho<p>[ 05.06.2001: Beitrag editiert von: matho ]

13

Re: Nichtlineare Optimierung

He matho,<P>ich wußte ja garnicht, daß man mit JS auch so richtig was malen kann. Das is ja stark.<P>Ist aber auch interessant zu beobachen, wie der Rechner (bei mir dual-PIII550, 512MbRAM, WinNT) in die Knie geht  [img]images/icons/grin.gif" border="0[/img]<P>Kann mir jetzt so bildlich vorstellen, was es mit Glühen bei DIR heißt. Oder ist das JS nur  zum Anschauungsobjekt für alle?<P>Auf jeden Fall vielen Dank.<P>Herzliche Grüße<P>wintel

14

Re: Nichtlineare Optimierung

@wintel,<P>ooch, mit javascript kann man noch viel mehr sehr schöne Sachen machen, aber leider,leider, der Geist ist willig, das Fleisch ist - ach - schwach, die kleinen PC's<BR>brauchen halt ewiglich.......weswegen ich's auch nicht in 3D gemacht hab, wäre theoretisch kein Problem, aber da würden wir an Weihnachten noch sitzen und dem Ticken der Sanduhr lauschen.<BR>Zum Glück hat die Lösung Deiner Aufgabe aber nichts mit nem Rechner zu tun, sondern bloß mittem Kopp, und ich muß zugeben, meiner qualmt davon ziemlich.<P>  [img]images/icons/grin.gif" border="0[/img]<P>Aber ich bleib dran.......<P>Herzliche Grüsse dito<P>matho

Re: Nichtlineare Optimierung

Hey, mit JS kann man auch die Fourier-Transform machen. Wer implementiert und testet mir das  [img]images/icons/grin.gif" border="0[/img]? <BR>Selbstverständlich mit Seti-großen Mengen, sonst ist ja nich realitätsnah [img]images/icons/tongue.gif" border="0[/img].<p>[ 05.06.2001: Beitrag editiert von: whiteheart ]

mfG whitehouse