zur Übersicht nächste Seite

Mittelwerte, Betrag Vektor

Die Ausführungen der vorherigen Seiten über Programmfenster, insbersondere die Seite
Debian Gnome read Tabelle
werden hier weitergeführt.
Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste. 
Oder man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Editors ein.  
Dann drückt man zum Abspeichern gleichzeitig Strg und O 
dann drückt man die Eingabetaste um den Dateinamen zu bestätigen 
dann drückt man zum Verlassen des Editors gleichzeitig Strg und X.


Mit den Gedanken der vorhergehenden Seite kann man auch leicht die Berechnung von Mittelwerten durchführen. Es gibt z.B.

Es wird ein script aufgeschrieben mit dem alle diese Mittelwerte und auch der Betrag eines Vektors bestimmt wird. 

Es öffnet sich zuerst ein zenity-Fenster in das man Werte aus einem Tabellenprogramm oder einem Writer-Dokument in das Eingabefeld kopieren kann.

       

Die Eingabe sollte dem Format eines Spaltenvektors entsprechen - senkrecht untereinanderstehende Tabellenzellen oder zeilenweise getrennte Textdatei-Daten (ohne spezielle Trennzeichen). Die Daten können Kommazahlen oder Punktzahlen oder einfache Brüche sein.
Im Eingabefeld erscheinen eigenartige Zeichen die für den Zeilenumbruch stehen und die man nicht weiter beachten muß.

Das Ergebnis

Das script wird wieder in dem Ordner ~/Bla abgelegt:
nano ~/Bla/Mittelwerte.sh
Eingabe in den Editor
#!/bin/bash

Vu=$( zenity --entry --ok-label "EINGABE" --title "EINGABE-FENSTER" --text " Bitte einspaltigen Vektor eingeben")

if [ $? -ne 0 ]; then
exit
fi

if [ $(echo "$Vu" | sed 's/\t/ /g;s/$/ /' | cut -f 1 -d ' ' --complement | wc -w) != 0 ]; then
zenity --info --width="280" --title="Fehler" --text "Eingabedaten\n\n sind nicht vom Typ \n\n einspaltiger Vektor"
exit
fi

Vv=$(echo "$Vu" | sed 's/,/\./g;s/ //g;/^$/d;/^0$/d')

Az=$(echo "$Vv" | wc -l)

if [ $Az -eq 0 ]; then
zenity --info --width="280" --title="Fehler" --text "Eingabefehler"
exit
fi

if [ $Az -gt 36 ]; then
zenity --info --width="280" --title="Fehler" --text "Spaltenvektor\n\n hat mehr als \n\n 36 Zeilen"
exit
fi

Pr=$(echo "$Vv"| pr -t -s"*" -$Az)

Ad=$(echo "$Vv"| pr -t -s"+" -$Az)

Aq=$(while read Vektor; do echo "$Vektor*$Vektor"; done <<< $(echo "$Vv") | pr -t -s"+" -$Az)

A3=$(while read Vektor; do echo "$Vektor*$Vektor*$Vektor"; done <<< $(echo "$Vv") | pr -t -s"+" -$Az)

Ak=$(while read Vektor; do echo "1/($Vektor)"; done <<< $(echo "$Vv") | pr -t -s"+" -$Az)

if [ $(echo "$Pr" | bc -l | grep - | wc -w) -eq 0 ]; then
Gm=$(echo "e(l($Pr)/$Az)" | bc -l)
else
Gm="negative Zahl eingegeben"
fi

Am=$(echo "($Ad)/$Az" | bc -l)

Qm=$(echo "e(l(($Aq)/$Az)/2)" | bc -l)

if [ $(echo "$A3" | bc -l | grep - | wc -w) -eq 0 ]; then
KUm=$(echo "e(l(($A3)/$Az)/3)" | bc -l)
else
KUm=$(echo "e(l(($( echo "$A3" | sed 's/-//' ))/$Az)/3)" | bc -l | sed 's/^/-/' )
fi

Hm=$(echo "$Az/($Ak)" | bc -l)

Lv=$(echo "e(l($Aq)/2)" | bc -l)

zenity --info --width="500" --icon-name=emblem-default --title="Mittelwerte-Berechnung" --text "arithmetischer Mittelwert = $Am \n\n geometrischer Mittelwert = $Gm \n\n harmonischer Mittelwert = $Hm \n\n quadratischer Mittelwert = $Qm \n\n kubischer Mittelwert = $KUm \n\n <span size='large'color='blue'> Länge des Vektors = $Lv </span>"
Nun muß man das script ausführbar machen.
chmod +x ~/Bla/Mittelwerte.sh
Der Betrag eines Vektors wird richtg berechnet auch wenn der Vektor 0-Elemente enthält. Aber das obige script funktioniert nicht für die Mittelwerte, wenn es Null-Werte gibt. 
Bei dem eingegebenen Spaltenvektor werden nämlich Zeilen herausgelöscht die leer sind oder 0 enthalten. Daher werden in diesem Beispiel:

nur für zwei Werte die Mittelwerte gebildet, es ist n=2 auch wenn 6 Werte eingegeben wurden. Ist ein Null-Wert vorhanden dann berechnet sich der quadratische Mittelwert zu 0 und der harmonische Mittelwert läßt sich nach obiger Formel nicht berechnen.
Braucht man für die Berechnung der anderen Mittelwerte auch die Eingabe von Null-Werten so muß man für diesen Fall das script ändern.
Generell darf in dem obigen script der Eingabevektor keine versteckten Nullen enthalten - verboten sind 
0.0   0,00   0/2   0*4 und ähnliches und natürlich auch 2/0   5/(1-1) und ähnliches.
Auch bei der Eingabe extrem kleiner Werte kann es bei der Multiplikation mit Rundung nach 20 Stellen hinter dem Komma zu 0-Werten kommen!

Das obige script funktioniert für Spaltenvektoren mit bis zu 36 Zeilen, also 36 Werten. Der Grund liegt in dem Programm pr das eigentlich für die Formatierung von Daten für die Druck-Ausgabe gedacht ist. Bei mehr als 36 Spalten kapituliert pr mit der Meldung

pr: Seitenbreite zu schmal

Man könnte natürlich anstelle von pr im script sed und tr verwenden was die Anzahl der Zeichen im script etwas vergrößern würde. Aber es kommt im script das geometrische Mittel vor das bei 36 Zahlen größer als 10 bei der Multiplikation schnell zu Zahlen führt die mehr als 36 Stellen besitzen und daraus muß bc die 36.Wurzel ziehen. Und man kann fragen ob dies wirklich gebraucht wird. Jedenfalls kann jeder das script für seine Bedürfnisse anpassen.

Hier ein Beispiel bei dem auch Null-Werte richtig eingerechnet werden. Die Werte können Kommazahlen oder Punktzahlen sein aber keine Brüche. Es können auch beliebig viele Werte eingegeben werden.
nano ~/Bla/Mittelwerte-mit-Null.sh
Eingabe in den Editor
#!/bin/bash

Vu=$( zenity --entry --ok-label "EINGABE" --title "EINGABE-FENSTER" --text " Bitte einspaltigen Vektor eingeben")

if [ $? -ne 0 ]; then
exit
fi

if [ $(echo "$Vu" | sed 's/\t/ /g;s/$/ /' | cut -f 1 -d ' ' --complement | wc -w) != 0 ]; then
zenity --info --width="280" --title="Fehler" --text "Eingabedaten\n\n sind nicht vom Typ \n\n einspaltiger Vektor"
exit
fi

Vv=$(echo "$Vu" | sed 's/,/\./g;s/ //g;s/^$/#/')

if [ $(echo "$Vv" | grep '#' | wc -w) -ne 0 ]; then
zenity --info --width="280" --title="Fehler" --text "leerer Wert vorhanden"
exit
fi

if [ $(echo "$Vv" | grep '/' | wc -w) -ne 0 ]; then
zenity --info --width="280" --title="Fehler" --text "es wurde ein Bruch eingegeben"
exit
fi

Az=$(echo "$Vv" | wc -l)

if [ $Az -eq 0 ]; then
zenity --info --width="280" --title="Fehler" --text "Eingabefehler"
exit
fi

Ad=$(echo "$Vv"| sed "s/^/+/g" | tr -d "\n" | pr -t | sed "s/^+//" | bc -l)

Aq=$(while read Vektor; do echo "$Vektor*$Vektor"; done <<< $(echo "$Vv") | sed "s/^/+/g" | tr -d "\n" | pr -t | sed "s/^+//" | bc -l)

Am=$(echo "($Ad)/$Az" | bc -l)

Qm=$(echo "e(l(($Aq)/$Az)/2)" | bc -l)

Lv=$(echo "e(l($Aq)/2)" | bc -l)

zenity --info --width="500" --icon-name=emblem-default --title="Mittelwerte-Berechnung" --text "arithmetischer Mittelwert = $Am \n\n quadratischer Mittelwert = $Qm \n\n <span size='large'color='green'> Länge des Vektors = $Lv </span>"
Nun muß man das script ausführbar machen.
chmod +x ~/Bla/Mittelwerte-mit-Null.sh



zur Übersicht nächste Seite

Datenschutzerklärung
Impressum