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

Optimization Toolbox

 

Henrik123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 19.04.2017, 14:30     Titel: Optimization Toolbox
  Antworten mit Zitat      
Hallo liebe Community.

Ich möchte einen Messdatensatz fitten. Die Kurve ist mir bekannt.

A/(sqrt((1-(tdata/omega).^2).^2+4*D.^2*(tdata/omega).^2))

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:


%---Script for 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);

rng default % for reproducibility

tdata = Result(:,1);
ydata = Result(:,2);

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.

Error in ==> sseval at 4
D = x(3);


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.

Besten Gruß Henrik
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

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.
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: 20.04.2017, 22:03     Titel:
  Antworten mit Zitat      
Ich habe jetzt eine Lösung.


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 '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, if NaN is at the beginning of an array?
%n=(length(Result(1,:))-1)/2)     %Amount of fitting curves
%nn=length(Result(:,1))

for i = 1:((length(Result(1,:))-1)/2)
   
for j = 1:1:length(Result(:,1))
    if isnan(Result(j,i*2)) == 0
        ResultX(j,1)=Result(j,1);
        ResultY(j,1)=Result(j,i*2);
       
    end
end
     
    rng(0,'twister');
    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

    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

    %Parameter writing in matrix is missing!!!
   
%---Plot data---%
hold all
plot(ResultX,ResultY, '*', 'LineWidth',1)
plot(xdata,yfit,'r');
xlim([0 1500])
ylim([0 8])
xlabel('tdata')
ylabel('Response Data and Curve')
title('Data and Best Fitting Forced Oscillation ')
legend('Data','Fitted Curve')

end

 


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.

PS: Ich habe gegoogelt nach "Curve Fitting via Optimization".
https://de.mathworks.com/help/matla.....ing-via-optimization.html
Ich dachte das hätte was mit der "Optimaization Toolbox" zu tun.
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 - 2024 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.