Verfasst am: 15.12.2016, 12:35
Titel: Zu viel fminsearch.
Hallo, mal wieder fminsearch. Es gibt so viel Information dazu, dass ich mittlerweile eher verwirrt bin als dass es mir geholfen hätte. Daher die Frage nun hier.
Ich versuche, gemessene Daten mit einer e-Funktion zu fitten. leasqr habe ich sonst immer benutzt, da erhalte ich die Fehler "weighted residuals are not real". Dazu gibt es viel Info, darunter ein Bug-Report von 2012(?) und die Aussage, dass leasqr nicht die robusteste Variante für diese Art Problem ist. Daher jetzt der fminsearch-Ansatz.
Ich habe bisher verstanden, dass ich eine Funktion "y" brauche, die in der Lage ist meine Daten nachzubilden und ich brauche eine Funktion "err", die fminsearch minimieren soll, richtig? Ich will also so etwas benutzen wie:
Das sollte sich eigentlich direkt auf dein Beispiel übertragen lassen.
Die besten Parameter erhältst du dort aus der Funktion "optimierung".
Deine Funktion "y" entspricht in dem Beispiel der Funktion "fit_function".
Deine Funktion "err" entspricht in dem Beispiel der funktion "obj_function"
Gruß,
Nras.
P.S.: Dein Beispiel ist verwirrend, nutzt von p nur p(1) und p(2), fragst aber nach p(1)...p(3)?
function p_fit = optimierung(alpha60,cv60)
p0 = ones(1,4); % Start-Werte alle 1
p_fit = fminsearch(@objFun, p0);
function e = objFun(p)
cv60fitted = fit_function(alpha60, p);
e = sum((cv60fitted - cv60).^2);
end end
function yfitted = fit_function(alpha60, p)
exp_fun = p0(1) + p0(2).*e.^(alpha60./p0(3)).^p0(4);
end
function main
p_fit = optimierung(alpha60,cv60) end
Ok, mittlerweile habe ich Code der keine Fehlermeldungen auswirft. Funktionieren tut er trotzdem nicht:
Code:
A = dlmread('output.txt');
alpha60 = A(:,1);
cv60 = A(:,2);
function f = exponential(coeff,alpha60,cv60)
a = coeff(1);
b = coeff(2);
c = coeff(3);
d = coeff(4);
g = coeff(5);
h = coeff(6);
i = coeff(7);
Y_fun60 = a + b.*e.^(-alpha60./c).^d + g.*e.^(-alpha60./h).^i;
f = sum((Y_fun60 - cv60).^2);
end
options = optimset('TolFun',1e-8, 'TolX', 1e-8);
[cc fval] = fminsearch(@(c) exponential(c,alpha60,cv60),[1062530-270-6560-13],options)
fitted60 = cc(1) + cc(2).*e.^(-alpha60./cc(3)).^cc(4) + cc(5).*e.^(-alpha60./cc(6)).^cc(7); % das hab ich auch schon mal eleganter gesehen?
Der Plot sieht "bescheiden" aus, also: welches Minimum hat fminsearch gefunden? Wie kann ich dafür sorgen dass die fit-Funktion besser an die Daten rankommt?
deinen letzten Code Schnipsel kann ich nicht ausführen, der gibt zurück
Error: File: foo.m Line: 5 Column: 1
Function definitions are not permitted in this context.
Aber aus deinem erstem Code-Schnipsel kann man etwas machen. Da warst du schon recht nah dran. in der fit_function musst du natürlich p statt p0 verwenden, p0 ist nur der Startwert, von wo aus der Optimierer loslegt.
figure
alpha60_fit = linspace(min(alpha60), max(alpha60), 150); % Mehr Stützstellen für weichen plot semilogy(alpha60, cv60, 'ko')% Original Daten hold on
semilogy(alpha60_fit, fit_function(alpha60_fit, p_fit), 'g')% Ergebnis von fminsearch legend('location', 'northwest', 'Datenpunkte','Lösung mit Optimierer') end
function p_fit = optimierung(alpha60,cv60)
p0 = ones(1,4); % Start-Werte alle 1
p_fit = fminsearch(@objFun, p0);
% nested function function e = objFun(p)
cv60fitted = fit_function(alpha60, p);
e = sum((cv60fitted - cv60).^2);
disp(e) end end
function yfitted = fit_function(alpha60, p)
yfitted = p(1) + p(2).*exp(alpha60./p(3)).^p(4);
end
Zu den anderen Fragen:
Das gefundene Minimum ist durch den Vektor "p_fit" und der "fit_function" codiert. Man kann das dann auch darstellen.
Im semilogy-Plot sieht man wohl auch schon, warum das nicht sonderlich gut wird. Deine Eingangsdaten ergeben dort keine Gerade, können also nicht wirklich gut durch eine Exponentialfunktion dargestellt werden. Anscheinend arbeitest du aber ja schon daran, denn deine fit_function hat sich ja inzwischen auf irgendetwas mit 7 (!) zu optimierenden Parametern geändert.
Ansonsten gilt grundsätzlich: Probiere andere Startwerte aus, die können zu einem anderen Ergebnis führen.
Danke. Das Problem mit den nested functions, die noch nicht unterstützt werden, taucht dann leider wieder auf .
Der Fehler "Function definitions are ..." ist für mich genau so wenig aufschluss- / hilfreich.
Welche Parameterwerte hat denn Dein angepasster Code ausgegeben? Die würde ich gerne mal als Startwerte für mein Codebeispiel verwenden um zu sehen wie fminsearch dann "performt".
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.