Maximalwert berechnen
-
Hallo,
ich möchte den Maximalwert einer Funktion bestimmen. Der Eingang ist die Funktion, die sich über der Zeit verändert, der Ausgang soll der maximale Wert innerhalb eines Zeitfensters sein. Aus irgendeinem Grund wird nicht der maximale Wert angegeben, manchmal ist das Ergebnis nah am maximalen Wert und manchmal ist es völlig falsch.
class Max { public: // Parameter LDOUBLE Simulationtime; // HilfsParameter char* ElementName; char* ParameterName; LDOUBLE Maximalwert; // Variablen LDOUBLE *Eingang; LDOUBLE *Drehzahl; LDOUBLE *Winkel_Beginn; LDOUBLE *Winkel_Ende; // HilfsFunktion void HilfsFunktion (SIMSTRUCT* S) { Maximalwert = 0; } // ExitFunktion void ExitFunktion (SIMSTRUCT* S) { } // Funktionen // Zeitpkt_Beginn algebra LDOUBLE Zeitpkt_Beginn (SIMSTRUCT* S) { return ( *Winkel_Beginn / (*Drehzahl * 2 * M_PI) ); } // Zeitpkt_Ende algebra LDOUBLE Zeitpkt_Ende (SIMSTRUCT* S) { return (*Winkel_Ende / (*Drehzahl * 2 * M_PI)); } // Maximum algebra LDOUBLE Maximum (SIMSTRUCT* S) { Simulationtime = S->t; if ( Simulationtime < Zeitpkt_Beginn(S)) { Maximalwert = *Eingang; return (*Eingang); } if ( (Simulationtime >= Zeitpkt_Beginn(S)) && (Simulationtime <= Zeitpkt_Ende(S)) ) { if ( (*Eingang - Maximalwert) <= 0) { return (Maximalwert); } else { Maximalwert = *Eingang; return (Maximalwert); } } else { return (Maximalwert); } } }; // End
-
Vorschau war schon zuviel Aufwand oder ist Dein Code schon so schlampig formatiert?
Mache Deine member privat und beseitige die Seiteneffekte.
Mehr sieht man nicht.
-
Tut mir leid, aber das ist totaler Müll.
-Ich find's nicht gut, eine Klasse für Maximumsberechnungen zu schreiben. Eine Maximumsberechnung ist eine typische Aufgabe für eine Funktion. Hier gäbe es die Ausrede, dass man als Anfänger vielleicht nicht weiß, dass man auch Funktionen an Funktionen übergeben kann, aber du machst ja genau das (wenn auch schlecht!), daher kann die Ausrede nicht gelten. Oder man kann einwenden, dass das nicht mehr funktioniert, sobald die Funktion eben nicht einfach á la f(x) zu berechnen ist. Aber auch das ist hier anscheinend nicht der Fall.
-Die Maximumsberechnung sollte unabhängig von dem sein, worauf sie arbeitet. Deine Methode macht ewig viele Annahmen über die Art der Funktion, die hier bearbeitet werden soll.
-Benutz keine Pointer, wenn du sie nicht verstehst! Und wenn du Pointer verstehst, dann würdest du sie nicht so benutzen. Alles in deinem Code, wo irgendwie ein Sternchen vorkommt, ist komplett falsch. Das Programm sollte eigentlich sofort abstürzen.
-Du machst lokale Variablen unnötigerweise zu globalen Variablen deiner Klasse. Du scheinst auch komplett den Überblick verloren zu haben, welche deiner Variablen wofür da ist oder wo sie welchen Wert haben.Komplett wegschmeißen!
Eine Funktion, die das Maximum einer Funktion über ein Intervall berechnet:
template <typename FunctionType, typename ArgType, typename DifferenceType> auto function_max(FunctionType function, ArgType begin, ArgType end, DifferenceType increase) -> decltype(function(begin)) { auto max = function(begin); if (begin != end) for(begin += increase; begin <= end; begin += increase) { auto value = function(begin); if (value > max) max = value; } return max; } #include <iostream> double demo_function(double d) { return -d*d*d+3*d*d+2*d-6; } int main() { std::cout << function_max(demo_function, 0., 3.14, 0.1) << '\n'; }
Oder wenn's unbedingt als Klasse sein soll:
template <typename ValueType> class MaxCalculator { bool initialized; ValueType max; public: MaxCalculator(): initialized(false) { } const ValueType& operator()(const ValueType& val) { if (initialized) { if(val > max) max = val; } else { max = val; initialized = true; } return max; } const ValueType& get_max() const { return max; } }; #include <iostream> double demo_function(double d) { return -d*d*d+3*d*d+2*d-6; } int main() { MaxCalculator<double> max; for (double d = 0; d <= 3.14; d+= 0.1) max(demo_function(d)); std::cout << max.get_max() << '\n'; }
Wie du siehst:
-Beide wesentlich kürzer als dein Code
-Beiden ist vollkommen egal, woher die Werte kommen
-Keine Pointer!
-
Das Programm stürzt nicht ab.
Jedes Bauteil ist nun mal eine Klasse in diesem Simulationsprogramm. Die Variablen sind die Eingänge in das Bauteil.
Auf diese Art & Weise wird jedes Bauteil programmiert (User Manual).
-
DonPate schrieb:
Das Programm stürzt nicht ab.
Das kann nicht sein. Entweder ist der Code, den du uns zeigst unvollständig oder nicht der, den du benutzt. Prinzipiell ist es zwar undefiniertes Verhalten, das du hier erzeugst, aber Systeme die beim Dereferenzieren uninitialisierter Zeiger nicht abstürzen sind eher exotisch.
-
SeppJ schrieb:
DonPate schrieb:
Das Programm stürzt nicht ab.
Das kann nicht sein. Entweder ist der Code, den du uns zeigst unvollständig oder nicht der, den du benutzt. Prinzipiell ist es zwar undefiniertes Verhalten, das du hier erzeugst, aber Systeme die beim Dereferenzieren uninitialisierter Zeiger nicht abstürzen sind eher exotisch.
Alle seine Member sind public. Wir wissen nichts darüber, was andere Funktionen damit machen. Daher ist jede weitere Analyse seines Codes Kaffeesatzleserei.
Mfg Martin