![]() |
MeanValue(Mittelwert)Bereich Überprüfen
Hallo nette Leute,
ich hätte noch eine Frage zum Mittelwert.Ich schreibe ein Programm,dass elektronishe Messwerte von einer Leiterplatte messen soll, dabei soll die Mittelwerte Low und High berechnen werden,die habe ich schon,aber diese MittelWerte muss ich überprüfen,ob sie in einem bestimmten Bereich liegen.Also MeanValue(LOW) soll im Bereich sagen wir 400H+-80H(also 400H plus-minus 80H) und MeanValue(HIGH) soll im Bereich sagen wir B00H+-80H(also B00H plus-minus 80H) liegen müssen,sonst Fehlermeldung "Out of Range".Der Abstand zwischen B00H plus-minus 80H und 400H plus-minus 80H soll die Toleranz 80 nicht überschreiten,sonst ERROR.Siehe skizze unten: MeanHi:------------ B00H+- 80 | | Toleranz 80 | MeanLo:----------- 400H+-80 wie schreibt man eigentlich plus-minus zeichen im Delphi?Kann JEMAND mir helfen?es ist wirklich dringend für mich und bin Anfänger hier. thx im Voraus DJAYS |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Wenn Du meinst schreiben im Sinne einer if abfrage im Quellcode würd ich mal sagen gar nicht. Da musst du zwei if abfragen kombinieren in etwa so
Delphi-Quellcode:
lToleranz := 80; lMin := 100; lMax := 200; lResult := 0; if ( (lValue - lToleranz) < lMin) or ((lValue + lToleranz) > lMax) ) then lResult := 1; //Out of Range if ((lMax - lMin) < lToleranz) then lResult := 2; //Error case lResult of 0: //kein Fehler 1: //out of Range 2: //Error end; |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Hi,
mit Toleranz ist wohl die Kopplung der Abweichungen gemeint:
Delphi-Quellcode:
Grüße vom marabu
function CheckDelta(hiMean, hiNorm, loMean, loNorm, delta: cardinal): boolean;
var hiDev, loDev: integer; begin hiDev := hiMean - hiNorm; loDev := loMean - loNorm; Result := (Abs(hiDev) <= delta) and (Abs(loDev) <= delta) and (Abs(hiDev - loDev) <= delta); end; |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Ich sag auch nochmal kurz was dazu ...
Delphi selber kennt kein Plus/Minus. Also, A in B±C entsprich dann (A >= B - C) or (a <= B + C) , vorausgesetzt C ist im positiven Bereich, oder 0, oder man sorgt dafür, daß C immer Positiv ist (z.B. mit ABS). Nun aber zu deinem Problem:
Delphi-Quellcode:
und zusammen ergibt das dann
Var MeanValue, lHigh, lLow, lToleranz: Irgendwas;
If (MeanValue >= lLow - ABS(lToleranz)) and (MeanValue <= lLow + ABS(lToleranz)) Then // MeanValue ist im Low-Bereich If (MeanValue >= lHigh - ABS(lToleranz)) and (MeanValue <= lHigh + ABS(lToleranz)) Then // MeanValue ist im High-Bereich If (lHigh - ABS(lToleranz)) - (lLow + ABS(lToleranz) <= lToleranz Then // High/Low-Abstand kleiner/gleich lToleranz
Delphi-Quellcode:
"(lLow < lHigh) and" kannst du auch weglassen ... ist ja nur da, um sicherzugehen, das High auch wirklich größer als Low ist ...
If (lLow < lHigh)
and (((MeanValue >= lLow - ABS(lToleranz)) and (MeanValue <= lLow + ABS(lToleranz))) or ((MeanValue >= lHigh - ABS(lToleranz)) and (MeanValue <= lHigh + ABS(lToleranz)))) and (lHigh - lLow <= 3 * ABS(lToleranz)) Then // alles OK |
Re: MeanValue(Mittelwert)Bereich Überprüfen
hallo leute,
danke,so sieht meine Fkt zum berechnen vom Mittelwert aus: [code]function CalcMeanValue (aData: Array of Word; // Type muss mit Deklaration übereinstimmen uiArraySize: Integer; // Anzahl der Elemente des Arrays uiStartIdx: Integer; // Startindex der Berechnung uiEndIdx : Integer): Word ; // Endindex der Berechnung var i,a : Integer; // Index uiMeanVal : Word; // Zwischenergebnis MeanWert,ui=unsigned integer sum : DWord; begin sum := 0; a := 0; uiMeanVal := $000 ; // entspricht 16bit meanwert for i := uiStartIdx to uiEndIdx do begin inc(a); sum := sum + aData[i];// Messwerte aufaddieren end; if a > 1 then uiMeanVal := Round(sum/a) else uiMeanVal := 0; // Mittelwert; result := uiMeanVal; // entspricht return(uiMeanVal) end; kann ich diese Quellcodes,die ihr mich anbietet,in dieser Funktion einbinden?oder andere Fkt schreiben?Was bedeutet diese lMin,lToleranz oder l,Norm,Delta?ist Dev StdDev? |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Hi,
ich konnte deine Funktion so schlecht lesen, da habe ich sie nochmal bei mir eingetippt - das kam dabei raus:
Delphi-Quellcode:
dev steht bei mir für deviation ($80) und nicht für standard deviation. hiMean und loMean sind die Werte, die du mit deiner Funktion errechnest. hiNorm ist $B00 und loNorm ist $400. Meine Funktion CheckDelta() kannst du schlecht in deine CalcMeanValue() einbauen, sie baut doch auf deiner Funktion auf:
function CalcMeanValue(aData: Array of Word): Word;
var i: Integer; sum: DWord; begin sum := 0; // Messwerte aufaddieren for i := Low(aData) to High(aData) do sum := sum + aData[i]; // Mittelwert berechnen if Length(aData) = 0 then Result := 0 else Result := Round(sum / Length(aData)); end;
Delphi-Quellcode:
marabu
var
hiMean, loMean: Word; begin hiMean := CalcMeanValue(aHighValues); loMean := CalcMeanValue(aLowValues); if CheckDelta(hiMean, $B00, loMean, $400, $80) then ShowMessage('hooray') else ShowMessage('sob'); end; |
Re: MeanValue(Mittelwert)Bereich Überprüfen
hi Marabu,danke für die Verbesserung meine fkt.was bedeutet diese delta oder wofür ist es in deiner Fkt CheckDelta?
thx |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Hi DJAYS,
der Parameter delta ist in meinem Beispielaufruf mit $80 angegeben. Erkennst du denn deine maximal erlaubte Abweichung nicht wieder? marabu |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Hi Marabu,
danke.d.h Dev und delta bei dir sind gleich? |
Re: MeanValue(Mittelwert)Bereich Überprüfen
Hi,
zum berechnen des Mittelwertes kann ich dir zu der Funktion Mean (Unit Math denke ich) raten. Erwartet ein Array of Double und gibt dir ein Extended zurück. Musst du zwar entsprechend das Ergebnis wieder casten aber die Funktion nutzt echt gut die ALU und ist damit verdammt schnell (auch bei sehr großen Arrays). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz