Auswertung von Messkurven, finde Maximum, Flächenintegral
Becky
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.05.2015, 09:28
Titel: Auswertung von Messkurven, finde Maximum, Flächenintegral
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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([0inf -infinf]) 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);
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
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?
clear all ist misst und warum wurde hier im forum schon sehr oft besprochen.
?
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
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:
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!
Kannst du mir eine bessere Möglichkeit aufzeigen, die Messdaten einzulesen statt
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
Zitat:
Kannst du mir eine bessere Möglichkeit aufzeigen, die Messdaten einzulesen statt
Code:
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.
Gruß,
Becky
Einstellungen und Berechtigungen
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
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.