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

Auswertung von Messkurven, finde Maximum, Flächenintegral

 

Becky

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2015, 09:28     Titel: Auswertung von Messkurven, finde Maximum, Flächenintegral
  Antworten mit Zitat      
Hallo liebe Community!

Ich bin ganz neu bei MatLab, hab gerade erst angefangen mich ein bisschen einzuarbeiten, daher könnte es sein, dass mein Anliegen euch total trivial erscheint.

Also, ich habe Versuchskurven mit x-y-Wertepaaren. Das Ziel ist es, von einem bestimmten Bereich der Kurve die Fläche unter der Kurve zu bestimmen. Da möchte ich nun einen Plot erstellen, damit der User sich ein Bild vom Kurvenverlauf machen kann. Daraufhin soll über ein Eingabefenster die Möglichkeit haben, die Messwerteanzahl zu reduzieren und einen Schwellwert einzugeben, der später noch Verwendung findet.
Zur Bestimmung des zu integrierenden Bereichs habe ich mir folgendes überlegt: Ich suche in der Kurve das globale Maximum und dann von dem Maximum aus bis zum Ende der Messwerte das Wertepaar, wo der Schwellwert zum ersten Mal unterschritten wird. Vom Anfang bis dorthin wird dann integriert.
Das ganze wollte ich dann in eine Schleife packen, um nacheinander alle vorliegenden Kurven so auszuwerten.

Jetzt noch ein paar Zeilen Code:
Code:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ACHTUNG: Workaround! Auswertung der Energie nur bis zum Kraftmaximum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%keine Rückverformung

echo off
clear all
close all

f = dir('*.txt')
files = {f.name}

for k=1:numel(files) %Einlesen der Dateien
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1. Datein einlesen
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
filename = files{k};   %einzulesende Datei im gleichen Verzeichnis
delimiter = ' ';         %Separator der Spalten
headlines = 2;            %Anzahl der führenen Kopfzeilen
A = importdata(filename, delimiter, headlines); %Datenarray mit Kopfzeile
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2. Daten in Vektoren Schreiben
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
assignin('base','weg_base',A.data(:,5));        %Zeitvektor
assignin('base','kraft_base',A.data(:,3));    %Kraftvektor
weg_m = weg_base/1000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 3. Schwellwert bestimmen
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
prompt={'Bitte Variable zur Reduzierung der Messpunkte eingeben. Es wird nur jedes z-ste Wertepaar verwendet. Am besten mit einem kleinen Wert starten und sich vorsichtig herantasten. z='};
name='Reduzierung der Messpunkte';
numlines=1;
defaultanswer={'2'};
ans=inputdlg(prompt,name,numlines,defaultanswer);
ans_str=ans{1,1};
z=str2num(ans_str)
   
for i = 1:length(kraft_base)/z    %Verringerung der Anzahl der Messwerte
    kraft(i) = kraft_base(i*z-(z-1));
    weg(i) = weg_m(i*z-(z-1));
end
figure(1)
plot(weg,kraft)                 %Plot Kraft-Weg
xlabel('Weg [m]')
ylabel('Kraft [N]')
title('Kraft-Weg')
axis([0 inf -inf inf])
grid on

prompt={'Bitte Schwellwert der Kraft für das Ende der Verformung angeben. schwell='};
name='Schwellwert der Kraft';
numlines=1;
defaultanswer={'1000'};
ans=inputdlg(prompt,name,numlines,defaultanswer);
ans_str=ans{1,1};
schwell=str2num(ans_str)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 4. Finden des Endwertes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[spalten_k zeilen_k]=size(kraft);
[max_kraft, i_max_kraft] = max(kraft);
%zeile_schwell = find(kraft<schwell);
%zeile_ende = find(zeile_schwell-i_max_kraft>1e-3,1)

%kraft_verf=kraft(1:zeile_ende);
%weg_verf=weg(1:zeile_ende);
kraft_verf=kraft(1:i_max_kraft);
weg_verf=weg(1:i_max_kraft);
figure(2)
plot(weg_verf,kraft_verf)                 %Plot Kraft-Weg Belastung
xlabel('Weg [m]')
ylabel('Kraft [N]')
title('Kraft-Weg Belastung')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 5. Bildung der Energien
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
E = trapz(weg_verf,kraft_verf);

Energie{k,1} = filename;
Energie{k,2} = E;

end

fileID=fopen('Ergebnis_kr.dat','w');
[nrows,ncols] = size(Energie);
formatSpec = '%s %d \n';
for row = 1:nrows
    fprintf(fileID,formatSpec,Energie{row,:});
end


Mein Workaround im Moment ist, die Kurven eben nur bis zum Kraftmaximum auszuwerten, daber das ist keine Lösung, da entsteht ein großer Fehler. Ich bin mir sicher das Problem liegt beim "find"-Befehl, aber ich wusste nicht, wie ich das sonst umsetzen soll.

Ein Bild der Messkurven ist im Anhang. Sie gehen hinten noch wesentlich weiter und bei anderen erreicht die Kurve nicht mehr Null. Die Messkurven selber kann ich leider nicht posten, sorry :/

Ich hoffe, ich konnte verständlich machen, was ich eigentlich möchte.^^
Schonmal im Voraus vielen Dank!
Becky

kurven.png
 Beschreibung:

