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

Fitting Funktion mit 3 unabhängigen Variablen

 

tveltzke
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 09.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 12:39     Titel: Fitting Funktion mit 3 unabhängigen Variablen
  Antworten mit Zitat      
Hallo Zusammen,

ich habe folgendes Problem und hoffe, es kann mir jemand helfen. Ich habe Messergebnisse
(Spalte 4 in Matrix A) die von drei unabhängigen Parametern (Spalten 1,2,3) abhängig sind.
Code:

A=[ 3   9   523     50.83
    3   9   533     47.1
    3   9   543     43.36
    3   9   553     39.59
    3   9   563     35.79
    3   9   573     31.92
    0.5   1   523     0.06
    1   1   523     0.52
    2   1   523     2.04
    3   1   523     3.63
    4   1   523     5.01
    5   1   523     6.21
    0.5   3   523     2.19
    1   3   523     6.91
    2   3   523     15.34
    3   3   523     21.72
    4   3   523     27.12
    5   3   523     31.59
    0.5   5   543     4.77
    1   5   543     11.89
    2   5   543     24.43
    3   5   543     33.94
    4   5   543     41.88
    5   5   543     48.26
    0.5   7   543     6.73
    1   7   543     15.52];
 

Mein Ziel ist es nun, daraus eine stetige Funktion der Form
Code:

y(x1,x2,x3) = a*x1.^d + b*x2.^e + c*x3.^f
 

zu erhalten, also die Konstanten a,b,c,d,e und f so zu bestimmen, dass der Abstand zu
den Messwerten minimal ist. Quasi ein Fit mit DREI unabhängigen Variablen.
Ich habe schon diverse Versuche mit "fmincon" und "fminsearch" unternommen,
aber das funktioniert alles nicht.

Bin dankbar für jede Hilfe!!

Grüsse, Thomas
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: 09.04.2013, 13:49     Titel:
  Antworten mit Zitat      
Hallo,

bitte immer den Code, der nicht funktioniert hat, posten, und die Fehlermeldung, die man dabei erhalten hat.

Die Frage ist übrigens erst kürzlich aufgetaucht:
http://www.gomatlab.de/nichtlineare.....von-r2-nach-r-t28126.html

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 09.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 14:16     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort und den Hinweis! Dies ist der Code, den ich verwendet hab:
Code:

function res = FitFun(a,b,c,d,e,f);
res=a*X^d+b*Y^e+c*Z^f;
fminsearch(FitFun,A)
end
 

Das quittiert MATLAB aber lediglich mit

"Function definitions are not permitted in this context."


Wenn ich nun von dem Code aus dem anderen Beitrag
Code:

function Z=myfun2d(c,in)
n=length(in);
Z=c(1)*sin(c(2)*in(1:n/2,1:n/2).^2+c(3)*in(1:n/2,n/2+1:n).^2);
end
 

ausgehe, bekomme ich die gleiche Fehlermeldung. Ausserdem weis ich auch nicht, was in diesem Code nun meiner Matrix mit den Messwerten entspricht.

Viele Grüße, Thomas
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: 09.04.2013, 15:12     Titel:
  Antworten mit Zitat      
Hallo,

auf Anhieb sehe ich mehrere Probleme mit deinem Code:
1. Funktionen müssen in einer eigenen Datei stehen (das besagt auch die Fehlermeldung)
2. fminsearch macht eine allgemeine Minimumsuche. Woher soll die Funktion wissen, was hier zu minimieren ist? Es wäre besser, lsqcurvefit zu verwenden, siehe der andere Thread.
3. fminsearch, lsqcurvefit und ähnliche haben ein festes Interface, an das man sich halten muss. Bei lsqcurvefit
Code:
function y_vorhersage = modell(parameter, x_werte)

Die einzelnen Parameter müssen dann aus der einen Variablen extrahiert werden. Schau dir dazu auch mal das Beispiel an aus
Code:

4. Das Modell muss für alle Beobachtungen auf einmal ausgewertet werden können, d.h. du musst elementweise Operationen statt Matrix-Operationen verwenden, hier insbesondere .^ statt ^

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 09.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 16:43     Titel:
  Antworten mit Zitat      
Hallo Harald,

also ich hab mich nun an dem Beispiel orientiert; ich denke die Funktion müsste so stimmen
Code:

function F = myfun(x,xwerte)
F = x(1)*xwerte(:,1).^x(2) + x(3)*xwerte(:,2).^x(4) + x(5)*xwerte(:,3).^x(6);
end
 

x(1) bis x(6) sollten dann von Matlab bestmöglich angepasst werden.
Die Matrix "xwerte" beinhaltet die unabhängigen Variablen:
Code:

A=[ 3   9   523     50.83
    3   9   533     47.1
    3   9   543     43.36
    3   9   553     39.59
    3   9   563     35.79  
...
    4   5   543     41.88
    5   5   543     48.26
    0.5   7   543     6.73
    1   7   543     15.52];

xwerte=A(:,1:3);
ydata=A(:,4);

x = lsqcurvefit(@(x,xwerte) myfun(x,xwerte),[5;1],xwerte,ydata)
 

Im Vektor "ydata" (also die vierte Spalte von Matrix A) stehen die gemessenen Daten.
Meiner Meinung nach macht das alles Sinn, aber Ich erhalte diese Fehlermeldung:

??? Attempted to access x(3); index out of bounds because numel(x)=2.

Error in ==> myfun at 2
F = x(1)*xwerte(:,1).^x(2) + x(3)*xwerte(:,2).^x(4) + x(5)*xwerte(:,3).^x(6);

Error in ==> @(x,xwerte)myfun(x,xwerte)


Error in ==> lsqcurvefit at 209
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in ==> test at 134
x = lsqcurvefit(@(x,xwerte) myfun(x,xwerte),[5;1],xwerte,ydata)

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

Wo ich nur Bahnhof verstehe Sad

Vielleicht müssen an dieser Stelle ...[5;1]... in "lsqcurvefit" 4 Zahlen rein...ich weis es nicht.

Viele Grüße, Thomas
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: 09.04.2013, 17:27     Titel:
  Antworten mit Zitat      
Hallo,

das sieht schon mal gut aus.
Statt [5;1] musst du einen Startvektor für deine Parameter angeben. Du hast 6 Parameter, folglich musst du auch einen Startvektor mit 6 Elementen angeben.
Vorwarnung: wenn die Resultate unsinnig erscheinen, solltest du es mit besseren Startwerten versuchen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 09.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 17:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

ha, läuft.
Dann werde ich jetzt mal an den Startwerten drehen.

Besteht auch noch die Möglichkeit, sich ein "R^2" angeben zu lassen?
Dieser wert muss ja im Idealfall =1 sein. Ggf. müsste ich die Startwerte ja dann so lange variieren, bis "R^2" ausreichend groß ist (vielleicht so 0,9).

Schonmal vielen Dank!

Thomas
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: 09.04.2013, 22:28     Titel:
  Antworten mit Zitat      
Hallo,

lsqcurvefit sucht ein lokales Minimum. Wenn du einen R^2 von 0.7 oder so erreichst, würde ich erwarten, dass lsqcurvefit typischerweise wirklich die bestmöglichen Werte (globales Minimum) findet.
R^2 kannst du selbst über die Formel errechnen. Alternativ kannst du statt lsqcurvefit die Funktion nlinfit verwenden. Diese Funktion hat eine sehr ähnliche Syntax und liefert mehr Zusatzinfos zurück.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 09.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 09:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe.

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