Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MeanValue(Mittelwert)Bereich Überprüfen (https://www.delphipraxis.net/53938-meanvalue-mittelwert-bereich-ueberpruefen.html)

DJAYS 25. Sep 2005 21:02


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

GuenterS 25. Sep 2005 21:21

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;

marabu 25. Sep 2005 21:40

Re: MeanValue(Mittelwert)Bereich Überprüfen
 
Hi,

mit Toleranz ist wohl die Kopplung der Abweichungen gemeint:

Delphi-Quellcode:
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;
Grüße vom marabu

himitsu 25. Sep 2005 21:45

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:
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
und zusammen ergibt das dann
Delphi-Quellcode:
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
"(lLow < lHigh) and" kannst du auch weglassen ... ist ja nur da, um sicherzugehen, das High auch wirklich größer als Low ist ...

DJAYS 25. Sep 2005 22:10

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?

marabu 25. Sep 2005 22:38

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:
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;
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:

Delphi-Quellcode:
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;
marabu

DJAYS 25. Sep 2005 23:30

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

marabu 26. Sep 2005 05:40

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

DJAYS 26. Sep 2005 09:11

Re: MeanValue(Mittelwert)Bereich Überprüfen
 
Hi Marabu,
danke.d.h Dev und delta bei dir sind gleich?

Der_Unwissende 26. Sep 2005 09:49

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 03:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz