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

Regressionsanalyse - Koeffizienten einer gegebenen Funktion

 

stesa0611
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2018, 16:06     Titel: Regressionsanalyse - Koeffizienten einer gegebenen Funktion
  Antworten mit Zitat      
Hallo liebes Forum,
mir stellt sich folgendes Problem:

Ich habe einen Datensatz der aus x und y Werten besteht. Es wurde schon eine Funktion ausgearbeitet, die diesen Datensatz beschreiben soll. Allerdings sind die Koeffizienten dieser Funktion noch unbekannt und sollen nun so bestimmt werden, dass die Funktion sich möglichst gut an den Datensatz anschmiegt. Wie bekomme ich das am besten hin?
Die Funktion lautet:

VB_m=V_1*[(1-e^(-V_2*L) )+(e^(V_3*L)-1)]

Wobei V_1, V_2 und V_3 die Unbekannten sind.
Vielen Dank im Voraus!
Liebe Grüße,

Stephanie Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2018, 16:09     Titel:
  Antworten mit Zitat      
Hallo,

je nach verfügbaren Toolboxen würde ich lsqcurvefit (Statistics and Machine Learning Toolbox), fitnlm (Optimization Toolbox) oder fminsearch (direkt in MATLAB) verwenden.
Die beiden erstgenannten sind in der Handhabung einfacher und liefern häufig bessere Ergebnisse.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2018, 16:54     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank für die schnelle Antwort! Die lsqcurvefitting Funktion klingt schon sehr gut! Ich bekomme diesen Fehler ausgespuckt:

Error using snls (line 47)
Objective function is returning undefined values at initial point. lsqcurvefit cannot continue.

Wie bestimme ich am besten meine Anfangswerte x0? Habe schon ein paar Werte willkürlich gewählt und probiert, bekomme aber immer wieder diesen Fehler.
Grüße,

Stephanie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2018, 16:59     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte deinen Code. Das erleichtert die Unterstützung erheblich.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2018, 17:06     Titel:
  Antworten mit Zitat      
Der Code lautet:

Code:
temp = importdata('T:\Satz.txt');

Teile = temp(:,1);              %xdata
VB = temp(:,2);                 %ydata


figure('Name','Regressionsanalyse Verschleiß');
plot(Teile,VB,'ko');
grid on;
title('Verschleißmarkenbreite');
xlabel('Teile');
ylabel('VB');


modelfun = @(b,x) b(1)*((exp(-b(2)*x(:,1)))+(exp(b(3)*x(:,1))));
x0 = [3,0.1,4];

x = lsqcurvefit(modelfun,x0,Teile,VB);


und der Datensatz :

xdata ydata
0 0
150 49
200 58
300 59
400 68
500 67
600 82
650 113
700 125
725 371

Danke!

Grüße,

Stephanie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2018, 17:16     Titel:
  Antworten mit Zitat      
Hallo,

der dritte Startwert ist zu groß, weil das bei deinen Daten schon inf liefert.

So läuft es durch:
Code:
modelfun = @(b,x) b(1)*((exp(-b(2)*x(:,1)))+(exp(b(3)*x(:,1))));
x0 = [3,0.1,0.01];

options = optimoptions('lsqcurvefit');
options.MaxIterations = 10000;
options.MaxFunctionEvaluations = 30000;
x = lsqcurvefit(modelfun,x0,Teile,VB, [], [], options);

hold on
plot(Teile, modelfun(x, Teile))


Der Fit ist nicht berauschend. Was helfen dürfte ist, wenn du für die beiden Exp-Funktionen unterschiedliche Vorfaktoren zulässt.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2018, 14:28     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank für deine Hilfe! Leider musste ich beim Testen der Funktion feststellen, dass die berechneten Koeffizienten teilweise imaginär werden. Dies dürte eigentlich nicht passieren. Wenn die Startwerte (beta0) anders angebeben werden verändern sich auch die berechneten Koeffizienten. Gibt es eine Herangehensweise, wie ich diese Startwerte am besten bestimme?
Viele Grüße,

Stephanie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.02.2018, 14:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Leider musste ich beim Testen der Funktion feststellen, dass die berechneten Koeffizienten teilweise imaginär werden. Dies dürte eigentlich nicht passieren.

Und wann passiert das? Mit den vorhandenen Daten ja nicht.

Zitat:
Gibt es eine Herangehensweise, wie ich diese Startwerte am besten bestimme?

Das ist oft Gefühlssache oder Trial and Error. Wenn man keine Anhaltspunkte hat und das automatisieren möchte, muss man im Zweifelsfall globale Optimierung machen.

Grüße,
Harald[/quote]
Private Nachricht senden Benutzer-Profile anzeigen
 
stesa0611
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2018, 14:41     Titel:
  Antworten mit Zitat      
Bei den folgenden Startwerten gibt er mir imaginäre Werte zurück:

Code:
modelfun = @(b,x) b(1)*log(b(2)*x(:,1)+b(3))+b(4)*exp(b(5)*x(:,1)+b(6));
x0 = [-1, -1, -1, -1, -1, -1];

options = optimoptions('lsqcurvefit');
options.MaxIterations = 100000;
options.MaxFunctionEvaluations = 300000;
x = lsqcurvefit(modelfun,x0,Teile,VB, [], [], options);
hold on
plot(Teile, modelfun(x, Teile))


mit den Daten
Teile VB
0 0
50 35
100 54
150 72
200 138
300 174
400 177
500 181
600 184
700 187
750 190

Vielen Dank und viele Grüße,

Stephanie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.02.2018, 14:47     Titel:
  Antworten mit Zitat      
Hallo,

das liegt daran, dass deine Modellfunktion für die Anfangswerte komplexwertige Rückgaben liefert. Es liegt an dir, die Anfangswerte so zu wählen, dass das nicht passiert. Hier: das Argument von log darf nicht negativ werden.

Code:
modelfun(x0, Teile)
ans =
     -0.36788 -     3.1416i
      -3.9318 -     3.1416i
      -4.6151 -     3.1416i
      -5.0173 -     3.1416i
      -5.3033 -     3.1416i
      -5.7071 -     3.1416i
       -5.994 -     3.1416i
      -6.2166 -     3.1416i
      -6.3986 -     3.1416i
      -6.5525 -     3.1416i
      -6.6214 -     3.1416i


Übrigens ist das Modell insofern ungünstig, als b(4) und b(6) zu einem Parameter zusammengefasst werden können
b(4) * exp(b(5)*x + b(6)) = b(4) * exp(b(6)) * exp(b(5) * x)
also neuer Parameter b(4) * exp(b(6))

Grüße,
Harald
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 - 2024 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.