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
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 28.06.2017, 20:37     Titel:
  Antworten mit Zitat      
Ja klar. Die Startparameter für x0 sind ja auch andere. Shocked

x0 = [1,1,1,1,1,1]

Jetzt scheint es zu klappen. Ich kann wohl allerdings nur meine berechneten Werte leicht verändern. Wenn ich die Werte etwas anders nehme läuft der Fit gleich wieder völlig daneben.

Hast du eine Idee wie ich es umgehen kann die Zwischengleichungen zu lösen um die Änderung meiner Startparameter nicht selber lösen zu müssen.

Das Ergebnis ist allerdings nicht so super. Confused

Modifizierter Fit.pdf
 Beschreibung:

Download
 Dateiname:  Modifizierter Fit.pdf
 Dateigröße:  35.17 KB
 Heruntergeladen:  406 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: 28.06.2017, 21:04     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Auch dieser Eintrag gibt mir zu denken?

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

Sollte es dir auch: bei deinem "weiträumigeren Wertepaar" ist bei den letzten beiden Elementen die untere Schranke größer als die obere. Das geht schlecht.

Das letzte Problem lag dann vor allem an der Anzahl der Startwerte. Wenn du einen Startvektor mit 4 Elementen vorgibst und x(5) extrahierst, geht auch das schlecht.

