Mittelwerte, Betrag
Vektor
Die Ausführungen der
vorherigen Seiten über Programmfenster, insbersondere die Seite 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 geometrische 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 |