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

Nichtlineare Regression inkl vorgegebener Funktion

 

Jigs
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2010, 18:16     Titel: Nichtlineare Regression inkl vorgegebener Funktion
  Antworten mit Zitat      
Hallo!
Da ihr mir immer so gut weitergeholfen habt, habe ich wieder mal eine Frage, da ich einfach nicht weiter komme. Wenn ich nach nonlinear Regression suche dann müsste es ja genau das sein, nur finde ich keine passenden "Beispiele" die mir weiterhelfen.
Vielen Dank schon mal fürs anschauen!

Also ich habe folgende Situation:
Ich habe 6 Messpunkte (X,Y-Koordinaten bekannt), welche ich in meiner GUI in einem Plot anzeigen lasse. Jetzt muss ich eine Kurve in die 6 Messpunkte hineinlegen. Das Problem: Die Regressionskurvenfunktion ist vorgegeben.
Y(X) = z1^a - z2^b *(c + d*X + e*X^2) (z1 und z2 sind Konstanten und bekannt)

a, b, c, d, e müssen so berechnet werden, dass diese durch die 6 Messpunkte gehen bzw an die 6 Messpunkte angenähert/minimiert werden.
Allgemeine empfohlene Startwerte habe ich auch vorgegeben, müssen aber nicht unbedingt verwendet werden.

Mit polyfit, ployval kann ich umgehen, nur leider nützt mir das hier nix, weil ich keine Polynomfunktion habe.

Wie löse ich am besten das Problem?


Vielen Dank für eure Mühe!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.08.2010, 19:04     Titel:
  Antworten mit Zitat      
Hallo,

Code:

erfordern allerdings Statistics Toolbox bzw. Optimization Toolbox.

Vorsicht: wenn die Daten fehlerbehaftet sind, kann man aus 6 Werten nicht mit vernünftiger Genauigkeit 5 Parameter schätzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 07:50     Titel:
  Antworten mit Zitat      
Zitat:

Y(X) = z1^a - z2^b *(c + d*X + e*X^2) (z1 und z2 sind Konstanten und bekannt)


Das ist doch ein Polynom in X. Allerdings sind a,b und c voneinander abhängig, dadurch kann man sie nicht genau bestimmen. Wenn man a,b = 0 setzt erhält man:

Y(X) = f - d*X - e*X^2
f = 1 - c

Jetzt kannst du mit polyfit f,d und e bestimmen. Die gesuchten Parameter sind dann:

a = 0
b = 0
c = 1 - f
d = d
e = e

Du kannst a und b auch irgendwie anders setzen. Dann erhälst du ein anderen Wert für c, aber dieselbe Funktion Y(X).
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 12:28     Titel:
  Antworten mit Zitat      
sry hatte einen kleinen fehler drinen: die gleichung war so:

Y(X) = z1^a * z2^b *(c + d*X + e*X^2)

dürfte aber auch nicht viel daran ändern.

aber danke für den Hinweis. Ich bin jetzt auch bissl baff, weil du natürlich recht hast. also a und b null setzen ist ganz schlecht, weil Z1 und Z2 wichtige Informationen enthält. ich muss mal gucken wie sich das ganze verhällt.
Vielen Dank dir!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.08.2010, 12:38     Titel:
  Antworten mit Zitat      
Hallo,

Thomas hat da ganz recht: das ist in dieser Form schlecht formuliert, da es zu im Grunde jeden a, b Werte c, d und e gibt, die eine optimale Anpassung liefern.

Da musst du aber auch zurück zur Problemstellung gehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 18:20     Titel:
  Antworten mit Zitat      
ich werde das mal prüfen, ob wirklich das gleiche rauskommt. auf dem ersten blick sieht es so aus. es handelt sich hier um eine US-Norm die das so vorgeben und sich schon was dabei gedacht haben müssen (denke ich mal). Normalerweise soll das mit dem BFGS-verfahren durchgeführt werden - ist aber nur eine Empfehlung. (falls jemand ein fertiges bfgs-verfahren hat, kann er das ruhig posten Wink )
Z1 und Z2 sind ziemliche wichtige Informationen die die QUalität der Minimierung vielleicht verbessern. Ich werde mich bei einem Mathematiker nochmal schlau machen

EDIT:
Code:
könnte auch was passendes sein. Eben "entdeckt" Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2010, 22:53     Titel:
  Antworten mit Zitat      
Ich hab nochmal eine Zwischenfrage.
Laut der Matlab Hilfe kann ich mit "fminunc" gar keine X und Y-Koordinaten eingeben, oder? Letztendlich wird doch nur die Funktion als solche minimiert.
xdata und ydata kann ich gar nicht angeben wie bei lsqcurvefit??
Denn dort erhalte ich ja meine "Koeffizienten" und nicht wie bei "fminunc", wo nur die Funktion selber mit der abhängigen Variable X minimiert wird?!
Oder sehe ich das falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2010, 07:21     Titel:
  Antworten mit Zitat      
Hallo!

in beiden Fällen wird "nur" eine Funktion minimiert. Allerdings ist die Übergabe der Daten etwas unterschiedlich. Bei Lsqcurvefit wird automatisch die quadratische Abweichung zwischen Daten und den approxierten Werten berechnet, während man das bei fminunc per Hand machen muss (Das hat allerdings den Vorteil das man auch andere Kriterien als die Summe der quadratischen Abweichungen verwenden kann).


Code:


% Aufruf von lsqcurvefit
P=LSQCURVEFIT(FUN_LSQCURVEFIT,P0,XDATA,YDATA);

% Berechnung der approximierten Y Werte
FUN_LSQCURVEFIT(P,XDATA)

Y = Y(P,XDATA);

% Aufruf von fminunc
P=FMINUNC(FUN_FMINUNC,P0)

FUN_FMINUNC(P,XDATA,YDATA)

Y = Y(P,XDATA)
v = std(Y-YDATA);
 


Falls du aber immer noch die gleiche Funktion zur Anpassung verwenden willst, wirst du Probleme bekommen da es kein eindeutiges Minimum gibt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2010, 11:22     Titel:
  Antworten mit Zitat      
entschuldigung für die verspätete Rückmeldung.
vielen Dank dir. ich werd das dann mal ausprobieren.

erstmal muss ich ich Versuche fahren, um die Daten zu haben.
Ich werde mich dann nochmal melden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2010, 11:03     Titel:
  Antworten mit Zitat      
Hallo!
da bin ich wieder Smile

Ich habe mit lsqcurvefit die Berechnung hinbekommen.

Allerdings scheitere ich bei fminunc.

Ich habe ein myfun.m - File

Code:
function F = myfun(x,xdata)
F = x(1) + x(2)*xdata + x(3)*xdata.*xdata;


dann in meinem Programm sieht der Ablauf so aus:

Code:
Fx1 = 63.3;
Fx2 = 59.7;
Fx3 = 53.62;
Fx4 = 50.71;
Fx5 = 47.0;
Fx6 = 42.1;
Fx7 = 39.0;
Fx8 = 36.95;
v1 = 115;
v2 = 88.8;
v3 = 66.5;
v4 = 53.7;
v5 = 42.6;
v6 = 29;
v7 = 22.1;
v8 = 15;

xdata = ...
[v1 v2 v3 v4 v5 v6 v7 v8];
ydata = ...
[Fx1 Fx2 Fx3 Fx4 Fx5 Fx6 Fx7 Fx8];

x0 = [20; 0.1; -0.0001];

P = FMINUNC(@myfun,x0);

myfun(P,xdata,ydata);


nur erhalte ich folgende Fehlermeldung:

Code:
??? Error using ==> fminunc at 301
User supplied objective function must return a scalar value.


Kann mir jemand bitte sagen, was ich falsch mache?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.10.2010, 11:37     Titel:
  Antworten mit Zitat      
Hallo,

ganz einfach: fminunc ist für diese Art von Problemstellung nicht geeignet. Bei fminunc müsstest du, wie schon von Thomas erwähnt, die Abweichungsnorm zunächst selbst errechnen.

Gegenfrage: warum willst du fminunc verwenden, wenn es lsqcurvefit geklappt hat?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2010, 11:47     Titel:
  Antworten mit Zitat      
Zitat:
ganz einfach: fminunc ist für diese Art von Problemstellung nicht geeignet. Bei fminunc müsstest du, wie schon von Thomas erwähnt, die Abweichungsnorm zunächst selbst errechnen.


ok ja stimmt - hatte ich nicht so wahrgenommen -sry.
jetzt stellt sich die frage: wie mache ich das? bzw ist das der code den Thomas84 gepostet hat?
dachte das wären zwei unterschiedliche sachen einmal lsqcurvefit oder wie man das mit fminunc berechnet.
Ich habe echt keine Ahnung wie ich die Abweichung berechne und dann fminunc übergebe.


Zitat:
Gegenfrage: warum willst du fminunc verwenden, wenn es lsqcurvefit geklappt hat?

weil ich nach US-NORM das bfgs verfahren nehmen müsste. und bei fminunc kann ich das bfgs verfahren auswählen.
über sinn und unsinn möchte ich eigentlich nicht diskutieren. das habe ich schon durch Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2010, 19:28     Titel:
  Antworten mit Zitat      
bekomm die krise!

erhalte jetzt auch folgende Meldung:

Code:
??? Input argument "xdata" is undefined.

Error in ==> myfun at 2
F = x(1) + x(2)*xdata + x(3)*xdata.*xdata;

Error in ==> fminunc at 227
        f = feval(funfcn{3},x,varargin{:});

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINUNC cannot
    continue.


wieso denn das? bei LSQCURVEFIT habe ich die übergabe genau so gemacht und da gab es keine probleme mit "xdata"?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.10.2010, 21:50     Titel:
  Antworten mit Zitat      
Hallo,

fminunc und lsqcurvefit sind für vollkommen unterschiedliche Dinge geeignet und haben daher auch verschiedene Interfaces, d.h. auch verschiedene Aufrufformen. Das ist auch so dokumentiert.

Um das mit fminunc zum Laufen zu bekommen:
Code:
P = fminunc(@(x)myfun(x, xdata, ydata),x0)

mit

Code:
function F = myfun(x,xdata, ydata)
F = norm(x(1) + x(2)*xdata + x(3)*xdata.*xdata - ydata);
% F = max(abs((x(1) + x(2)*xdata + x(3)*xdata.*xdata - ydata)));


Dabei habe ich zwangsweise einen genaueren Blick auf die Funktion geworfen, die du fitten willst.
1. Das lässt sich mit polyfit leichter und exakter erreichen:
Code:
polyfit(xdata, ydata, 2)

2. Der einzige Grund, warum ich nicht polyfit verwenden würde, ist, dass eine andere Fehlernorm verwendet werden soll, siehe Kommentar von myfun als Alternative. Die Verwendung der korrekten Fehlernorm ist wesentlich entscheidender als 3. (und sollte in der Norm vorgegeben sein, sonst kann man sie getrost vergessen)!
3. Eine alleinstehende Angabe von BFGS ist blanker Unsinn - zumindest wenn das in demselben Sinne verwendet wird wie bei MATLAB. Die Verwendung von BFGS als Update für die Hesse-Matrix ist lediglich eine Einstellung in einem Algorithmus, die auch bei anderen Algorithmen vorgenommen werden kann. Das ist, als ob du ein Auto kaufst und sagst, das Auto soll elektrische Fensterheber haben, der Rest ist dir egal.

Ich würde dringend ein genaueres Studium dieser Norm vorschlagen, denn entweder ist die Norm absoluter Unsinn oder sie wurde hier nur unzureichend wiedergegeben / angewendet.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 11.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2010, 10:48     Titel:
  Antworten mit Zitat      
cool, funktioniert jetzt vielen Dank!

Zitat:
Dabei habe ich zwangsweise einen genaueren Blick auf die Funktion geworfen, die du fitten willst.


Ich habe erstmal ein einfaches Polynom gewählt, um das ganze überhaupt zum Laufen zu bringen. Es wird nicht bei dem einfachen Polynom bleiben.

Zitat:
Ich würde dringend ein genaueres Studium dieser Norm vorschlagen, denn entweder ist die Norm absoluter Unsinn oder sie wurde hier nur unzureichend wiedergegeben / angewendet.

Ich habe sie logischerweise nur unzureichend hier erläutert, weil ich kaum glaube, dass ihr 100 Seiten Norm lesen wollt Smile
Natürlich kenne ich sie in und auswendig und wollte nur das wesentliche hier kurz und knapp wiedergeben ansonsten würde der Rahmen gesprengt werden und du hättest nicht einmal angefangen zu lesen Smile

Also nochmal vielen lieben Dank dir für die Hilfestellung. Hat mir sehr sehr geholfen!
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.