Download
 Dateiname:  kurven.png
 Dateigröße:  963.78 KB
 Heruntergeladen:  308 mal


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.05.2015, 09:57     Titel:
  Antworten mit Zitat      
hallo
wozu hast du
Code:
im code? hast du angst das matlab zeit spart weil es nicht immer weider die selben variablen neu in den speicher laden muss oder hast du angst das du deinen code aus versehen debuggen könntest? Smile
clear all ist misst und warum wurde hier im forum schon sehr oft besprochen.
Code:
ans=inputdlg(prompt,name,numlines,defaultanswer);
ans als variablen namen zu verwenden ist nicht günstig.
wozu benutzt du
Code:
assignin('base','weg_base',A.data(:,5));
?
das dynamische erstellen von variablen namen macht es meist recht unübersichtlich.
so jetzt aber zu deinem problem... was ist denn jetzt genau das problem? das habe ich noch nicht ganz verstanden. du meintest zwar irgendwas mit find aber find kommt bei dir nur in kommentaren vor wenn ich das richtig sehe. falls du aber die zeilen meinst ist mir die bedeutung von
Code:
find(zeile_schwell-i_max_kraft>1e-3,1
noch nicht ganz klar. der index von irgendwelchen indexen... das raff ich noch nicht.
Zitat:
Ich suche in der Kurve das globale Maximum und dann von dem Maximum aus bis zum Ende der Messwerte das Wertepaar, wo der Schwellwert zum ersten Mal unterschritten wird.
das seh ich da irgendwie noch nicht müsste doch irgendwie so aussehen:
Code:
[C,I]=max(daten)
I2=find(daten(I:end)<schwellwert,1,'first');

aus I und I2 kannst du dann ja den punkt den du suchst finden.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Becky

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2015, 10:23     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort!

Du hast vollkommen Recht, ich habe wohl eine spätere Version gepostet. Eigentlich sollte es so aussehen:

Code:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 4. Finden des Endwertes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[spalten_k zeilen_k]=size(kraft);
[max_kraft, i_max_kraft] = max(kraft);
zeile_ende = find(kraft(i_max_kraft:end)<schwell,1);

kraft_verf=kraft(1:zeile_ende);
weg_verf=weg(1:zeile_ende);
figure(2)
plot(weg_verf,kraft_verf)                 %Plot Kraft-Weg Belastung
xlabel('Weg [m]')
ylabel('Kraft [N]')
title('Kraft-Weg Belastung')
grid on


Das konkrete Problem ist: Wenn ich das so mache, wie oben gepostet, gibt mir "find" ein Wertepaar irgendwo ziemlich am Anfang der Kurve, wo sie einen Wert von ~350 hat, obwohl ich doch eigentlich gehofft hatte, den Punkt nach dem Maximum zu bekommen, wo die Kurve ein Niveau von 1000 unterschreitet.

Zu deinen anderen Frage:
Ich habe in meiner Unwissenheit Teile eines bereits existierenden Codes kopiert. Dass ans als Variablenname ungünstig gewählt ist, sehe ich ein! Wink
Kannst du mir eine bessere Möglichkeit aufzeigen, die Messdaten einzulesen statt
Code:
assignin('base','weg_base',A.data(:,5));
zu verwenden?

plot2.PNG
 Beschreibung:
Zweiter Plot, "geschnittene" Kurve.

Download
 Dateiname:  plot2.PNG
 Dateigröße:  20.75 KB
 Heruntergeladen:  346 mal
plot1.PNG
 Beschreibung:
Erster Plot mit Eingabefenster Schwellwert.

Download
 Dateiname:  plot1.PNG
 Dateigröße:  34.47 KB
 Heruntergeladen:  324 mal
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.05.2015, 10:33     Titel:
  Antworten mit Zitat      
Code:
Das konkrete Problem ist: Wenn ich das so mache, wie oben gepostet, gibt mir "find" ein Wertepaar irgendwo ziemlich am Anfang der Kurve, wo sie einen Wert von ~350 hat, obwohl ich doch eigentlich gehofft hatte, den Punkt nach dem Maximum zu bekommen, wo die Kurve ein Niveau von 1000 unterschreitet.
das problem is einfach das du den index falsch verstehst. der index beziht sich auf das temporäre array kraft(i_max_kraft:end) der index 1 entspricht also kraft(i_max_kraft) du musst also die indexe addieren. (und noch was abzihen) deswegen hab ich ja auch
Zitat:
aus I und I2 kannst du dann ja den punkt den du suchst finden.
geschrieben und nicht nur aus I2 Smile
Zitat:
Kannst du mir eine bessere Möglichkeit aufzeigen, die Messdaten einzulesen statt
Code:
Code:
assignin('base','weg_base',A.data(:,5));

Funktion ohne Link?
zu verwenden?

Code:
weg_base=A.data(:,5)
du verlässt doch den base raum in deinem script nicht.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2015, 10:54     Titel:
  Antworten mit Zitat      
OMG es funktioniert! Tausend Dank! Smile))

Ich hoffe, wenn ich ein bisschen mit dem Programm arbeite, werde ich mehr Gefühl und Verständnis dafür aufbauen. Falls ich mal wieder ein scheinbar unlösbares Problem hab, werd ich gern wieder vorbeischauen. Wink

Gruß,
Becky
 
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.