WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zu viel fminsearch.

 

Tweety560
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2016, 12:35     Titel: Zu viel fminsearch.
  Antworten mit Zitat      
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:
Code:
y = e.^(p(1).*x).^p(2)
err = sum((y_data - y).^2)


Wie nutze ich fminsearch so, dass ich nachher die Parameter p(1)...p(3) als Ausgabe erhalte? Im Anhang meine x- und y-Daten.

Vielen Dank für Eure Unterstützung.

Ich nutze Octave 4.0 - falls das einen Unterschied macht.

output.txt
 Beschreibung:

Download
 Dateiname:  output.txt
 Dateigröße:  1.42 KB
 Heruntergeladen:  329 mal
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 15.12.2016, 14:56     Titel:
  Antworten mit Zitat      
Hallo,

schau mal in diesem Tutorial hier nach http://www.gomatlab.de/fitten-von-m.....abhaengigkeit-t38013.html

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)?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2016, 21:34     Titel:
  Antworten mit Zitat      
Hallo Nras, vielen Dank für den link. Das habe ich mal ausprobiert, leider kam ein Fehler zurück "nested functions not implemented in this context".

Mein Code:
Code:

A = dlmread('output.txt');
alpha60 = A(:,1); % x-Werte
cv60 = A(:,2); % y-Werte

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


Wie kann ich den Fehler umgehen? Habe ich den code überhaupt korrekt aufgebaut?

Danke,
T
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 11:16     Titel:
  Antworten mit Zitat      
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),[10 625 30 -270 -65 60 -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?

plot(alpha60,cv60, alpha60,fitted60)


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?

Danke,
T
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 16.12.2016, 14:04     Titel:
  Antworten mit Zitat      
Hallo,

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.

Hier ist mein Beispiel auf deinen Code angewandt.
Code:
function main

A = dlmread('output.txt');
alpha60 = A(:,1); % x-Werte
cv60 = A(:,2); % y-Werte

p_fit = optimierung(alpha60,cv60)


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 15:21     Titel:
  Antworten mit Zitat      
Hallo Nras,

Danke. Das Problem mit den nested functions, die noch nicht unterstützt werden, taucht dann leider wieder auf Sad.

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".

Viele Grüße,
T
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2016, 15:28     Titel:
  Antworten mit Zitat      
Ich habe weiter versucht mich dem Problem zu nähern, diesmal mit fmins:

Code:
clear; clc;
A = dlmread('output.txt');
alpha60 = A(:,1);
cv60 = A(:,2);
%cv60 = cv60/mean(cv60(end-50:end));

function f = exponential(coeff,alpha60,cv60)
p1 = coeff(1);
p2 = coeff(2);
p3 = coeff(3);
p4 = coeff(4);
p5 = coeff(5);
p6 = coeff(6);
p7 = coeff(7);
Y_fun60 = 1-(p1*exp(-(alpha60/p2).^p3)+(1-p1)*exp(-(alpha60/p4).^p5));
f = sum ((Y_fun60 - cv60).^2);
end

options = [0, 1e-10, 1e-10];
[p] = fmins('exponential', [1 1 1 1 1 1 1], options, [], alpha60, cv60)
fitted60 = 1-(p(1)*exp(-(alpha60/p(2)).^p(3))+(1-p(1))*exp(-(alpha60/p(4)).^p(5)));

plot(alpha60,cv60, alpha60,fitted60)


"whos" ergibt, dass fitted60 komplex ist.

Warum?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.