Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Mathematik

Allgemeines arithmetisches Mittel

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Redakteurytwinky 20.08.2010

Gelegentlich ist das einfache arithmetische Mittel nicht ausreichend, um einen aussagekräftigen Wert zu ermitteln. Wir benutzen wieder die Meßreihe vom allgemeinen arithmetischen Mittel.Das Meßverfahren ist diesmal aber ein anderes: Oma(75), Opa(81), Papa(51), Mama(35), Sohn(14), Tochter(12) haben mit einer Stoppuhr die Laufzeit eines Programmes gemessen. Bedingt durch die unterschiedlichen Reaktionszeiten der Teilnehmer können die ermittelten Werte nun aber nicht mehr als gleichwertig angesehen werden. Wenn wir jetzt das Alter als Kriterium für die Wertigkeit(Gewicht) nehmen, bekäme der Wert von Opa das höchste, der von Tochter das geringste Gewicht. Das entspricht bestimmt nicht der Realität. Deshalb benutzen wir als Gewicht den reziproken Wert des Alters und speichern ihn durch ein Komma ',' getrennt beim zugehörigen Meßwert. In der Literatur(s. Walter Großmann, Grundzüge der Ausgleichungsrechnung) wird darauf hingewiesen, daß Gewichte nicht stark von 1 abweichen sollen, also addieren wir einfach die 1 zu unseren Gewichten. Die Wahl der Gewichte steht uns ja frei, sie muß nur in einem begründbaren Zusammenhang zu den Meßwerten stehen. Unsere Datei sieht dann so aus:

;Auswertung vom 16.06.2007
15.14, 1.0133
14.983, 1.0123
15.05, 1.0196
14.97, 1.0285
15.017, 1.0714
14.840, 1.0833

(Abspeichern als AAM.Dat)
Tatsächlich ist die Ermittlung von Gewichten nicht immer einfach und das hier gezeigte Verfahren dient nur einer lockeren Darstellungsweise. Wer sich näher dafür interessiert, kann sich ja mal das Buch von Großmann durchlesen..
Hier nun ein Programm, welches die Meßwerte aus AAM.Dat auswerten kann:

'Ä=Ž , Ö=™ , Ü=š ; ä=„ , ö=”, ü= , ß=á ,§=õ , ©=¸ ,°=ø
#define Real Single 'reicht fürs Beispiel
Type Beobachtung
  As Real Messwert, Gewicht, Verbesserung
End Type

Declare Sub Einlesen(Daten() As Beobachtung)
Declare Function Berechnen(Daten() As Beobachtung, byRef SummeP As Real, byRef m0 As Real) As Real
Declare Sub Ausgeben(Daten() As Beobachtung, byVal MittelWert As Real, byVal SummeP As Real, byVal m0 As Real)
Const Esc=!"\27" 'So kann die Datei erst ab 0.17f kompiliert werden :D sonst wäre Esc=Chr(27)
Const MinMw=2 'Mindestanzahl der Messungen ist 2, dann ist aber die Fehlerrechnung nicht aussagekräftig
Dim As Real Mittelwert, SummeP, m0
Dim Daten() As Beobachtung
Dim Shared Anzahl As Integer, DateiName As String

Sub Einlesen(Daten() As Beobachtung)
  Dim As Integer i=0, OpenErr, DateiNr=FreeFile
  Dim As String Zeile
  DateiName=Command(1)
  Do
    OpenErr=Open(DateiName For Input As #DateiNr)
    If OpenErr<>0 Then
      If OpenErr<>2 Then
        Print "Fehler beim Öffnen der Datei, Programmende"
        GetKey
        End
      Else
        Print "Datei " &DateiName &" existiert nicht!"
        Input "Neuer Dateiname(Enter beendet):", DateiName
        If DateiName="" Then End
      End If
    End If
  Loop Until OpenErr=0
  Print "Fehler in der Datei " &DateiName &" Ctrl-C fr Abbruch.."
  Do
    Do
      Input #DateiNr, Zeile 'Pro Zeile ein Wert mit Dezimal'.' kein ',' als Schikane :D
      OpenErr=InStr(Zeile, ";") 'mit ';' können Zeilen auskommentiert werden
      If OpenErr Then Zeile=Left(Zeile, OpenErr-1) '..auch sinnvoll zum Kennzeichnen einer Meßreihe
    Loop Until Zeile<>"" 'Leerzeile überlesen
    ReDim Preserve Daten(i)
    Daten(i).Messwert=Val(Zeile)
    Input #DateiNr, Daten(i).Gewicht ' das Gewicht p ist vom Meßwert durch ein ',' getrennt
    i+=1
  Loop Until Eof(DateiNr)
  Close(DateiNr)
  Cls
  If i<MinMw Then
    Print MinMw &" Meáwerte sind mindestens erforderlich, vorhanden sind " &i
    Print "Mehr messen.."
    GetKey
    End
  End If
  Anzahl=i
End Sub

Function Berechnen(Daten() As Beobachtung, byRef SummeP As Real, byRef m0 As Real) As Real
  Dim As Integer i
  Dim As Real Mittel, SummePVV, SummePV, v
  For i=LBound(Daten) To Anzahl-1
    Mittel+=Daten(i).Messwert*Daten(i).Gewicht
    SummeP+=Daten(i).Gewicht
  Next i 'esistnichtegalwashierstehtauchwenneszusammengeschreibenist
  Mittel/=SummeP 'Mittelwert ausrechnen
  Redim As Beobachtung Verbesserung(Anzahl) 'Da im Hauptprogramm bereits vereinbart, neu dimensionieren
  For i=LBound(Daten) To Anzahl-1
    With Daten(i)
      .Verbesserung=Mittel-.Messwert
      v=.Verbesserung*.Gewicht
      SummePVV+=.Verbesserung*v
      SummePV+=v
    End With
  Next
  If Anzahl>=MinMw Then m0=Sqr(SummePVV/(Anzahl-1)) 'mittl. Fehler berechnen
  Function=Mittel
End Function

Sub Ausgeben(Daten() As Beobachtung, byVal MittelWert As Real, byVal SummeP As Real, byVal m0 As Real)
  Dim Mw As String="Mittelwert=", j As Integer=Len(Mw), Rand As String=String(j, 32)
  Dim As Integer i
  Dim As Real SummeV
  Print "Allgemeines arithmetisches Mittel ¸2007 by ytwinky, MD"
  Print "Auswertung der Datei " &DateiName &" mit " &Anzahl &" Meáwerten"
  Print Rand &"     Meáwert l       Gewicht p  Verbesserung v  Mittl. Fehler"
  For i=LBound(Daten) To Anzahl-1
    Print Rand;
    With Daten(i)
      Print Using "########.#####"; .Messwert; .Gewicht; .Verbesserung; m0/Sqr(.Gewicht)
      SummeV+=.Verbesserung
    End With
  Next
  Print Rand &"--------------"
  Print Mw;
  Print Using "########.#####"; MittelWert;
  Print String(14, 32);
  Print Using "########.#####";  SummeV
  Print Rand &"=============="
  Print "Summe der Verbesserungen muá=0 sein(oder ganz dicht dabei)"
  Print "(Für jede Meáwertzeile gilt: Mittelwert=Meáwert+Verbesserung)"
  If Anzahl>MinMw Then
    Print
    Print "Genauigkeitsbetrachtung"
    Print "m0=";
    Print Using "#.#####"; m0
    Print "Mittl. Fehler des gewichteten Mittelwertes=";
    Print Using "#.#####"; m0/Sqr(SummeP);
  End If
  GetKey
End Sub

'HauptProgramm
Einlesen(Daten()) 'Eingabe
Mittelwert=Berechnen(Daten(), SummeP, m0) 'Verarbeitung
Ausgeben(Daten(), MittelWert, SummeP, m0) 'Ausgabe
'Ende

Fragen zum Programm? Nun, dann kann ich wirklich nur das Buch von Großmann empfehlen..
Interessant ist auch, die Gewichte alle auf 1 zu setzen, aber wer das einfache arithmetische Mittel schon hat, findet das vielleicht weniger spannend :D
Gruß
ytwinky


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 16.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 20.08.2010 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen