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

Fitfunktion liefert falsche Parameter

 

Henrik123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 27.06.2017, 13:30     Titel: Fitfunktion liefert falsche Parameter
  Antworten mit Zitat      
Hallo. Ich habe noch eine Frage. Um Parameter zu bestimmen möchte ich meinen Datensatz mit einer Formel fitten und die Parameter auslesen. Das ist meine Programmstruktur.

Code:


clear all;
close all;
%--------------------Define variables here!!!-----------------------------%

%---Folder which includes the measured data---%
Folder = 'xxx';                

%---Script for reading and writing the data---%
FileName = [Folder 'Daten_Aktor1.xls'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Result = xlsread(FileName); %Matrix of the imported data
fclose(fid);

%---Startparameters---%
w = length(Result(:,1))            %Amount of lines for x-values
c = 4                              %Amount of coefficients

x0=zeros(c,1);                     %Vector for coefficients
x0(1,1) = 1;                       %R_m      =    %bestx(1)
x0(2,1) = 1;                       %L_m      =    %bestx(2)
x0(3,1) = 0.001;                   %C_m      =    %bestx(3)
x0(4,1) = 0.001;                   %C_0      =    %bestx(4)

Output = zeros(c,1)                %Matrix to safe fitted parameters + header

%---Create the fitting curves---%
for j = 1:w
        ResultX(j,1)=Result(j,1);
        ResultY(j,1)=Result(j,2);    
end

    xdata = 0:0.5:5000;     %Steps for the fitting curve, resolution
    xdata = xdata';         %Transpose for matching the matrixdimension  
    tdata = ResultX         %Declaration of measured x-values
    ydata = ResultY
    fun = @(x)sseval(x,tdata,ydata);    %Point to the specific plotfunction

%---Calculating fitting parameters---%
    bestx = fminsearch(fun,x0)      %Searching for the least uncertainty of c
    yfit = sqrt((1-bestx(4)*bestx(2)*4*pi*pi*xdata.^2+bestx(4)/bestx(3)).^2+(xdata*2*pi*bestx(4)*bestx(1)).^2)./sqrt(((bestx(1)).^2+(xdata*2*pi*bestx(2)-(1/(bestx(3)*2*pi*xdata))).^2));    

%---Writting fitted Parameters into matrix---%
for i= 1:c
Output(i,1) =  bestx(i)
end
   
%---Plot data---%
hold all
plot(Result(:,1), Result(:,2),'ok', 'LineWidth',2)
plot(xdata,yfit,'r','LineWidth',2);
xlabel('Frequenz [Hz]')
ylabel('Amplitude [a.u.]')
 


Allerdings sind die generierten Fitparameter leider nicht richtig. Die Funktion ssevel hat folgende Form.
function sse = sseval(x,tdata,ydata)
R_m = x(1);
L_m = x(2);
C_m = x(3);
C_0 = x(4);

sse = sum( (ydata - sqrt((1-C_0*L_m*4*pi*pi*tdata.^2+C_0./C_m).^2+(tdata*2*pi*C_0*R_m).^2)./sqrt(((R_m).^2+(tdata*2*pi*L_m-(1./(C_m*2*pi*tdata))).^2)) ).^2);
 


Hier werden die Fehlerquadrate aufsimmiert. Eigentlich sollten Werte rauskommen wie.

Code:
R_m = 7120;
L_m = 23;
C_m = 6.9e-10;
C_0 = 3.7122015192112e-08;


Habt Ihr eine Idee für mich? Besten Dank.

Henrik

Daten_Aktor1.xls
 Beschreibung:
Datensatz

Download
 Dateiname:  Daten_Aktor1.xls
 Dateigröße:  33 KB
 Heruntergeladen:  324 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.06.2017, 20:52     Titel:
  Antworten mit Zitat      
Hallo,

die erste Frage wäre: kann es sein, dass fminsearch in ein lokales Minimum gelaufen ist? Anders gefragt: bekommst du bessere Ergebnisse, wenn du Startwerte näher am Optimum wählst? Falls ja, dann waren die ersten Startwerte nicht gut genug.

Wenn du keine ausreichend guten Startwerte kennst, solltest du über globale Optimierung (Global Optimization Toolbox) in Erwägung ziehen.

Zudem scheint es so, dass manche Parameter extrem klein sind, andere dafür recht groß. So etwas kannst du z.B. bei lsqcurvefit als 'TypicalX' angeben.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 27.06.2017, 21:52     Titel:
  Antworten mit Zitat      
Es scheint wohl so zu sein, dass der Algorithmus in ein lokales Extrema wandert und das auch letztendlich zu dem Proglem führt. Ich versuche mich mal selbstverständlich mit den Tipps auseinanderzusetzen. ^^ Help help. Hast du vielleicht einen Ansatz für mich?

Besten Gruß Henrik.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.06.2017, 22:07     Titel:
  Antworten mit Zitat      
Hallo,

ich habe dir ja verschiedene Vorschläge gemacht.
Du müsstest schon konkretisieren, für was du nun gerne einen Ansatz hättest.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 07:52     Titel:
  Antworten mit Zitat      
Den Vorschlag mit der Funktion lsqcurvefit finde ich ganz interessant. Mal sehen was ich da zusammen schreiben kann. Rolling Eyes
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 10:27     Titel:
  Antworten mit Zitat      
So. Ich habe mal etwas zusammen gebastelt.

Code:

clear all;
close all;
%--------------------Define variables here!!!-----------------------------%

%---Folder which includes the measured data---%
Folder = 'xxx';                

%---Script for reading and writing the data---%
FileName = [Folder 'Daten_Aktor1.xls'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Data = xlsread(FileName); %Matrix of the imported data
fclose(fid);

%---Define Fitfunction---%

t=Data(:,1)     % Übetragen des Datensatzes
y=Data(:,2)

x(1) = R_m      % Zu bestimmende Parameter
x(2) = L_m
x(3) = C_m
x(4) = C_0

Fun = @(x,xdata) sqrt((1-x(4)*x(2)*4*pi*pi*xdata.^2+x(4)./x(3)).^2+(xdata*2*pi*x(4)*x(1)).^2)./sqrt(((x(1)).^2+(xdata*2*pi*x(2)-(1./(x(3)*2*pi*xdata))).^2))

x0 = [7120.0, 26.60, 5.9490E-010, 3.76276E-008] % Startwerte sind schon recht ok. Siehe Bild.

[x,resnorm,~,exitflag,output] = lsqcurvefit(Fun,x0,t,y)

%---Plot data---%
hold all

plot(t,Fun(x,t),'r', 'LineWidth',2)
plot(t, y,'ok', 'LineWidth',2)
xlabel('Frequenz [Hz]')
ylabel('Amplitude [a.u.]')


Die Fehlermeldung ist:

Zitat:
Undefined function or variable 'R_m'.

Error in Auswertung (line 24)
x(1) = R_m


Aber wie soll ich R_m denn definieren, wenn es die Werte sein sollen die ich haben möchte? Oder soll ich dafür die Startwerte angeben?

Gruß Henrik

Admittanzspektrum_mit_Startparameter.pdf
 Beschreibung:

Download
 Dateiname:  Admittanzspektrum_mit_Startparameter.pdf
 Dateigröße:  39.79 KB
 Heruntergeladen:  359 mal
Daten_Aktor1.xls
 Beschreibung:

Download
 Dateiname:  Daten_Aktor1.xls
 Dateigröße:  33 KB
 Heruntergeladen:  312 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 10:42     Titel:
  Antworten mit Zitat      
Die Iteration bricht da leider ab. Scheinbar ohne die Startparameter zu ändern. Wie kann ich überhaupt die angepassten Parameter auslesen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 10:53     Titel:
  Antworten mit Zitat      
Ok. Jetzt bin ich darauf gekommen, die Parameter vorher mit den Startwerten zu verbinden. Leider komme ich immer nocht nicht auf einen grünen Zweig.

Code:
clear all;
close all;
%--------------------Define variables here!!!-----------------------------%

%---Folder which includes the measured data---%
Folder = 'D:\Henrik\Studium\Master\Masterarbeit\Unterlagen\IDS\Impedamzwandler_elektrisch\2017_05_22\Auswertung\Aktor 1\';                

%---Script for reading and writing the data---%
FileName = [Folder 'Daten_Aktor1.xls'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Data = xlsread(FileName); %Matrix of the imported data
fclose(fid);

%---Define Fitfunction---%

t=Data(:,1)     % Übetragen des Datensatzes
y=Data(:,2)

R_m = 7120.0
L_m = 26.60
C_m = 5.9490E-010
C_0 = 3.76276E-008

x(1) = R_m      % Zu bestimmende Parameter
x(2) = L_m
x(3) = C_m
x(4) = C_0

Fun = @(x,xdata) sqrt((1-x(4)*x(2)*4*pi*pi*xdata.^2+x(4)./x(3)).^2+(xdata*2*pi*x(4)*x(1)).^2)./sqrt(((x(1)).^2+(xdata*2*pi*x(2)-(1./(x(3)*2*pi*xdata))).^2))

x0 = [7120.0, 26.60, 5.9490E-010, 3.76276E-008] % Startwerte sind schon recht ok. Siehe Bild.

lb = [5000,5,1E-010,1E-008]
ub = [8000,100,9E-010,9E-008]

[x,resnorm,~,exitflag,output] = lsqcurvefit(Fun,x0,t,y,lb,ub)

%---Plot data---%
hold all
plot(t,Fun(x,t),'r', 'LineWidth',2)
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 10:55     Titel:
  Antworten mit Zitat      
Über eine Interpretation meines Programms wäre ich sehr dankbar. Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.06.2017, 13:25     Titel:
  Antworten mit Zitat      
Hallo,

bitte etwas Geduld. Man sitzt nicht die ganze Zeit vor gomatlab.

Du brauchst x(1) bis x(4) gar nicht vor Fun zu definieren. lsqcurvefit füttert das Function Handle mit den variierten Parametern.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 13:48     Titel:
  Antworten mit Zitat      
Ich wollte keine Unruhe verbreiten. Habe nur meine Ergebnisse hochgeladen, sodass man sieht, dass ich etwas selber tue, um das Problem zu lösen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Habe nur meine Ergebnisse hochgeladen, sodass man sieht, dass ich etwas selber tue, um das Problem zu lösen.

Das ist eine sehr gute Idee. Wenn du nur einen kleinen Zusatz hast, kannst du als angemeldeter Nutzer auch den vorherigen Beitrag editieren.

Hat dir die Anregung von vorhin weitergeholfen?

Momentan hast du das Optimum als Startwert angegeben. Dann kommt lsqcurvefit natürlich auch nicht weg davon. Ich habe aber beispielsweise mal
Code:
x0 = (lb + ub) / 2

versucht und damit vernünftige Ergebnisse bekommen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 19:45     Titel:
  Antworten mit Zitat      
Ich habe deinen Tip mal angewendet. Leider muss ich feststellen, dass die Startparameter äußerst empfindlich den gesammten Fit beeinflussen. Mein Programm sieht jetzt so aus.

Code:


clear all;
close all;
%--------------------Define variables here!!!-----------------------------%

%---Folder which includes the measured data---%
Folder = 'xxx';                

%---Script for reading and writing the data---%
FileName = [Folder 'Daten_Aktor1.xls'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Data = xlsread(FileName); %Matrix of the imported data
fclose(fid);

%---Define Fitfunction---%

t=Data(:,1)     % Übetragen des Datensatzes
y=Data(:,2)

lb = [5000,5,0.99E-010,2E-008]
ub = [8000,80,9.99E-010,5E-008]
x0 = (lb + ub) / 2

Fun = @(x,xdata) sqrt((1-x(4)*x(2)*4*pi*pi*xdata.^2+x(4)./x(3)).^2+(xdata*2*pi*x(4)*x(1)).^2)./sqrt(((x(1)).^2+(xdata*2*pi*x(2)-(1./(x(3)*2*pi*xdata))).^2))

x = lsqcurvefit(Fun,x0,t,y,lb,ub)

%---Plot data---%
hold all

plot(t,Fun(x,t),'r', 'LineWidth',2)
plot(t, y,'k', 'LineWidth',2)
xlabel('Frequenz [Hz]')
ylabel('Amplitude [a.u.]')
 


Kann ich denn den Fit von dieser Abhängigkeit befreien? Mann muss die Startparameter nur geringfügig verändern und der Fit läuft total falsch.

Beispiel:

Weiträumiges Wertepaar.
lb = [3000,1,1E-09,1E-007]
ub = [10000,100,9.0E-010,9E-008]

Enges Wertepaar.
lb = [6000,10,0.9E-10,1E-08]
ub = [8000,60,9.9E-10,6E-08]

Wie kommen denn bei dir vernünftige Werte raus?
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 19:53     Titel:
  Antworten mit Zitat      
Auch dieser Eintrag gibt mir zu denken?

Code:
Exiting due to infeasibility:  2 lower bounds exceed the corresponding upper bounds.


Ich habe mal testweise einen anderen Datensatz verwendet und die Grenzen etwas weiter gewählt, da ich die guten Startwerte nicht jedes mal neu berechnen möchte. Dann geht der Algorithmus föllig in die Hose.

Einen alternativen Datensatz habe ich im Anhang hinterlegt.

Daten_Aktor2.xls
 Beschreibung:

Download
 Dateiname:  Daten_Aktor2.xls
 Dateigröße:  135 KB
 Heruntergeladen:  318 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 20:33     Titel:
  Antworten mit Zitat      
Ich glaube ich hätte eine Lösung für das Problem. Bin mir aber nicht sicher. Der Fehler scheint wohl daran zu liegen, zu kleine Werte zu hantieren. Könnte ich nicht einfach als Startparameter die berechneten Parameter nehmen und diese dann verbessern.

R_m = p1 * R1
L_m = p2 * L1
C_m = p3 * C1
C_0 = p4 * C2

R1, L1, C1 und C2 wären bekannt und er ändert nur einen Faktor. Dann könnte ich die tatsächlichen Werte bestimmen und würde mit kleineren Werten rechnen.

Hast du da einen geschickten Ansatz. Ich bekomme immer eine Fehlermeldung:

Index exceeds matrix dimensions.

Meine Idee ist.

Code:
R_m = 7120
L_m = 26.6
C_m = 5.95E-10
C_0 = 3.76E-08

x0 = [7120,26.6,5.95E-10,3.76E-08]

Fun = @(x,xdata) sqrt((1-x(1)*L_m*C_0*4*pi*pi*xdata.^2+x(2)*C_0./C_m).^2+(xdata*2*pi*C_0*R_m*x(3)).^2)./sqrt(((x(4)*R_m).^2+(xdata*2*pi*L_m*x(5)-(1./(x(6)*C_m*2*pi*xdata))).^2))

x = lsqcurvefit(Fun,x0,t,y)


Das klappt aber leider nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.