Verfasst am: 07.12.2016, 17:42
Titel: lsqnonlin: Reihenfolge der Variablen, die gefittet werden
Hallo zusammen,
bei der Benutzung von lsqnonlin zur Lösung von nichtlinearen Ausgleichproblemen ist mir folgendes aufgefallen:
Nehmen wir an, zwei Variablen werden gefittet: a und b (was in dem Beispielprogramm unten z0 und D entspricht). Diese beiden werden als Vektor theta = [a,b] dem Solver übergeben.
Entgegen meiner Erwartung macht es nun jedoch einen Unterschied, ob ich theta = [a,b] übergebe oder die Reihenfolge ändere und theta = [b,a] übergebe.
Kann dieses Phänomen jemand erklären?
Dies ist ein Beispielprogramm, wo das Phänomen auftritt:
Code:
% Das Hauptprogramm:
L = 2*0.19857;
z0 = L/2;
D = 1e-4;
z = linspace(0,L,100);
t = linspace(1,100,100);
%% gestörte virtuelle Messdaten erstellen
for i = 1:100 for j = 1:100
c_meas(i,j) = 0.5*(1 - erf((z(i)-z0)/(2*sqrt(D*t(j)))));
end end
Ich erstelle erst die gestörten virtuellen Messdaten mit einem Rauschen, für die in der Zielfunktion die Variablen z0 und D optimiert werden.
Benutze ich Reihenfolge 1, erhalte ich für D = 1.000081448250844 und für z0 = 1.998554129292639
Mit Reihenfolge 2 hingegen erhalte ich D = 0.999929461960331 und z0 = 1.998591091467049
Die gestörten Messdaten speicher ich in einem Excel-file ab und rufe sie nach dem ersten Generieren nur noch ab, um immer die gleichen Messdaten zu haben.
Mir ist es ein Rätsel, dass nicht beide Male exakt die gleichen Werte für D und z0 herauskommen. Hat jemand eine Idee dazu?
lsqnonlin findet ja kein garantiertes globales Minimum, sondern versucht dem Optimum möglichst nah zu kommen.
Das Ergebnis für D unterscheidet sich um 0,015 %. Ich persönlich würde das bei solch einem Algorithmus noch als gleich bezeichnen
Evtl. werden die partiellen Gradienten der Zielfunktion in einer festen Reihenfolge berechnet und es kommt so zu leichten Ergebnisunterschieden, wenn die Reihenfolge der Variablen sich ändert.
Aber vielleicht weiß das noch jemand genauer. In der Hilfefunktion steht meines Wissens zumindest nichts darüber, dass die Reihenfolge relevant wäre.
0.015% Unterschied sind wirklich nicht viel, allerdings habe ich dieses Programm auch nur als einfaches Beispiel genommen.
In dem Programm, um das es eigentlich geht, entstehen durch die Vertauschung der Reihenfolge Unterschiede von etwa 1%, was in dem Fall für meine Zwecke definitiv zu viel ist.
Meines Wissens nach werden die partiellen Gradienten zwar nach einer festen Reihenfolge berechnet, allerdings sind die Berechnungen unabhängig voneinander.
Deswegen müsste die Reihenfolge theoretisch irrelevant sein.
Wenn der Optimierer empfindlich auf die Variation der Inputs reagiert, ist das Problem wohl instabil. Inwieweit Du dann den Endwert überhaupt als Ergebnis akzeptierst, solltest Du numerisch analysieren. In einem verrauschten Signal ein Minimum zu finden, ist immer mit einer gewissen Toleranz verbunden, denn das liegt in der Natur des Problems. Ein super-genauer lokaler Optimierer kann da auch nichts aus dem Hut zaubern.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.