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

fit auf rechtecksfunktion

 

bene
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 25.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2013, 21:48     Titel: fit auf rechtecksfunktion
  Antworten mit Zitat      
Hallo zusammen,

ich habe Messwerte, welche eine Rechteckspannung beschreiben, allerdings gestört durch rauschen. Jetzt möchte ich einen fit durch die Messwerte machen um auf Amplitude, Frequenz und Mittelwert zu kommen.

Ich mach jetzt schon ewig mit dem Curve Fitting Tool rum, aber komm nicht weiter. Mein Gedanke war auf eine Custom Equation mit
Code:
a1*sign(sin(b1*x-c1))+d1
zu fitten. Allerdings komm ich damit nicht weiter Matlab gibt mir dabei nur eine Konstante. Irgendjemand eine Idee, wie ich das fitten kann?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

die Optimierungslöser in MATLAB laufen da vermutlich in ein lokales Minimum.

Hast du Beispieldaten, die du zur Verfügung stellen kannst?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 25.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2013, 08:38     Titel:
  Antworten mit Zitat      
bspw mit folgenden Daten:

x=0:.1:10;
y=sign(sin(pi*x));

hier kommt allerdings nicht eine konstante raus, sondern eine andere Rechtecksfunktion 0.1726*sign(sin(0.9292*x+0.3032))-0.04957

Richtige Messdaten müsste ich erst noch kurz besorgen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.08.2013, 09:39     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte komplette Beispiele, also inkl. der verwendeten Fitting-Funktion. Ist deutlich einfacher, wenn man das direkt nachvollziehen kann.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 25.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2013, 10:14     Titel:
  Antworten mit Zitat      
Ich hab dazu eben das Curve Fitting Tool benutzt und mir jetzt das m-File generieren lassen. Allerdings kenn ich mich nicht sooo gut mit Matlab aus, dass ich das auf anhieb versteh, was da rauskommt. Ich habe es jetzt aber mal angehängt:

Code:
function createFit(x,y)
%CREATEFIT Create plot of data sets and fits
%   CREATEFIT(X,Y)
%   Creates a plot, similar to the plot in the main Curve Fitting Tool,
%   using the data that you provide as input.  You can
%   use this function with the same data you used with CFTOOL
%   or with different data.  You may want to edit the function to
%   customize the code and this help message.
%
%   Number of data sets:  1
%   Number of fits:  1

% Data from data set "y vs. x":
%     X = x:
%     Y = y:
%     Unweighted

% Auto-generated by MATLAB on 03-Aug-2013 11:11:14

% Set up figure to receive data sets and fits
f_ = clf;
figure(f_);
set(f_,'Units','Pixels','Position',[658 269 688 485]);
% Line handles and text for the legend.
legh_ = [];
legt_ = {};
% Limits of the x-axis.
xlim_ = [Inf -Inf];
% Axes for the plot.
ax_ = axes;
set(ax_,'Units','normalized','OuterPosition',[0 0 1 1]);
set(ax_,'Box','on');
axes(ax_);
hold on;

% --- Plot data that was originally in data set "y vs. x"
x = x(:);
y = y(:);
h_ = line(x,y,'Parent',ax_,'Color',[0.333333 0 0.666667],...
    'LineStyle','none', 'LineWidth',1,...
    'Marker','.', 'MarkerSize',12);
xlim_(1) = min(xlim_(1),min(x));
xlim_(2) = max(xlim_(2),max(x));
legh_(end+1) = h_;
legt_{end+1} = 'y vs. x';

% Nudge axis limits beyond data limits
if all(isfinite(xlim_))
    xlim_ = xlim_ + [-1 1] * 0.01 * diff(xlim_);
    set(ax_,'XLim',xlim_)
else
    set(ax_, 'XLim',[-0.10000000000000001, 10.1]);
end

% --- Create fit "fit 1"
fo_ = fitoptions('method','NonlinearLeastSquares','Algorithm','Levenberg-Marquardt','DiffMinChange',1.0000000000000001e-009,'MaxFunEvals',6000,'MaxIter',4000);
ok_ = isfinite(x) & isfinite(y);
if ~all( ok_ )
    warning( 'GenerateMFile:IgnoringNansAndInfs',...
        'Ignoring NaNs and Infs in data.' );
end
st_ = [0.041566865995910862 0.17148836668977852 0.15308866561905898 0.30667010942829687 ];
set(fo_,'Startpoint',st_);
ft_ = fittype('a*sign(sin(b*x+c))+d',...
    'dependent',{'y'},'independent',{'x'},...
    'coefficients',{'a', 'b', 'c', 'd'});

% Fit this model using new data
cf_ = fit(x(ok_),y(ok_),ft_,fo_);
% Alternatively uncomment the following lines to use coefficients from the
% original fit. You can use this choice to plot the original fit against new
% data.
%    cv_ = { -0.13255162167351081, 0.17148836668977852, 0.15308866561905898, 0.13255162175885007};
%    cf_ = cfit(ft_,cv_{:});

% Plot this fit
h_ = plot(cf_,'fit',0.95);
set(h_(1),'Color',[1 0 0],...
    'LineStyle','-', 'LineWidth',2,...
    'Marker','none', 'MarkerSize',6);
% Turn off legend created by plot method.
legend off;
% Store line handle and fit name for legend.
legh_(end+1) = h_(1);
legt_{end+1} = 'fit 1';

% --- Finished fitting and plotting data. Clean up.
hold off;
% Display legend
leginfo_ = {'Orientation', 'vertical', 'Location', 'NorthEast'};
h_ = legend(ax_,legh_,legt_,leginfo_{:});
set(h_,'Interpreter','none');
% Remove labels from x- and y-axes.
xlabel(ax_,'');
ylabel(ax_,'');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.08.2013, 10:04     Titel:
  Antworten mit Zitat      
Hallo,

ich finde cftool gut, wenn man "mal schnell was fitten" möchte.

Wenn das aber so nicht klappt, greife ich doch lieber auf nlinfit / lsqcurvefit zurück. Entscheidend ist aber so oder so die Wahl guter Startwerte:

Code:
x=0:.1:10;
y=2*sign(sin(pi*x-1))+3;
subplot(2,1,1)
stem(x,y)

% Wo geht x von negativ nach positiv?
xup = x(diff(sign(y-mean(y)))>0);

% astart(1) = ungefähren Amplitude
astart(1) = (max(y) - min(y)) / 2;

% astart(2) = 2*pi / Periode
astart(2) = 2*pi / mean(diff(xup));

% astart(3) = Mittelwert ( xup auf [0, periode] abgebildet )
astart(3) = -astart(2) * mean(mod(xup, mean(diff(xup))));

% astart(4) = Mittelwert
astart(4) = mean(y);

model = @(a,x) a(1)*sign(sin(a(2)*x+a(3))) + a(4);

opts = optimset('DiffMinChange', 0.1);
[x,resnorm,residual,exitflag]= lsqcurvefit(model, astart, x,y, [], [], opts);
hold on
plot(x, model(abest,x),'g')
subplot(2,1,2)
stem(x, y-model(abest,x))


Je nachdem, wie die tatsächlichen Signale aussehen, muss man das vielleicht noch etwas anpassen.

Grüße,
Harald
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.