Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Standardabweichung berechnen? (https://www.delphipraxis.net/167470-standardabweichung-berechnen.html)

mat72 31. Mär 2012 13:21

Delphi-Version: 5

Standardabweichung berechnen?
 
Hallo,
ich wollte die Standardabweichung von 8 eingegebenen Zahlen berechnen, aber irgendwie komme ich zu keinem brauchbaren Ergebnis.
Die Zahlen bekomme ich über ein Textfeld, welches ich in eine Zahl umwandel. Die Formel die ich für die Standardabweichung benutze ist
Delphi-Quellcode:
x:=sqrt((1/8)*(((x1-ave_x)*(x1-ave_x))+((x2-ave_x)*(x2-ave_x))+((x3-ave_x)*(x3-ave_x))+((x4-ave_x)*(x4-ave_x))+((x5-ave_x)*(x5-ave_x))+((x6-ave_x)*(x6-ave_x))+((x7-ave_x)*(x7-ave_x))+((x8-ave_x)*(x8-ave_x))))
ist die Formel richtig?
Wenn ich meine Berechnung mit Excel vergleiche, ist mein Wert immer größer.
Vielen Dank für eure Hilfe.
Gruß
Mat

guinnes 31. Mär 2012 14:58

AW: Standardabweichung berechnen?
 
Warum benutzt du nicht die fertige Function StdDev aus der Unit Math ?

mat72 31. Mär 2012 18:24

AW: Standardabweichung berechnen?
 
Wenn ich die Funktion StdDev verwende , bekomme ich die Meldung
[Fehler] globallevelingacc.pas(426): Inkompatible Typen: 'Array' und 'Extended'
Gibt es da eine Moeglichkeit, die Funktion zu nutzen, trotz Deklaration als Extended.

Peter1999 31. Mär 2012 18:36

AW: Standardabweichung berechnen?
 
Bei einem Freiwert (Mittelwert) steht da 1/(n-1) --> 1/7

DeddyH 31. Mär 2012 18:36

AW: Standardabweichung berechnen?
 
Das sind jetzt "viel zu viele" Infos, als dass wir damit etwas anfangen könnten :?.

mat72 31. Mär 2012 18:48

AW: Standardabweichung berechnen?
 
Hallo,
ich lese jede Zahl via Textfeld ein und wandele sie mit StrToFloat in eine Zahl um.
Im Anhang mein Programm.
Delphi-Quellcode:
unit globallevelingacc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, jpeg, ExtCtrls, shellapi, math;

type
  TForm11 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    MainMenu2: TMenuItem;
    Help1: TMenuItem;
    Exit1: TMenuItem;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Button1: TButton;
    Label30: TLabel;
    Label31: TLabel;
    Label32: TLabel;
    Label33: TLabel;
    Button5: TButton;
    Label34: TLabel;
    procedure Exit1Click(Sender: TObject);
    procedure Help1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit3Exit(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit4Exit(Sender: TObject);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
    procedure Edit5Exit(Sender: TObject);
    procedure Edit5KeyPress(Sender: TObject; var Key: Char);
    procedure Edit6Exit(Sender: TObject);
    procedure Edit6KeyPress(Sender: TObject; var Key: Char);
    procedure Edit7Exit(Sender: TObject);
    procedure Edit7KeyPress(Sender: TObject; var Key: Char);
    procedure Edit8Exit(Sender: TObject);
    procedure Edit8KeyPress(Sender: TObject; var Key: Char);
    procedure Edit9Exit(Sender: TObject);
    procedure Edit9KeyPress(Sender: TObject; var Key: Char);
    procedure Edit10Exit(Sender: TObject);
    procedure Edit10KeyPress(Sender: TObject; var Key: Char);
    procedure Edit11Exit(Sender: TObject);
    procedure Edit11KeyPress(Sender: TObject; var Key: Char);
    procedure Edit12Exit(Sender: TObject);
    procedure Edit12KeyPress(Sender: TObject; var Key: Char);
    procedure Edit13Exit(Sender: TObject);
    procedure Edit13KeyPress(Sender: TObject; var Key: Char);
    procedure Edit14Exit(Sender: TObject);
    procedure Edit14KeyPress(Sender: TObject; var Key: Char);
    procedure Edit15Exit(Sender: TObject);
    procedure Edit15KeyPress(Sender: TObject; var Key: Char);
    procedure Edit16Exit(Sender: TObject);
    procedure Edit16KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form11: TForm11;
  x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,ave_x,ave_y,x,y :extended;
implementation

{$R *.dfm}

procedure TForm11.Exit1Click(Sender: TObject);
begin
close();
end;

procedure TForm11.Help1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', '.\help\GlobalLevelingAccuracy.html', nil, nil, SW_SHOW); //hier wird die Hilfe aufgerufen
end;



procedure TForm11.Button5Click(Sender: TObject);
begin
close();
end;

procedure TForm11.Edit1Exit(Sender: TObject);
begin
    try
       x1:=StrToFloat(Edit1.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit1.Clear;
          Edit1.SetFocus;
    end;
end;

procedure TForm11.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit2.SetFocus;
end;

procedure TForm11.Edit2Exit(Sender: TObject);
begin
    try
       y1:=StrToFloat(Edit2.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit2.Clear;
          Edit2.SetFocus;
    end;
end;

procedure TForm11.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit3.SetFocus;
end;

procedure TForm11.Edit3Exit(Sender: TObject);
begin
    try
       x2:=StrToFloat(Edit3.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit3.Clear;
          Edit3.SetFocus;
    end;
end;

procedure TForm11.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit4.SetFocus;
end;

procedure TForm11.Edit4Exit(Sender: TObject);
begin
    try
       y2:=StrToFloat(Edit4.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit4.Clear;
          Edit4.SetFocus;
    end;
end;

procedure TForm11.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit5.SetFocus;
end;

procedure TForm11.Edit5Exit(Sender: TObject);
begin
    try
       x3:=StrToFloat(Edit5.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit5.Clear;
          Edit5.SetFocus;
    end;
end;

procedure TForm11.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit6.SetFocus;
end;

procedure TForm11.Edit6Exit(Sender: TObject);
begin
    try
       y3:=StrToFloat(Edit6.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit6.Clear;
          Edit6.SetFocus;
    end;
end;

procedure TForm11.Edit6KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit7.SetFocus;
end;

procedure TForm11.Edit7Exit(Sender: TObject);
begin
    try
       x4:=StrToFloat(Edit7.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit7.Clear;
          Edit7.SetFocus;
    end;
end;

procedure TForm11.Edit7KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit8.SetFocus;
end;

procedure TForm11.Edit8Exit(Sender: TObject);
begin
    try
       y4:=StrToFloat(Edit8.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit8.Clear;
          Edit8.SetFocus;
    end;
end;

procedure TForm11.Edit8KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit9.SetFocus;
end;

procedure TForm11.Edit9Exit(Sender: TObject);
begin
    try
       x5:=StrToFloat(Edit9.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit9.Clear;
          Edit9.SetFocus;
    end;
end;

procedure TForm11.Edit9KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit10.SetFocus;
end;

procedure TForm11.Edit10Exit(Sender: TObject);
begin
    try
       y5:=StrToFloat(Edit10.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit10.Clear;
          Edit10.SetFocus;
    end;
end;

procedure TForm11.Edit10KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit11.SetFocus;
end;

procedure TForm11.Edit11Exit(Sender: TObject);
begin
    try
       x6:=StrToFloat(Edit11.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit11.Clear;
          Edit11.SetFocus;
    end;
end;

procedure TForm11.Edit11KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit12.SetFocus;
end;

procedure TForm11.Edit12Exit(Sender: TObject);
begin
    try
       y6:=StrToFloat(Edit12.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit12.Clear;
          Edit12.SetFocus;
    end;
end;

procedure TForm11.Edit12KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit13.SetFocus;
end;

procedure TForm11.Edit13Exit(Sender: TObject);
begin
    try
       x7:=StrToFloat(Edit13.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit13.Clear;
          Edit13.SetFocus;
    end;
end;

procedure TForm11.Edit13KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit14.SetFocus;
end;

procedure TForm11.Edit14Exit(Sender: TObject);
begin
    try
       y7:=StrToFloat(Edit14.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit14.Clear;
          Edit14.SetFocus;
    end;
end;

procedure TForm11.Edit14KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit15.SetFocus;
end;

procedure TForm11.Edit15Exit(Sender: TObject);
begin
    try
       x8:=StrToFloat(Edit15.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit15.Clear;
          Edit15.SetFocus;
    end;
end;

procedure TForm11.Edit15KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit16.SetFocus;
end;

procedure TForm11.Edit16Exit(Sender: TObject);
begin
    try
       y8:=StrToFloat(Edit16.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit16.Clear;
          Edit16.SetFocus;
    end;
end;

procedure TForm11.Edit16KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit1.SetFocus;
end;

procedure TForm11.Button1Click(Sender: TObject);
begin
Label34.Caption := (' ');
//x:=stddev(x1,x2,x3,x4,x5,x6,x7,x8);
ave_x:=(x1+x2+x3+x4+x5+x6+x7+x8)/8;
ave_y:=(y1+y2+y3+y4+y5+y6+y7+y8)/8;
x:=3*(sqrt((1/8)*(((x1-ave_x)*(x1-ave_x))+((x2-ave_x)*(x2-ave_x))+((x3-ave_x)*(x3-ave_x))+((x4-ave_x)*(x4-ave_x))+((x5-ave_x)*(x5-ave_x))+((x6-ave_x)*(x6-ave_x))+((x7-ave_x)*(x7-ave_x))+((x8-ave_x)*(x8-ave_x)))));
y:=3*(sqrt((1/8)*(((y1-ave_y)*(y1-ave_y))+((y2-ave_y)*(y2-ave_y))+((y3-ave_y)*(y3-ave_y))+((y4-ave_y)*(y4-ave_y))+((y5-ave_y)*(y5-ave_y))+((y6-ave_y)*(y6-ave_y))+((y7-ave_y)*(y7-ave_y))+((y8-ave_y)*(y8-ave_y)))));
Label32.Caption := FloatToStrF(x, ffNumber, 8, 3);
Label33.Caption := FloatToStrF(y, ffNumber, 8, 3);
if (x>8) or (y>8) then
Label34.Caption := ('Out of Specification!')
end;

end.
Danke fuer eure Hilfe.
Gruss
Mat

DeddyH 31. Mär 2012 18:54

AW: Standardabweichung berechnen?
 
Zitat:

Delphi-Quellcode:
x:=stddev(x1,x2,x3,x4,x5,x6,x7,x8);

-->
Delphi-Quellcode:
x:=stddev([x1,x2,x3,x4,x5,x6,x7,x8]);
Das sind nur 2 Zeichen mehr ;)

silver-moon-2000 31. Mär 2012 18:54

AW: Standardabweichung berechnen?
 
Hi,

probier's mal so:
Delphi-Quellcode:
std_abw = StdDev([x1,x2,x3,x4,x5,x6,x7,x8])
Denn Delphi will ein Array als parameter und keine Liste von Extended bekommen.

In XE2 kann man auch ein "Array of Extenedd" übergeben (siehe hier), in früheren Versionen ging das noch nicht (siehe hier)

mat72 31. Mär 2012 18:56

AW: Standardabweichung berechnen?
 
Danke dir.
Jetzt verstehe ich auch die Fehlermeldung.
Problem geloest.

sx2008 31. Mär 2012 22:48

AW: Standardabweichung berechnen?
 
@mat72:
Sorry, aber ich muss es loswerden: dein Sourcecode ist ein Paradebeispiel wie man nicht programmieren sollte.
Dir fehlen offensichtlich die Grundlagen; das solltest ändern.
In fast jeder Programmiersprache gibt es Arrays und/oder Listen mit denen viele gleiche Dinge verwalten kann anstatt alle Variablen einzeln hinzuschreiben.
Deine Benutzeroberfläche ist auch eine kleine Katastrophe - für jede Zahl ein Edit und ein Label, wo soll das enden?
Nimm doch einfach ein TMemo und lass den Benutzer so viele Zahlen hineinschreiben oder kopieren wie er mag (eine Zahl pro Zeile).


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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