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

Kurvenverlauf glätten

 

ad1205
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 12:33     Titel: Kurvenverlauf glätten
  Antworten mit Zitat      
Hallo liebes Forum,

aus einer Simulation erhalte ich Kurvenverläufe in denen kleine Artefakte vorhanden sind. Zum besseren Verständnis habe ich einen Plot angehängt. Ich würde diese Kurve gerne glätten, bin mir aber nicht ganz sicher, was hier der beste bzw. einfachste Weg ist.

Momentan interpoliere ich kubisch mit "interp1". Bei einem Interpolations-X-Vektor mit kleiner Schrittweite, bleibt der Ausreißer aber natürlich bestehen. Eine andere Idee wäre wohl den Mittelwert aus einer vorgegeben Anzahl benachbarter Werte zu bilden. Hier bin ich mir aber etwas unsicher bezüglich einer geeigneten Umsetzung in Matlab.

Daher die Frage, ob es noch andere Möglichkeiten gibt oder Matlab evtl. fertige Funktionen für mein Anliegen anbietet.

Etwas Unterstützung würde mir sehr helfen. Daher im Vorfeld schonmal vielen Dank dafür und viele Grüße!!

plot.png
 Beschreibung:

Download
 Dateiname:  plot.png
 Dateigröße:  24.97 KB
 Heruntergeladen:  1768 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: 18.03.2017, 15:24     Titel:
  Antworten mit Zitat      
Hallo, polyfit scheint für deine Daten geeignet zu sein, Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 15:29     Titel:
  Antworten mit Zitat      
ich bin inzwischen schon etwas weiter:

[code]
[ywerte_fit, gof] = fit( xwerte, ywerte, 'poly8');
plot(xwerte,ywerte_fit(xwerte),xwerte,ywerte);
[\code]

Hierdurch erhalte ich eine geglättete Kurve ohne Ausreißer, die ausreichend genau mit dem ursprünglichen Verlauf übereinstimmt. Allerdings erscheint noch folgende Warnung:

"Warning: Equation is badly conditioned. Remove repeated data points or try centering and scaling."

Hat jemand eine Idee was ich ändern bzw. anpassen muss, um dieser Warnung gerecht zu werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 18.03.2017, 15:39     Titel:
  Antworten mit Zitat      
dein x-vektor enthält anscheinend einige werte doppelt, er sollte normalerweise monoton steigend sein und jeder wert nur einmal vorkommen, d.h. z.B. x=[1 2 3 4 5] und nicht x=[1 2 2 3 4 5]. entferne die doppelten punkte und die warnung verschwindet, gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 15:50     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort!

ich interpoliere ja zuerst noch und generiere mir hierfür einen neuen x-Verktor:
Code:

x_interpoliert = 0:0.5:xmax;
y_interpoliert = interp1(xwerte,ywerte,x_interpoliert,'spline');



Hierbei sind [xwerte,ywerte] meine ursprünglichen Daten mit xmax als maximalen Wert auf der x-Achse. Eigentlich können doch dann keine doppelten x-Werte vorhanden sein, oder habe ich da noch einen Denkfehler?

Habe jetzt auch mal deinen Tipp befolgt und das ganze mit "polyfit" versucht:

Code:

[p,S,mu] = polyfit( x_interpoliert, y_interpoliert,  8);
polynom = polyval(p,x_interpoliert);
plot(x_interpoliert,polynom);


Hier kommt zwar keine Fehlermeldung, leider passt die gefittete Kurve aber auch überhaupt nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 18.03.2017, 16:00     Titel:
  Antworten mit Zitat      
die zeilen die du gepostet hast, sehen auf anhieb richtig aus; der fehler muss an einer anderen stelle sein. wie sehen die messdaten und der fit den anschließend aus?
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 16:32     Titel:
  Antworten mit Zitat      
anbei nochmal mein komplettes Programm mit Variante 1 "polyfit" und Variante 2 "fit":

Code:


clear all
close all
clc

% Daten einlesen
file = csvread('messdaten.csv');

[m,n]=size(file);

xwerte = file(1:m,1);
ywerte = file(1:m,2);


% Interpolation
xmax = max(xwerte);
xmin = min(xwerte);

x_interpoliert = xmin:0.5:xmax;
y_interpoliert = interp1(xwerte,ywerte,x_interpoliert,'spline');

% Plot Daten und Interpolation
figure(1)
plot(xwerte,ywerte,x_interpoliert,y_interpoliert)

% Variante 1, funktioniert nicht
[p,S,mu] = polyfit( x_interpoliert, y_interpoliert,  8);

polynom = polyval(p,x_interpoliert);

figure(2)
plot(x_interpoliert,polynom);

% Variante 2, funktioniert, allerdings mit Warnung
[ywerte_fit, gof] = fit( x_interpoliert', y_interpoliert', 'poly8');

figure(3)
plot(x_interpoliert,ywerte_fit(x_interpoliert),x_interpoliert,y_interpoliert);

 


Zusätzlich habe ich auch noch die drei Plots hochgeladen. Habe auch alles nochmal in der Hilfe überprüft und finde einfach keinen Fehler..