[quote]Hast du eine Idee wie ich es umgehen kann die Zwischengleichungen zu lösen um die Änderung meiner Startparameter nicht selber lösen zu müssen. [/quote
Das verstehe ich nicht. Grundsätzlich kann aber alles, was du mit Papier und Bleistift machen kannst, auch die Symbolic Math Toolbox für dich erledigen.

Ich darf dich auch noch an die 'TypicalX'-Option erinnern, siehe erster Beitrag.

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, 21:18     Titel:
  Antworten mit Zitat      
An welcher stelle sollte das mit den Grenzen nicht stimmen. lb = lower border und ub = upper border. Sehe ich gerade nicht.
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, 22:18     Titel:
  Antworten mit Zitat      
Hallo,

1. Komponente: lb = 3000 < 10000 = ub --> passt
2. Komponente: lb = 1< 100 = ub --> passt
3. Komponente: lb = 1e-9 > 9e-10 = ub --> geht nicht.
4. Komponente: lb = 1e-7 > 9e-8= ub --> geht nicht.

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: 29.06.2017, 07:04     Titel:
  Antworten mit Zitat      
Ich habe das Intervall nochmal angepasst. Hat da einen Denkfehler. ^^

Leider funktioniert das mit dem neuen Intervall leider auch nicht. Ich würde gerne deinen Tipp umsetzen mit dem TypicalX, allerdings verstehe ich die Option nicht :/

Was mich auch sehr wurmt ist folgendes. Ich habe die Formel mal etwas dünner gestalltet. Es handelt sich ja eh um einen komplexen Ausdruck.

Code:
R_m = 7120
L_m = 26.6
C_m = 5.95E-10
C_0 = 3.76E-08
x0 = [1,1,1,1]
Fun = @(x,xdata) abs(i*2*pi*x(1)*C_0*xdata+1./(x(2)*R_m+i*(2*pi*x(3)*L_m*xdata-1./(2*pi*x(4)*C_m*xdata))))
x = lsqcurvefit(Fun,x0,t,y)


Die Idee ist, dass ich die Startwerte vorgebe, die ja nicht perfekt sein können. Sieht man ja am Fit. Und von dort den Faktor x(i) als Abweichung ausgegeben haben möchte. So muss er nicht mit kleinen Werten rechnen. Dann bekomme ich aber die Meldung:

Zitat:
Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point
is less than the default value of the optimality tolerance.


Es kann ja wohl kaum sein, dass ich die Perfekten Werte bestimme. Meine Ausgabe der Faktoren ist nämlich

Code:
x =     1     1     1     1


Kann ich vielleicht auch den Tolerancewert von default ändern zu einem anderen Wert?

Fitprozedur.JPG
 Beschreibung:

Download
 Dateiname:  Fitprozedur.JPG
 Dateigröße:  221.38 KB
 Heruntergeladen:  393 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: 29.06.2017, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

das Problem dürften die Schwingungen sein. Dadurch entstehen viele lokale Minima für verschiedene Parametersätze. Abhilfe kann da wohl nur globale Optimierung schaffen, siehe z.B. hier
https://www.mathworks.com/help/gads.....urvefit-or-lsqnonlin.html

Die Optionen für lsqcurvefit und ihre Beschreibung findest du hier
https://www.mathworks.com/help/opti.....fit.html#inputarg_options
TypicalX gibt an, wie stark einzelne Größen bei der Gradientenbildung variiert werden sollen. In deinem ursprünglichen Beispiel sowas wie [1000, 1, 1e-10, 1e-8].

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: 29.06.2017, 21:37     Titel:
  Antworten mit Zitat      
Den Tip mit dem globalen Minimum oder Maximum finde ich gut. Allerdings kann ich gerade die Hilfe nicht ganz nachvollziehen. In dem Beispiel wird ja mit Startparametern gearbeitet. Bei mir ja auch. Komischerweise ist aber die Konvergenz des Programms auf die Startparameter im Beispiel bezogen. Würde mir ja jetzt nicht viel bringen, da die Startparameter ja optimiert werden sollen.

Bei dem Tip mit typicalX verstehe ich die Syntax leider nicht. Es ist ja nicht so, dass ich micht nicht auf die Suche mach.

Zitat:
Typical x values. The number of elements in TypicalX is equal to the number of elements in x0, the starting point. The default value is ones(numberofvariables,1). The solver uses TypicalX for scaling finite differences for gradient estimation.


Wie ich das jetzt umsetze ist mir doch recht schleierhaft.

Was bedeutet das Inf oder -Inf?
Code:
lb = [-Inf,-Inf,-20,-pi];
ub = [Inf,Inf,20,pi];


Gruß Henrik
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: 29.06.2017, 21:55     Titel:
  Antworten mit Zitat      
Das Programm, was ich adapitert habe sieht wie folgt aus?

Code:
clear all;
close all;

%---Define Fitfunction---%

R_m = 7120
L_m = 26.60811
C_m = 5.94902E-10
C_0 = 3.762756E-8

fitfcn = @(p,xdata)abs(i*2*pi*p(4)*C_0*xdata+1./(p(1)*R_m+i*(2*pi*p(2)*L_m*xdata-1./(2*pi*p(3)*C_m*xdata))));
rng default % for reproducibility
N = 500; % number of data points
preal = [1,1,1,1]; % real coefficients

xdata = 5*rand(N,2); % data points
ydata = fitfcn(preal,xdata) + 0.1*randn(N,1); % response data with noise

lb = [0.5,0.5,0.5,0.5]
ub = [1.5,1.5,1.5,1.5]

p0 = ones(1,4); % Arbitrary initial point

[xfitted,errorfitted] = lsqcurvefit(fitfcn,p0,xdata,ydata,lb,ub)

problem = createOptimProblem('lsqcurvefit','x0',p0,'objective',fitfcn,...
    'lb',lb,'ub',ub,'xdata',xdata,'ydata',ydata);

ms = MultiStart('PlotFcns',@gsplotbestf);
[xmulti,errormulti] = run(ms,problem,100)


Ich habe aber das gleiche Problem. Der Wert p(3) bzw. p(4) wird nicht angepasst, da sie wohl einfach zu klein sind. Typical x scheint wohl doch der einzige letzte Weg zu sein. Es sei denn du findest einen Fehler in dem oberen Programm. Das wäre ja auch schon klasse. Wenn es dann klappt.
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: 29.06.2017, 22:06     Titel:
  Antworten mit Zitat      
Kann ich die Steptolerance vielleicht ändern also den Wert der auf Default eingestellt ist?
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: 30.06.2017, 07:03     Titel:
  Antworten mit Zitat      
Ich habe mal versucht den Toleranzwert zu verändern, weil die Werte ja recht klein sind.

Code:
t=Data(:,1)    
y=Data(:,2)

R_m = 7120
L_m = 26.60811
C_m = 5.94902E-10
C_0 = 3.762756E-8

lb = [6500,1,5E-11,5E-009]
ub = [7800,100,5E-09,5E-007]

x0 = [1,7120,26.6,1]

Fun = @(x,xdata) abs(i*2*pi*x(1)*C_0*xdata+1./(x(2)+i*(2*pi*x(3)*xdata-1./(2*pi*x(4)*C_m*xdata))))

options = optimset(options,'TolX',1e-10,'TolFun',1e-10);
x = lsqcurvefit(Fun,x0,t,y,options)

%---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.]')
 


Leider sagt er mir er kennt die Funktion options nicht. Aber die Habe ich doch definiert. Und in optimset ist die doch auch drin. Siehe
Beispiel.
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: 30.06.2017, 07:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Bei dem Tip mit typicalX verstehe ich die Syntax leider nicht.

Du musst für jede Komponente angeben, wie groß sie ist bzw. wie sehr sie typischerweise variiert werden soll, Beispiel siehe vorheriger Beitrag.

Zitat:
Was bedeutet das Inf oder -Inf?

