Technische Informatik für Ingenieure WS 2010/2011 Musterlösung Übungsblatt Nr. 8 13. Dezember 2010 Übungsgruppenleiter: Matthias Fischer Mouns Almarrani Rafał Dorociak Michael Feldmann Thomas Gewering Benjaminn Koch Dominik Lüke Alexander Teetz Simon Titz Simon Oberthür Seite 1(8) Dieses Übungsblatt behandelt Aufgaben, wie sie beim Umgang mit realen Messdaten regelmäßig auftreten. Grundlage ist das gemessene Übertragungsverhalten einer piezoelektrischen Schwingers. Der Schwinger wird mit der Spannung u(t) ) bei unterschiedlichen Frequenzen angeregt, die Auslenkung x(t) des Schwingers wird gemessen. Gespeichert ist das Verhältnis u(t)/x(t) in Betrag ( x/u ) und Phase (arg(x/u)). Aufgabe 1: Lesen Sie die Daten aus (Daten einlesen undd darstellen) der bereitgestellten Datei xu_50.10.5000hz.w_l ein und speichern Sie sie in einem geeignetenn Array. Die Datei ist eine Textdatei mit n Zeilen und 3 Spalten, die durch Leerzeichen getrennt sind. Der Aufbau ist: Frequenz f x/u arg(x/u)
Technische Informatik für Ingenieure Seite 2(8) Beispiel: +9.004800E+001 +2.128776E-004 +5.070000E+000 Schreiben sie zwei Programme. Das erste Programm stellt den Betrag ( x/u ) über der Frequenz (f) in einem Diagramm. Das zweite Programm stellt die Phase (arg(x/u)) über der Frequenz dar. Hierzu importieren Sie im ersten Schritt das an der Webseite der Veranstaltung bereitgestellte Projekt TIFI-Plot.zip (über File > Import > General > Existing Projects into Workspace > Select Archive File). Danach erweitern Sie entsprechend die beiden darin enthaltenen Programme Plotter1.java und Plotter2.java. Lösung: Plotter1.java: package de.uni_paderborn.hni.tifi; import jahuwaldt.plot.plotwindow; public class Plotter1 public static void main(string[] args) In.open("c:\\xu_50.10.5000Hz.w_l"); if (!In.done()) /* Fehlerbehandlung */ System.out.println("Datei nicht gefunden."); return; PlotWindow.setYLogAxisScale(true); for (;;) double a = In.readDouble(); double b = In.readDouble(); double c = In.readDouble(); if (a == 0.0 && b == 0.0 && c == 0.0) break; PlotWindow.addFrequenz(a); PlotWindow.addY(b); In.close(); PlotWindow.plotChart();
Technische Informatik für Ingenieure Seite 3(8) Ergebnis (für Plotter1. java): Plotter2.java: package de.uni_paderborn.hni.tifi; import jahuwaldt.plot. PlotWindow; public class Plotter2 public static void main(string[] args) In.open("c:\\xu_50. 10.5000Hz.w_l"); if (!In.done()) /* Fehlerbehandlung */ System.out.println("Datei nichtt gefunden."); return; PlotWindow.setYLogAxisScale( (false); for (;;) double a = In.readDouble(); double b = In.readDouble(); double c = In.readDouble(); if ( a == 0.0 break; && b == 0.0 && c == = 0.0) PlotWindow.addFrequenz(a); PlotWindow.addY(c); In.close() ; PlotWindow.plotChart();
Technische Informatik für Ingenieure Seite 4(8) Ergebnis (für Plotter2. java): Aufgabe 2: (Phasensprünge entfernen) Die gemessene Phase springt an drei Stellen im gemessenen Frequenzbereich. Diess liegt daran, dass das verwendetee Messgerätt Phasen im Bereich von -180 bis +180 ausgibt. Fällt also beispielsweise eine Phase von -179 um weitere 3, so wird sie als +178 aus- gegeben. Mathematisch ist das korrekt, da eine Phasendrehu ung um 360 keine Auswir- ohne kungen hat. Für die menschliche Wahrnehmung ist jedochh ein sanfter Verlauf Sprünge geeigneter. Entfernen Sie daher die Sprünge aus dem Phasengang, indemm Sie Vielfache von 360 auf die richtigen Phasenwerte addierenn oder von ihnen subtrahieren (z.b. findet derr ers- Algorithmus zum Bestimmen der Sprungstellen. te Sprung von -1.798900E+ +002 auf +1.796900E+ +002 statt; ab hier müssen bis zum nächsten Sprung 360 abgezogen werden). Überlegen Sie sich dafür einen geeigneten Lösung: package de.uni_paderborn.hni.tifi; import jahuwaldt.plot. PlotWindow; public class Blatt8_Aufgabe2 public static void main(string[] args) In.open("c:\\xu_50. 10.5000Hz.w_l"); if (!In.done())
Technische Informatik für Ingenieure Seite 5(8) /* Fehlerbehandlung */ System.out.println("Datei nicht gefunden."); return; PlotWindow.setYLogAxisScale(false); boolean sprung = false; double sprung_diff = 0.0; double c_alt = 0.0; for (int i = 0;; i++) double a = In.readDouble(); double b = In.readDouble(); double c = In.readDouble(); /* Der Wert von c muss ggf. korrigiert werden */ double c_korr = c; if (i > 0) /* Ansonsten, falls i == 0, dann haben wir * noch keinen alten Wert von c */ /* Mal schauen, ob es einen Sprung gab. */ double diff = c - c_alt; if (diff > 359.0 diff < -359.0) sprung =!sprung; if (sprung) /* Die Differenz speichern wir unter sprung_diff ab */ sprung_diff = diff; if (sprung) /* Der Wert vom c wird entsprechend angepasst. */ c_korr = c - sprung_diff; if (a == 0.0 && b == 0.0 && c == 0.0) break; PlotWindow.addFrequenz(a); PlotWindow.addY(c_korr); /* Unter c_alt speichern wir den vorherigen Wert von c ab. */ c_alt = c; In.close(); PlotWindow.plotChart();
Technische Informatik für Ingenieure Seite 6(8) Ergebnis: Aufgabe 3: (Resonanzen finden) Der Frequenzgang weist charakteristischen Frequenzen auf, die d wie folgt definiert sind: s Resonanzfrequenzen, x/u wird lokal maximal: arg(x/u) fällt unter -90 - Antiresonanzfrequenzen, x/u wird lokal minimal: arg(x/u) steigt über -90 Ermitteln Sie die Resonanz- und Antiresonanzfrequenzen mit einem geeigneten Algorithmus. Hinweis: Die ermittelten Frequenzen sind abhängig von der verwendeten Definition leicht unterschiedlich. Lösung: package de.uni_paderborn.hni.tifi; public class Blatt8_Aufgabe3 public static void main(string[] args) In.open("c:\\xu_50. 10.5000Hz.w_l"); if (!In.done()) /* Fehlerbehandlung */ System.out.println("Datei nichtt gefunden.");
Technische Informatik für Ingenieure Seite 7(8) return; /* Wir können in der Schleife nicht auf * die Werte, die künftig gelesen werden, * zugreifen. Daher schauen wir uns die * Werte, die in den letzten zwei Durchlaufen * der Schleife gelesen worden sind. * * Im Fokus steht also nicht der * Wert von b, sonder von b_alt. Für * diesen wird überprüft, ob die * entsprechende Bedingung (b ist lokal * maximal bzw. b ist lokal minimal) * erfüllt ist. */ double b_alt = 0.0; double b_alt_alt = 0.0; /* Da wir uns b_alt anschauen, liegt * es nahe auch den zugehörigen Wert * c_alt zu betrachten, wenn die * Erfüllung der zweiten Bedingung * überprüft wird. */ double c_alt = 0.0; for (int i = 0; ;i++) double a = In.readDouble(); double b = In.readDouble(); double c = In.readDouble(); if (i > 1) /* Resonanzfrequenz */ if (b_alt > b_alt_alt && b_alt > b) /* b_alt ist lokal maximal, die zweite Bedingung wird überprüft */ if (c_alt < 90.0) System.out.println("Frequenz " + a + " ist eine Resonanzfrequenz."); /* Antiresonanzfrequenz */ if (b_alt < b_alt_alt && b_alt < b) /* b_alt ist lokal minimal, die zweite Bedingung wird überprüft */ if (c_alt > -90.0) System.out.println("Frequenz " + a + " ist eine Antiresonanzfrequenz."); /* Falls folgendes gilt, verlassen wir die Schleife */ if (a == 0.0 && b == 0.0 && c == 0.0) break;
Technische Informatik für Ingenieure Seite 8(8) b_alt_alt = b_alt; b_alt = b; c_alt = c; In.close();