variante2.png
 Beschreibung:

Download
 Dateiname:  variante2.png
 Dateigröße:  29.2 KB
 Heruntergeladen:  1060 mal
variante1.png
 Beschreibung:

Download
 Dateiname:  variante1.png
 Dateigröße:  19.7 KB
 Heruntergeladen:  1019 mal
rohdaten_und_interpolation.png
 Beschreibung:

Download
 Dateiname:  rohdaten_und_interpolation.png
 Dateigröße:  27.18 KB
 Heruntergeladen:  1072 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: 18.03.2017, 16:49     Titel:
  Antworten mit Zitat      
schaut gut aus; liegt es vllt. an dem argument 'spline', funktioniert es ohne das argument?

Code:


sind xU und x identisch oder haben sie eine unterschiedliche länge?
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 17:01     Titel:
  Antworten mit Zitat      
die beiden Vektoren sind gleich lang. Und auch das Weglassen von 'spline' führt zum selben falschen Ergebnis. Um auszuschließen, dass es an der Interpolation liegt, habe ich "polyfit" mal mit den ursprünglichen Messdaten aufgerufen. Auch das funktioniert nicht.. Meine Messdaten kann ich leider nicht hochladen, da das csv-Format nicht unterstützt wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 18.03.2017, 17:13     Titel:
  Antworten mit Zitat      
kannst die csv hier hochladen https://www.file-upload.net/

würde mich ja jetzt schon interessieren, waurm das nicht hinhaut Surprised
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 17:27     Titel:
  Antworten mit Zitat      
https://www.file-upload.net/download-12382097/messdaten.csv.html

hab ja immer noch die Befürchtung, dass ich irgendeinen ganz ganz blöden Fehler mache:D
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 18.03.2017, 17:48     Titel:
  Antworten mit Zitat      
Code:
clear all; close all; clc;

% Daten einlesen
file = csvread('messdaten.csv');

[m,n]=size(file);

xwerte = file(1:m,1);
ywerte = file(1:m,2);

% Interpolation
xmax = max(xwerte);
xmin = min(xwerte);

x_interpoliert = xmin:0.5:xmax;
y_interpoliert = interp1(xwerte,ywerte,x_interpoliert,'spline');

% Plot Daten und Interpolation
figure(1)
plot(xwerte,ywerte,x_interpoliert,y_interpoliert); hold on;

lambda=1e-8; % Glättungsparameter, lamba -> 0 hohe glättung lamba -> 1 keine glättung
p=csaps(x_interpoliert,y_interpoliert,1e-8);
y_approximation = fnval(p,x_interpoliert);

figure(1)
plot(x_interpoliert,y_approximation); legend('Messdaten','Interpolation','Approximation');



kein offensichtlicher fehler dabei, ich gehe davon aus, dass es daran liegt, dass deine x- und y- werte soweit auseinander liegen, x liegt im bereich von 1e3 und y im bereich von 1e-1; aufgrund der hohen abweichung ist das ausgleichsproblem schlecht konditioniert. die empfehlung von matlab ist, die werte zu skalieren, damit sie ungefähr die gleiche dimension haben. ich habe dein programm jetzt mal mit meinem üblichen lösungsweg angepasst; für approximationsaufgaben nutze ich i.d.r. csaps . dabei ist lambda ein glättungsparameter im bereich von 0 bis 1 über den du den glattheitsgrad einstellen kannst, gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 17:56     Titel:
  Antworten mit Zitat      
Hey, vielen Dank!

Deine Variante funktioniert einwandfrei.. du hast mir wirklich sehr geholfen:)
Private Nachricht senden Benutzer-Profile anzeigen
 
ad1205
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 18.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2017, 18:13     Titel:
  Antworten mit Zitat      
eine Frage hätte ich dann doch noch.. rein aus Interesse habe ich zur Skalierung mal in meiner Variante den x-Vektor durch 1000 geteilt, so dass die x- und y-Werte jetzt näher beieinander liegen.. erhalte aber immer noch die gleich Fehlermeldung bei der "fit-Variante".

Habe dann mit dem gleichen x-Vektor (durch 1000 geteilt) nochmal deine Variante durchlaufen lassen.. komischerweise funktioniert die dann auch nicht mehr.. kriege als Ergebnis einen nahezu linearen Verlauf, wobei das Ganze auch sehr empfindlich auf eine Änderung von Lambda reagiert..

edit: habe durch 10^6 geteilt..
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 18.03.2017, 18:25     Titel:
  Antworten mit Zitat      
gute beobachtung, passt zu dem theoretischen hintergrund von csaps; der geglättete verlauf kann z.t. sehr empflindlich auf änderungen von lambda reagieren. wie man lambda richitg wählt, kann niemand sagen und es gibt auch keinen algorithmus dazu, der lambda in einer art und weise "richtig " oder "optimal" berechnet. man legt lambda durch "ausprobieren" und "experimentieren" fest. zu dem skalierungsproblem, bin mir nicht sicher, ob einfaches teilen durch 1000 ausreicht, um die kondition zu verbessern, da müsste man sich nochmal genauer mit der theorie auseinandersetzten.
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.