Inf = Infinity = unendlich. Diese Komponenten sind also nicht nach unten bzw. oben beschränkt ( < -inf geht ja nicht ).

Dein Befehl verwendet options rechts, bevor es zugewiesen wird.
Code:
options = optimset(options,'TolX',1e-10,'TolFun',1e-10);


Richtig wäre
Code:
options = optimset('TolX',1e-10,'TolFun',1e-10);


Bitte auch darauf achten, dass optimoptions (Link) und optimset (hier verwendet) unterschiedliche Syntax haben. Wenn du bei optimoptions die Optionen anpassen willst, musst du sie auch mal am Anfang erstellt haben (erster Befehl im Link).

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: 30.06.2017, 08:24     Titel:
  Antworten mit Zitat      
Ich bin ja echt nicht so der Profi. Wink

Harald hat Folgendes geschrieben:

Richtig wäre
Code:
options = optimset('TolX',1e-10,'TolFun',1e-10);


Bitte auch darauf achten, dass optimoptions (Link) und optimset (hier verwendet) unterschiedliche Syntax haben. Wenn du bei optimoptions die Optionen anpassen willst, musst du sie auch mal am Anfang erstellt haben (erster Befehl im Link).



Wenn ich nur die oben zitierte Zeile eingebe, klappt es nicht. Wie definiere ich das vorher? Auch die Syntax mit typicalX ist mir schleirhaft.

Ich würde einfach sowas schreiben wie.

Code:
options = optimset('TolX',1e-10,'TolFun',1e-10,'TypicalX, [1000, 1, 1e-10, 1e-8]);


und das einbinden, oder?
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: 30.06.2017, 08:50     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wenn ich nur die oben zitierte Zeile eingebe, klappt es nicht.

Heißt was? Gibt es eine Fehlermeldung? Welche?

Zitat:
Auch die Syntax mit typicalX ist mir schleirhaft.

Was ist dir daran schleierhaft? Mehr Erklärungen kann ich wirklich nicht dazu geben.

Zitat:
Ich würde einfach sowas schreiben wie.

Code: options = optimset('TolX',1e-10,'TolFun',1e-10,'TypicalX, [1000, 1, 1e-10, 1e-8]);
Funktion ohne Link?


und das einbinden, oder?

Genau. Nur noch das Hochkomma schließen nach TypicalX.

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: 30.06.2017, 09:32     Titel:
  Antworten mit Zitat      
Harald du bist der Beste. Super, dass du mir so geholfen hast. Jetzt klappt es. Nur das blöde Apostroph hat die ganze Zeit gefehlt.


Code:

clear all;
close all;

Folder = 'D:\Henrik\Studium\Master\Masterarbeit\Unterlagen\IDS\Impedamzwandler_elektrisch\2017_05_22\Auswertung\Aktor 1\';
FileName = [Folder 'Daten_Aktor1.xls'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Data = xlsread(FileName);
fclose(fid);

t=Data(:,1)     %x-values
y=Data(:,2)     %y-values

%Calculated startparameters
% R_m = 7120
% L_m = 26.60811
% C_m = 5.94902E-10
% C_0 = 3.762756E-8

%Borders
lb = [5E-009,6500,1,5E-11]
ub = [5E-007,7800,100,5E-09]

x0 = [3.762756E-8,7120,26.6,5.94902E-10]

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

options = optimset('TolX',1e-10,'TolFun',1e-10, 'TypicalX', [1000, 1, 1e-10, 1e-8]);
x = lsqcurvefit(Fun,x0,t,y,lb,ub,options)

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

 


Der Fit sitzt jetzt richtig gut auf den Messdaten. Ich denke dir vielmals. Oh man. Ich könnte dich drücken. Jetzt bin ich megamotiviert ^^

Besten Gruß Henrik

Bester Fit.pdf
 Beschreibung:

Download
 Dateiname:  Bester Fit.pdf
 Dateigröße:  9.98 KB
 Heruntergeladen:  404 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: 30.06.2017, 09:38     Titel:
  Antworten mit Zitat      
Hallo,

schön, dass nun alles klappt.

Als Tip für die weitere Arbeit:
im Editor ist ein Code-Analyse Tool, das solche Syntaxfehler anzeigt (rotes / oranges / grünes Quadrat in der rechten oberen Ecke). Wenn Probleme erkannt werden, sind rechts auch rote oder orange Balken, auf die man klicken kann.

Zudem sollte die Farbgebung im Editor helfen. Zeichenketten sind immer in purpur. Wenn eine Zeichenkette nicht abgeschlossen ist, erscheint sie dunkelrot.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.