Levenberg-Marquardt-mit-Matlab

Aus Physik
Zur Navigation springen Zur Suche springen

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. 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,c] = lma(x,y,sig,a,funktion,parameter,eps,opt)
Argumente:

  • x...Zeilenvektor der x-Komponenten der geg. Punkte
  • y ...Zeilenvektor der y-Komponenten der geg. Punkte
  • sig ...Zeilenvektor der Standardabweichungen der geg. Punkte
  • 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'}
  • eps... relativer Fehler der Fit-Parameter, der zu unterschreiten ist
  • opt... Falls opt = 1 Gibt lma() keine Texteldungen über den Konvergenzfortschritt aus

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

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



</math>