Thema: Delphi Gewichteter Mittelwert

Einzelnen Beitrag anzeigen

Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#3

Re: Gewichteter Mittelwert

  Alt 1. Nov 2006, 12:56
Hallo ipb:
Ich habe mir Deine Antwort genau angesehen und versucht umzusetzen. Ich glaube, es müsste die Lösung sein:
Delphi-Quellcode:
  //Gewichteter Mittelwert:
  for i:=5 to 20 do
      begin
      for x:=i-4 to i do
          begin
          n:=1; //Darauf muss man erst mal kommen
          n:=n*i; // nenner:=nenner+GEW[i]
          GMW[i]:=GMW[i]+(Zahlen[X]/5)*n;//zaehler:=zaehler+Zahlen[i]*GEW[i]
          end;
      end;
      //mittel:=zaehler/nenner
      for x:=5 to 20 do
         GMW[x]:=GMW[x]/n;
Ich fange mit den Gewichten bei 1 an und höre am Schluss mit 20 auf. Verwundert war ich, dass der erste Wert bei 2,72 steht. Dass der letzte Wert bei 15,35, wie bei dem Mittelwert (auf fünf Werte) lautet, scheint wohl zu bestätigen, dass die Lösung stimmt.

Hier die Liste der Ergebnisse:
Zitat:
Zahlen MW5 GWM
...
10,96 10,87 2,72 //Erster Wert, recht niedrig
11,55 11,1 3,33
... Liste gekürzt. Nachfolgend die letzten beiden Werte 19 und 20:
15,5 14,81 14,07
16,67 15,35 15,35 //Scheint zu stimmen: MW(5) entspricht GMW

Interessant für meine Zwecke finde ich auch bei Deiner Lösung, die Gewichte in einem Array zu verlegen und damit unterschiedliche Gewichtungen in Abhängigkeit "anderer Umstände" zu tätigen.

Vielen Dank ibp, damit ist wohl mein Problem gelöst.
Nachtrag:
  • Falls jemand eine elegantere Lösung oder auch schnellere Lösung hat, die auf meinen Code basiert, dann nur her damit.
  • Kann jemand bestätigen, dass es so richtig ist, und der niedrige Wert 2,72 nur durch die "niedrige" Gewichtung, nämlich 1 resultiert? Ich habe statt i x verwendet: Die Zahlen klaffen weiterhin stark auseinander (was ich nicht erwartet hatte).
Nochmal der Code mit der "Lösung" von ibp:
Delphi-Quellcode:
program Project2000;
{$APPTYPE CONSOLE}
uses
  SysUtils;
Var
  Zahlen :Array[1..20] of Real; //Basiswerte
  MW :Array[1..20] of Real; //Mittelwert
  GMW :Array[1..20] of Real; //Gewichteter Mittelwert
  i,x,n :Integer;
  f :TextFile;
  begin
//Zahlen zuweisen:
  Zahlen[1]:=10.42;
  Zahlen[2]:=11.10;
  Zahlen[3]:=10.83;
  Zahlen[4]:=11.05;
  Zahlen[5]:=10.96;
  Zahlen[6]:=11.55;
  Zahlen[7]:=11.98;
  Zahlen[8]:=12.05;
  Zahlen[9]:=12.50;
  Zahlen[10]:=12.67;
  Zahlen[11]:=13.42;
  Zahlen[12]:=14.10;
  Zahlen[13]:=13.83;
  Zahlen[14]:=14.05;
  Zahlen[15]:=13.96;
  Zahlen[16]:=14.55;
  Zahlen[17]:=14.98;
  Zahlen[18]:=15.05;
  Zahlen[19]:=15.50;
  Zahlen[20]:=16.67;

  //Mittelwert zuweisen (5 Werte)
  for i:=5 to 20 do
      begin
      for x:=i-4 to i do MW[i]:=MW[i]+zahlen[X]/5;
      end;

  //Gewichteter Mittelwert:
  for i:=5 to 20 do
      begin
      for x:=i-4 to i do
          begin
          n:=1;
          n:=n*i;
          GMW[i]:=GMW[i]+(Zahlen[X]/5)*n;
          end;
      end;
      for x:=5 to 20 do
         GMW[x]:=GMW[x]/n;

// Nachfolgender Code nur für die Bildschirmdarstellung
// und Speicherung der Daten Excel kompatibel

// ### Speicherung Daten
//In Datei für Excel mit Komma als Trenner schreiben, damit ist ein Diagramm möglich
assignfile(f,'C:\Gewichte.csv');
Rewrite(f);
for i:=1 to 20 do
     Writeln(f,zahlen[i]:0:2,',',MW[i]:0:2,',',GMW[i]:0:2);
CloseFile(f);
// ### Speicherung Ende

// ### Screen
//.. und auf den Screen natürlich
Writeln('Testprogramm: Gew. Mittelwert');
Writeln;
Writeln('Zahlen MW GMW');
Writeln;
for i:=1 to 20 do
     Writeln(zahlen[i]:0:2,' ',MW[i]:6:2,' ',GMW[i]:6:2);
Writeln;
// ### Screen Ende

// ### ENDE
Writeln('Fertig - Programm beenden: [Enter]');Readln;
end.
Beste Grüße!
Go2EITS
  Mit Zitat antworten Zitat