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.
%---Folder which includes the measured data---%
Folder = 'xxx';
%---Scriptfor 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 linesfor x-values
c = 4 %Amount of coefficients
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'; %Transposefor 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
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);
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.
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?
%---Folder which includes the measured data---%
Folder = 'xxx';
%---Scriptfor 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)
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.
%---Folder which includes the measured data---%
Folder = 'D:\Henrik\Studium\Master\Masterarbeit\Unterlagen\IDS\Impedamzwandler_elektrisch\2017_05_22\Auswertung\Aktor 1\';
%---Scriptfor 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)
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.
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.
%---Folder which includes the measured data---%
Folder = 'xxx';
%---Scriptfor 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)
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))
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.
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.
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:
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))
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
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.