Mittelwert einer beliebigen Funktion
-
Hallo,
ich möchte eigentlich nur einen Mittelwert einer Funktion ausgeben. Allerdings soll der Mittelwert innerhalb eines Zeitfensters bestimmt werden.
Die mathematische Funktion die das letztendlich tut lautet:
(IntegralBisZeitpunkt_2 - IntegralBisZeitpunkt_1) / ( Zeitpkt_Ende - Zeitpkt_Beginn )
Das Simulationsprogramm arbeitet ja diskontinuierlich, d.h zu bestimmten Zeitpunkten werden Werte bestimmt, daher meine Frage: geht sowas als Bedingung:
if (S->t == Zeitpkt_Ende) /* S->t ist die Simulationszeit */
Der gesamte Quelltxt:
class AverageFunctionValue { /*-----------------------------------------------------------------------*/ /* Eingang = Funktion und Ausgang = Mittelwert */ /* nach Formel Mittelwert = 1/(t_2 - t_1) int(Eingang)dt ; */ /* Integral geht von t_1 bis nach t_2 */ /* Man sucht sich einen Zeitraum (t1 bis t2) aus indem man den Mittelwert berechnen will */ /*-----------------------------------------------------------------------*/ public: // Parameter // HilfsParameter char* ElementName; char* ParameterName; LDOUBLE IntegralBisZeitpunkt_1; LDOUBLE IntegralBisZeitpunkt_2; LDOUBLE Zeitpkt_Beginn; LDOUBLE Zeitpkt_Ende; // Variablen LDOUBLE *Eingangs_Funktion; LDOUBLE *IntegrierterEingang; LDOUBLE *Drehzahl; LDOUBLE *Winkel_Beginn; LDOUBLE *Winkel_Ende; // HilfsFunktion void HilfsFunktion (SIMSTRUCT* S) { } // ExitFunktion void ExitFunktion (SIMSTRUCT* S) { } // Funktionen // IntegrierterEingang LDOUBLE IntegrierterEingangPunkt (SIMSTRUCT* S) { return (*Eingangs_Funktion); } // Average_Function_Value algebra LDOUBLE Average_Function_Value (SIMSTRUCT* S) { Zeitpkt_Beginn = *Winkel_Beginn / (*Drehzahl * 2 * M_PI); Zeitpkt_Ende = *Winkel_Ende / (*Drehzahl * 2 * M_PI); if (S->t == Zeitpkt_Beginn ) { IntegralBisZeitpunkt_1 = *IntegrierterEingang; } if (S->t == Zeitpkt_Ende) { IntegralBisZeitpunkt_2 = *IntegrierterEingang; } if (S->t > Zeitpkt_Ende ) { return ((IntegralBisZeitpunkt_2 - IntegralBisZeitpunkt_1) / ( Zeitpkt_Ende - Zeitpkt_Beginn ) ); } else { return (0); } } }; // End~Edit durch Arcoth: Code-Tags.~
-
Du fragst jetzt, ob man in C++ zwei Werte vergleichen kann? Äh, ja.
-
- Ich besser auf >= prüfen
- Warum sind das bei dir so viele Zeiger (Zeilen 23-26)?
-
DocShoe schrieb:
- Warum sind das bei dir so viele Zeiger (Zeilen 23-26)?
Das sieht aus wie das C++ Interface von Matlab Simulink (da ist das leider normal).
@DonPate: Für Mittelwert gibts da aber schon nen fertigen Block. Die Zeitabfrage kannst du ja auch mit Simulink Blöcken machen, da würde ich nicht extra ein C++ file darum bemühen (wenn der Mittelwert in einem bestimmten Bereich wirklich alles ist was du willst).
-
Danke.
Nein, es ist kein Matlab/Simulink sondern ein anderes Simulationsprogramm.
1. Frage: Kann man sich bei Simulink den C++ Quellcode des "Mean" Bauteils ansehen ? Wie ?[Die Variablen (Zeiger) sind Eingänge in das Bauteil (abgesehen von *IntegrierterEingang)].
Natürlich kann man vergleichen, aber die Frage ist doch:
Im Simulationsprogramm werden nur diskrete Zeitwerte betrachtet.
D.h. nicht alle Zeitwerte sind vorhanden.
Was macht das Programm wenn manSimulationtime == IrgendeinWert
setzt, wobei beispielsweise die Simulationtime nie IrgendeinWert ist. ZB:
Simulationtime geht folgendermaßen:
0 sec
0.1 sec
0.2 sec
usw.Aber IrgendweinWert = 0.15 sec.
Das war eigentlich das einzige was noch falsch sein könnte, sonst müsste es funktionieren.
-
DonPate schrieb:
1. Frage: Kann man sich bei Simulink den C++ Quellcode des "Mean" Bauteils ansehen ? Wie ?
Nicht das ich wüsste.
DonPate schrieb:
Natürlich kann man vergleichen, aber die Frage ist doch:
Im Simulationsprogramm werden nur diskrete Zeitwerte betrachtet.
D.h. nicht alle Zeitwerte sind vorhanden.
Was macht das Programm wenn manSimulationtime == IrgendeinWert
setzt, wobei beispielsweise die Simulationtime nie IrgendeinWert ist. ZB:
Simulationtime geht folgendermaßen:
0 sec
0.1 sec
0.2 sec
usw.Aber IrgendweinWert = 0.15 sec.
Naja, da hast du mehrere Möglichkeiten. Entweder "Zero-Order Hold", also den Wert des vorherigen Zeitschritts. Bei dir wäre der Wert bei 0.15 sec dann der selbe wie bei 0.1 sec.
Oder durch halt durch Interpolation, hier zwischen den Werten 0.1 und 0.2 an der Stelle 0.15.
Matlab bzw. Simulink benutzt oft eine Heuristik welche entscheidet welche der beiden Methoden verwendet wird: Ist die Kurve "glatt" also näherungsweise differenzierbar, wird Interpolation verwendet. Enthält die Kurve Sprünge, wird Zero-Order Hold verwendet.
Leider wird auf die Heuristik in der Dokumentation nicht weiter eingegangen, wie das also im Detail abläuft kann ich dir nicht sagen. Mit Zero-Order hold solltest du aber gut fahren, auch bei kontinuierlichen Signalen.