Es handelt sich um die erzwungene gedämpfte Schwingung. Ich versuche mich jetzt an einem Fallbeispiel. Der Code den ich verwende funktioniert wie folgt.
Code:
%---Scriptfor reading and writing the data---%
FileName = [Folder 'Grobauswertung.xlsx'];
fid = fopen(FileName, 'r');
if fid == -1 error('Cannot open file %s', FileName);
end
Result = xlsread(FileName); %Matrix of the import data
fclose(fid);
fun = @(x)sseval(x,tdata,ydata);
x0 = rand(2,1);
bestx = fminsearch(fun,x0)
A = bestx(1);
omega = bestx(2);
D = bestx(3);
yfit = A/(sqrt((1-(tdata/omega).^2).^2+4*D.^2*(tdata/omega).^2));
plot(tdata,ydata,'*');
hold on
plot(tdata,yfit,'r');
xlabel('tdata') ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') hold off
Die Funktion sseval ist wie folgt definiert.
+function sse = sseval(x,tdata,ydata)
A = x(1);
omega = x(2);
D = x(3);
sse = sum((ydata - A/(sqrt((1-(tdata/omega).^2).^2+4*D.^2*(tdata/omega).^2))));
Die Fehlermeldung sagt mir folgendes:
Code:
??? Attempted to access x(3); index out of bounds because numel(x)=2.
Das Problem scheint die Variable D zu sein. Dazu muss ich sagen, ich versuche hier das Beispiel https://de.mathworks.com/help/matla.....ing-via-optimization.html zu übertragen. Das stellt kein Problem dar. Ich würde gerne Eure Meinung dazu hören. Die fitting curve toolbox ist leider keine Option.
wenn du drei Werte fitten willst, musst du in x0 auch 3 Startwerte vorgeben.
Wenn ich die längliche Formel richtig interpretiere, summierst du die Abweichungen einfach auf. Keine gute Idee, da negative und positive Abweichungen sich so aufheben können. Die Abweichungen also entweder quadrieren oder, wenn du das nicht möchtest, den Betrag davon nehmen.
Grüße,
Harald
P.S.: Mit Optimization Toolbox (Titel) hat das wenig zu tun. Diese verwendest du ja eben gerade nicht.
%---Folder which includes the measured data---%
Folder = 'xxx';
%---Scriptfor reading and writing the data---%
FileName = [Folder 'Grobauswertung.xlsx'];
fid = fopen(FileName, 'r');
if fid == -1 error('Cannot open file %s', FileName);
end
Result = xlsread(FileName); %Matrix of the imported data
fclose(fid);
%---Create the fitting curves---%
%What to do, ifNaNis at the beginning of an array?
%n=(length(Result(1,:))-1)/2) %Amount of fitting curves
%nn=length(Result(:,1))
rng(0,'twister');
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
c = 3 %Amount of coefficients
%A = %bestx(1)
%omega = %bestx(2)
%D = %bestx(3)
x0=zeros(c,1);
x0(1,1) = 0.1; %Radnom start parameter for coefficients
x0(2,1) = 700;
x0(3,1) = 0.1;
%Calculating fitting parameters
bestx = fminsearch(fun,x0) %Searching for the least uncertainty of c
yfit = bestx(1)./(sqrt((1-(xdata/bestx(2)).^2).^2+(2*bestx(3)*xdata/bestx(2)).^2)); %Forced oscillation fit
Funktioniert super. Geht bestimmt besser, ist aber momentan ausreichend. Bin froh das es überhaupt klappt. Sollte jemand Vorschläge haben, würde ich die gerne hören.
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.