0 Daumen
454 Aufrufe

Aufgabe:

Die Erfassung von Messwerten ist oft mit Störsignalen, Oberwellen oder Grundschwingungen
beaufschlagt. Eine wichtige Teilaufgabe besteht darin, die lokalen Minima (Extremwerte) in
einem solchen Signal zu ermitteln. Gehen Sie davon aus, dass Sie Teil eines größeren Entwicklungsteams sind und hier eine bestimmte Teilaufgabe zu lösen haben. Die Signalerfassung und
weitere Verarbeitung wird durch andere Teammitglieder realisiert.

blob.png

Text erkannt:

whoman
whunnm

Ihre Teilaufgabe wird durch die Festlegung einer verbindlichen Schnittstelle (Funktionssignatur)
gekapselt. Die von Ihnen zu entwickelnde Funktion wird als digitaler Filter in einem großen und
unter Umständen sehr schnellen kontinuierlichen Datenstrom bei jedem einzelnen gemessenen
Wert aufgerufen. Sie haben keinen Zugriff auf den gesamten Datenstrom, sondern immer nur
auf den letzten gemessenen Wert. Für die Realisierung solcher Teilaufgaben werden oft Rahmenanwendungen mit Testklassen zur Verfügung gestellt. Die Abbildung zeigt das Ergebnis der
Lösung.
Entwickeln Sie eine Funktion zur Ermittlung der Minima mit folgender Signatur:

bool detectPoint(double value)
{
bool localMinimumDetected = false;
// Markiere jedes erkannte Minimum.

return localMinimumDetected;
}



Problem/Ansatz:

Hallo zusammen, ich habe schon sämtliche Foren durchforstet, leider komme ich bei meiner Aufgabe nicht weiter.


Ich habe den folgen Code als Ansatz entwickelt:

bool localMinimumDetected = false;
{
static double previous = 0;
if ( previous - value <= 0) {
(previous = value);
return true;
} else {
return localMinimumDetected;
}
}


Ich stehe hier komplett auf dem Schlauch und bekomme es nicht hin die lokalen Minima anzeigen zu lassen. Als Ergebnis kommt dann immer so etwas wie im Bild: blob.png

Ich habe auch schon versucht in der Zeile "if ( previous - value <= 0)" andere Werte einzusetzen, was zwar das angezeigte Bild ändert aber trotzdem nicht die Lösung meiner Aufgabe darstellt.


Über Hilfe würde ich mich sehr freuen

Beste Grüße



Text erkannt:

wampun

Avatar von

1 Antwort

0 Daumen
 
Beste Antwort

Falls der aktuelle Wert mindestens so groß wie der vorherige ist und der vorherige höchstens so groß wie der vorvorherige ist, dann gib true zurück, ansonsten gib false zurück.

Avatar von 5,7 k

Hi oswald, vielen Dank für deine schnelle Hilfe :);


ich weiß noch nicht richtig, wie ich die die vorherigen und vorvorherigen Werte initialisieren soll... woher weiß das Programm, welchen Wert ich meine?


Ich habe den Code jetzt umgebaut:

bool localMinimumDetected=false;
{
static double previous;
static double next;
static double preprevious;
if (value >= previous <= preprevious )
{
return true; }
else { return false;}
return localMinimumDetected=false;}
Dieser liefert mir leider keine lokale Minima..

blob.png

Text erkannt:

whomunv

Vielleicht kannst du mir ja nochmal weiterhelfen :)


Vielen Dank schonmal

ich weiß noch nicht richtig, wie ich die die vorherigen und vorvorherigen Werte initialisieren soll

Da du Minima suchst, könntest du mit DBL_MAX aus float.h. initialisieren.

value >= previous <= preprevious

Das versteht C nicht so wie du es verstehst. Du musst die Bedingungen einzeln prüfen:

      value >= previous && previous <= preprevious

Außerdem fehlt noch, die Werte von previous, next und preprevious anzupassen. Übrigens ist current ein besser geeigneter Variablenname als next.

Vielen Dank nochmal, das bringt mich nochmal weiter.

Ich weiß leider noch nicht, wie ich dem Programm erkläre, dass z.B. previous der vorherige Wert von value ist usw. Denn die Werte für value werden nach meinem Verständnis durch das gegebene Programm eingespielt. Es handelt sich hierbei um eine Funktionssignatur, die immer weiter läuft, ist leider als Screenshot schwer darstellbar.


Ich würde mich über erneute Antwort echt mega freuen :)

preprevious = previous;
previous = current;
current = value;

Dann prüfen.

Damit erwischst du nicht das eigentliche Minimum, sondern den Wert nach dem Minimum. Besser geht's aber mit der vorgegebenen Signatur nicht.

Vielen Vielen Dank. Ich habe mich echt schwer getan.... Danke für deine Hilfe, du hast mich gerettet. Ich habe den Code noch etwas umgeschrieben und bin auf das Ergebnis gekommen:

bool localMinimumDetected = false;
{
static double previous;
static double preprevious;
static double current;
  preprevious = previous;
previous = current;
current = value;
if (previous < preprevious && previous < current )
{
return true;  }
else {
return localMinimumDetected;} }


blob.png

Text erkannt:

mownom
MMMMM

Es sieht so aus, als ob das Programm auch andere Werte erkennt, aber dort sind wohl kleine Schwankungen in den Werten vorhanden, welche ich mit meinen Augen nicht sehen kann.

Du hast die statischen Variablen nicht initialisiert.

Du solltest mit ≤ vergleichen. Mathematisch betrachtet hat zum Beispiel die konstante Funktion \(f(x) = \frac{355}{113}\) an jeder Stelle ein lokales Minimum. Das würde dein Programm nicht erkennen.

Bei Minima true zurückzugeben und ansonsten localMinimumDetected ist unintuitiv. Entweder du passt den Wert der Variablen localMinimumDetected entsprechend an und lieferst diesen zurück:

if (previous <= preprevious && previous <= current)
{
localMinimumDetected = true;
}
return localMinimumDetected;

oder lieferst true oder false zurück:

if (previous <= preprevious && previous <= current)
{
return true;
} else {
return false;
}

Ein Mischmasch der beiden Herangehensweisen ist komisch.

Argument für ersteres ist, dass einige Leute behaupten, eine Funktion sollte nur eine einzige return-Anweisung haben. Das bekommst du aber auch zum Beispiel mit

return previous <= preprevious && previous <= current;

hin.

Die geschweiften Klammern um static double previous; ... brauchst du nicht.

#include <float.h>

bool detectPoint(double value)
{
static double previous = DBL_MAX;
static double preprevious = DBL_MAX;
static double current = DBL_MAX;

preprevious = previous;
previous = current;
current = value;

return previous <= preprevious && previous <= current;
}

Super, vielen Dank für die Hinweise, ich werde sie in meine Lösung einfließen lassen. Dankeschön nochmal, ohne deine Hilfe wäre ich nicht vorangekommen:)

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community