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

Sinusregression

 

dasjoki
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 15:47     Titel: Sinusregression
  Antworten mit Zitat      
Hallo,
wahrscheinlich ist das für euch ein ganz simples Problem aber ich weiß einfach nicht weiter. Ich habe ein Signal (siehe Bild). Ihr seht einen abklingendes sinusförmiges Signal. Ich möchte nun eine Regression über alle Datenpunkte legen um einen idealisierten Sinus mit möglichst kleinem Fehler zu bekommen.
Ich bin im Internet auf eine entsprechende Funktion gestoßen, weiß aber erstens nicht, ob diese mir wirklich weiter hilft und zweitens nicht, wie ich diese Aufrufe. Ich habe bisher noch nicht mit solchen Funktionen gearbeitet:

Code:
function [rx,ry,rp]=sinfit
x=linspace(0,2*pi,36);
y=sin(x+-0.3+0.6*rand(size(x)));
plot(x,y);
param=fminsearch(@fun,[1 1 1],[],x,y);
fit=param(1)*sin(x*param(2)+param(3));
hold all;
plot(x,fit);
legend('Original','Fit');
hold off;
rx=x;
ry=y;
rp=param;

function ret=fun(c,x,y)
yy=c(1)*sin(x*c(2)+c(3));
ret=sum(abs(y-yy));


Kann mir da jemand weiter helfen oder wenigstens erklären was die Funktion macht und wie ich es schaffe, diese in mein Script einzubinden?

Mein Signal wird in meinem Script durch die Variable 'ywerte' beschrieben. Darin ist ein Vektor mit allen Messpunkten. Die x-Werte sind einfach nur über die Anzahl der Spalten von 'ywerte' definiert.

Viele Grüße
Jojo

Signal.png
 Beschreibung:

Download
 Dateiname:  Signal.png
 Dateigröße:  6.61 KB
 Heruntergeladen:  414 mal
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 13.01.2016, 16:15     Titel:
  Antworten mit Zitat      
Code:
function [rx,ry,rp]=sinfit
x=linspace(0,2*pi,36);                  % erstelle x-Gitter
y=sin(x+-0.3+0.6*rand(size(x)));        % erstelle y-Testdaten, Sinus + zufällige Störung
plot(x,y);                              % plot Testdaten
param=fminsearch(@fun,[1 1 1],[],x,y);  % Löse Optimierungsproblem, Gesucht sind die Koeffizieten c1,c2,c3
fit=param(1)*sin(x*param(2)+param(3));  % Lösung + Plot
hold all;
plot(x,fit);
legend('Original','Fit');
hold off;
rx=x;
ry=y;
rp=param;

function ret=fun(c,x,y)     % Optimierungsfunktion
yy=c(1)*sin(x*c(2)+c(3));   % c1*sin(x*c2+c3) entspricht A*sin(w0*x+phi), A: Amplitude, w0: Frequenz, phi: Phasenverschiebung
ret=sum(abs(y-yy));         % Summe über alle absoluten Differenezen von Testdaten und momentaner Lösung



Vereinfacht gesprochen, sucht die Function Fminsearch nach der besten Kombination von c1,c2,c3 also A,w0,phi sodass A*sin(w0*x+phi) bestmöglich zu den Testdaten passt. Stichwort: Summe der kleinsten Fehlerquadrate

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
dasjoki
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 16:52     Titel:
  Antworten mit Zitat      
Hallo,
danke für die schnelle und ausführliche Antwort. Aber nun hab ich das Problem, dass ich nicht weiß, wie ich die Funktion bei mir einbaue. Kannst du mir sagen, was ich in meinem Script schreiben muss, damit die Funktion aufgerufen wird und nicht die Testdaten sondern meine eigenen Daten als Eingabe dienen?

Viele Grüße
Jojo
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 13.01.2016, 17:11     Titel:
  Antworten mit Zitat      
Code:
function [x,fit,param]=sinfit(x,y)
param=fminsearch(@fun,[1 1 1],[],x,y);  % Löse Optimierungsproblem, Gesucht sind die Koeffizieten c1,c2,c3
fit=param(1)*sin(x*param(2)+param(3));  % Lösung + Plot
figure(1);
plot(x,y); hold on; plot(x,fit); hold off;
legend('Original','Fit');

function ret=fun(c,x,y)     % Optimierungsfunktion
yy=c(1)*sin(x*c(2)+c(3));   % c1*sin(x*c2+c3) entspricht A*sin(w0*x+phi), A: Amplitude, w0: Frequenz, phi: Phasenverschiebung
ret=sum(abs(y-yy));         % Summe über alle absoluten Differenezen von Testdaten und momentaner Lösung



1) Erstelle ein Skript in welchem du deine Daten in den Workspace lädst
2) Packe die angehängt Funktion "sinfit" in das gleiche Verzeichnis in welches zu auch das Skript gepackt hast
3) Rufe in deinem Skript sinfit mit deinen Daten auf
4) ???
5) Profit Wink

Gruß

sinfit.m
 Beschreibung:

Download
 Dateiname:  sinfit.m
 Dateigröße:  570 Bytes
 Heruntergeladen:  420 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
dasjoki
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 17:50     Titel:
  Antworten mit Zitat      
Ich habe es jetzt folgendermaßen aufgerufen:

Code:

xwerte=(1:p);                % Anzahl der x-Werte abhängig von Anzahl der y-Werte
ywerte=average_norm(1,:); % erste Zeile einer zu prüfenden Matrix

sinfitting=sinfit(xwerte,ywerte); % Funktionsaufruf
figure;
plot(sinfitting);

 


Heraus kommt dann einfach nur eine Gerade. Irgendetwas mach ich da, glaube ich, grundlegend falsch =/

Edit: Es kam noch ein anderes Bild heraus (siehe Anhang). Das scheint der Funktionsplot zu sein. Jedoch stimmt der überhaupt nicht.

Gruß

Lösung.png
 Beschreibung:

Download
 Dateiname:  Lösung.png
 Dateigröße:  7.56 KB
 Heruntergeladen:  430 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 13.01.2016, 18:10     Titel:
  Antworten mit Zitat      
Code:
function [x,fit,param]=sinfit(x,y,x0)
param=fminsearch(@fun,x0,[],x,y);  % Löse Optimierungsproblem, Gesucht sind die Koeffizieten c1,c2,c3
fit=param(1)*sin(x*param(2)+param(3));  % Lösung + Plot
figure(1);
plot(x,y); hold on; plot(x,fit); hold off;
legend('Original','Fit');

function ret=fun(c,x,y)     % Optimierungsfunktion
yy=c(1)*sin(x*c(2)+c(3));   % c1*sin(x*c2+c3) entspricht A*sin(w0*x+phi), A: Amplitude, w0: Frequenz, phi: Phasenverschiebung
ret=sum((y-yy).^2);         % Summe über alle absoluten Differenezen von Testdaten und momentaner Lösung


Sieht so aus, als ob fminsearch nicht richitg konvergiert ist, liegt möglicherweise an der Optimierungsfunktion, habe sie jetzt durch x² anstelle von abs(x) ersetzt. Zudem habe ich x0 als Startvektor definiert, hier kannst du versuchen verschiedene Start-Koeffizierten auszuprobieren, z.b. x0=[1 2 3] whatever, möglicherweise konvergiert fminsearch dann besser.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
dasjoki
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 18:26     Titel:
  Antworten mit Zitat      
habe meine Script folgendermaßen ergänzt:

Code:

x0=[1,1,1];
sinfitting=sinfit(xwerte,ywerte,x0);
 


Ausgabe:
Error using sinfit
Too many input arguments.

Wenn ich das x0 weg lasse, bekomme ich einen Plot, welcher aber unverändert zum vorherigen Post ist.

Ich hänge mal die .dat mit den Funktionswerten meiner Funktion an. Eventuell lässt sich das Problem ja dann besser analysieren.

Gruß

Probe1_ywerte.zip
 Beschreibung:

Download
 Dateiname:  Probe1_ywerte.zip
 Dateigröße:  486 Bytes
 Heruntergeladen:  336 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 14.01.2016, 14:26     Titel:
  Antworten mit Zitat      
Hast du die Function Sinfit von meinem vorherigen Post aktualisiert? Zudem musst du auf die Dimensionen von x und y achten, die müssen 1xn sein!

Bei mir gibt die Funktion was halbwegs brauchbares aus für x0=[1 0 1], wie gesagt du musst verschiedene x0 ausprobieren.

Die Lösung geht dann in Richtung Regressionsgerade, ich glaube was besseres kannst du auch nicht erwarten, da das Signal schwer mit deiner Ansatzfunktion A*sin(w0*x+phi) anzunähern ist. Bessere eine abklingende Ansatzfunktion mit exp.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
dasjoki
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2016, 14:33     Titel:
  Antworten mit Zitat      
hey,
ja die sinfit hab ich aktualisiert. Mit den Werten x0=[1,0,1] (Notation richtig?) bekomm ich auch nur eine Gerade.
Hast du eine Idee, wie die Ansatzfunktion mit exp aussehen könnte?

Vielen Dank für deine ausführliche Hilfe.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.01.2016, 15:02     Titel:
  Antworten mit Zitat      
Hallo,

als Ansatz käme wohl so etwas in Frage:

f(t) = e^-^a^t * cos (wt)

Denn aus deinem Bild geht klar ein Cosinus hervor. Ich weiß nicht ob es bei der Regression einen Unterschied macht. Ist ja nur eine Verschiebung der Phase um pi/2.

Ausserdem scheinen hier 2 unterschiedliche Exponentialfunktion überlagert zu sein, da bei den Max- und Minpeaks nicht die gleiche Dämpfung vorliegt. Evtl. wäre es auch hilfreich das höherfrequente Störsignal vorher mit einem Filter zu entfernen.
Private Nachricht senden Benutzer-Profile anzeigen
 
dasjoki
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 29.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2016, 15:22     Titel:
  Antworten mit Zitat      
ich werde es am Wochenende mal ausprobieren. Vielen Dank. Sollte ich nicht weiter kommen, melde ich mich einfach wieder Smile

Vielen Dank erstmal

Gruß
Johannes
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 - 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.