Levenberg-Marquardt-mit-Matlab
Inhaltsverzeichnis
Was ist der Levenberg-Marquardt-Algorithmus (LMA), und wofür wird er gebraucht
Am besten ich erkläre an einem Beispiel:
Gegeben ist folgendes Problem: Bei einem Versuch werden Daten gemessen. z.B. Spannung an einem kondensator, der gerade über einen Widerstand entladen wird.
Es wird einmal pro sekude die aktuelle spannung gemessen. Dann werden in einem Plot in x-Richtung die Zeit, in y-Richtung die spannung aufgetragen. Das sind die x und y Daten. Die y-Daten sind fehlerbehaftet, da das Messgerät nicht ganz genau messen kann. Die Standartabweichung des üblicherweise Normalverteilten Fehlers sei d_y (Oft auch [math]\sigma_y[/math] geschrieben). Bei kleineren Spannungen kann man das Messgerät auf eine kleinere Skala umschalten, der absolute Messfehler wird dort also kleiner, d_y ist nicht überall gleich gross. Man trägt nun auch die Fehlerbalken in das Diagramm ein. Der Wert des Widerstands sei bekannt. Der Fehler in x-Richtung sei zu vernachlässigen. Man möchte nun die Kapazität des Kondensators berechnen.
Das Mathematische Model, die Fitfunktion für die Spannung sieht so aus:
- [math]U(t) = U_{max} \cdot e^{-{t \over \tau}}[/math]
oder wie im Beispielprogramm geschrieben:
- [math]y = P1 \cdot e^{-{x \over P2}}[/math]
mit
- [math]\tau = R \cdot C[/math]
Die unbekannten Parameter der Fitfunktion sind nun [math]P1 = U_{max}[/math] und [math]P2=\tau[/math] Aus P2 lässti sich natürlich die Kapazität ausrechnen.
Mit dem LMA können diese Parameter und die Standartabweichungen der Parameter berechnet werden. Man bekommt also eine Aussage, wie vertrauenswürdig die berechneten Parameter tatsächlich sind. Dazu übergibt man an den LMA die x, y und d_y Werte, und die Fitfunktion einfach als einen String. Das wäre bei diesem Beispiel 'P1 * exp(-x/P2)'.
Zum fitten könnte man nun die nlinfit() von Matlab verwenden, nlinfit() hat aber den Nachteil, dass es d_y nicht auswertet.
Verwendung von lma.m
lma.m ist eine Matlab Funktion.
[a,sd_a,var,covar,chisqr] = lma(x,y,sig,a,funktion,parameter)
[a,sd_a,var,covar,chisqr] = lma(x,y,sig,a,funktion,parameter,accuracy,verbose)
Argumente:
- x...Zeilenvektor der x-Komponenten der geg. Punkte
- y ...Zeilenvektor der y-Komponenten der geg. Punkte
- sig ...Zeilenvektor der Standardabweichungen der y-Komponente
- a ... Zeilenvektor der guessed values fuer die Parameter z.B: [0.1,4]
- funktion ...als Text übergebene Fitfunktion, z.b: 'P1 * exp(-P2 * x)'
- Parameter ...Cell-Array-Vektor der Parameternamen. z.B: {'P1','P2'}
Optionale Argumente:
- accuracy... relativer differentieler Fehler (von einem Konvergenzschritt zum nächsten) der Fit-Parameter, der zu unterschreiten ist. Defaultwert ist identisch mit eps() (meist 2.2204e-16)
- verbose... Falls verbose == [] oder wenn es nicht übergeben wird, Gibt lma() keine Textmeldungen über den Konvergenzfortschritt aus. Falls verbose eine nichtleere Variable ist, wird der Fortschrittstecxt ausgegeben.
Rückgabewerte:
- a... Zeilenvektor der gefitteten Parameter
- sd_a... Zeilenvektor der Standardabweichungen der Parameter
- var... Varianz des Fits Anfang und Ende des Sollbereichs
- covar... Kovarianz-Matrix (normiert gemaess Skriptum, S. 109)
- chisqr... [math]\chi^2[/math] Summe der Fehlerquadrate
Genaueres zu zu den Rückgabewerten sind hier nachzulesen Numerische Methoden in der Physik von Prof. Sormann im Kapitel 4
Symbolisches Rechnen
In lma.m werden die Ableitungen der Fitfunktion nach den Parametern gebraucht. Normalerweise müsste man dem LMA nicht nur die Fitfunktion, sondern auch alle ihre Ableitungen nach den Parametern übergeben. Das wäre etwas umständlich und man könnte leicht einen Fehler einbauen. Mit der Symbolic Toolbox hat Matlab die Möglichkeit symbolische Berechnungen durchzuführen, wie z.B. Differenzieren, Integrieren, Gleichungen auflösen... In lma.m wird die Fitfunktion einfach als String (Text) übergeben. Daraus wird eine symbolische Variable generiert. Die Parameter in der Parameterliste werden ebenfalls in symbolische Variablen umgewandelt. Die 'symbolische' Fitfunktion werden nun jetzt mit dem Befehl diff nach den 'symbolischen' Parametern abgeleitet und in einer neuen symbolischen Variable gespeichert werden.
Projektdaten
- lma.m ... Die Implementierung der Levenberg-Marquardt Algorithmus
- fit_beispiel.m ...Ein Beispielscript, in dem gezeigt wird, wie man lma.m benutzt
Am besten, man speichert lma.m im Ordner ~/matlab, da Matlab dort standartmässig als erstes nach aufgerufenen Funktionen sucht. (Mit dem Befehl path den man einfach in das command window von Matlab eintippen kann, sieht man ob ~/matlab auch tatsächlich verwendet wird. Wobei ~ die übliche von Linux benutzte Abkürzung für das Homeverzeichniss des Benutzers ist.)
Die Funktion muss dann nicht immer in das aktuelle Arbeitsverzeichniss von Matlab kopiert werden, wenn sie gerade gebraucht wird.
Fehlermeldung?
Sollte diese Fehlermeldung beim Benutzen von lma.m kommen: ??? Invalid MEX-file '/afs/itp.tugraz.at/opt/matlab/R14.sp2a/toolbox/symbolic/maplemex.mexglx': /afs/itp.tugraz.at/opt/matlab/R14.sp2a/bin/glnx86/libmaple.so: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference. dann gibt es die folgende Lösung:
- eine Konsole aufmachen
- dort folgendes eintippen:
$ export LD_ASSUME_KERNEL=2.4.1
- dann aus der gleichen Konsole matlab starten:
$ matlab
--Golubkov 17:52, 24 Oct 2005 (CEST)