Taschenrechner HP 48G
Datenaustausch mit Kermit unter Linux
Um die Daten (Programme) vom Taschenrechner auf den PC zu bringen wird Kermit benötigt.
Den HP mit dem Kabel mit der seriellen Schnittstelle verbinden (bei mir
/dev/ttyS0).
HP
Auf dem HP den Server starten unter I/O (Right-Shift 1) Start Server wählen (eins nach oben Enter). Falls man die übertragenen Daten auch auf dem PC lesen will, muss man den HP zuerst auf ASCII-Übertragung umschalten (Left-Shift 1 -> IOPAR -> ASCII) und noch einen Übersetzungsmodus für die Sonderzeichen wählen (Left-Shift 1 -> IOPAR -> 3 ENTER TRAN).
- 0 keine Übersetzung
- 1 Newline wird in carriage return, line feed übersetzt
- 2 Übersetzung 1 und \ nach \\ sowie alle Zeichen von 128 bis 159 nach \ und zwei Zeichen die das Zeichen symbolisiern
- 3 wie 2 jedoch alle Zeichen von 128 bis 255
PC
Mit kermit Kermit starten und folgendes eingeben:
SET LINE /dev/ttyS0
SET MODEM TYPE DIRECT
SET SPEED 9600
SET CARRIER-WATCH OFF
SET FLOW NONE
SET PARITY NONE
Wenn die I/O-Einstellungen des HP nicht verändert wurden, kann man sich nun mit
RDIR
das Verzeichnis auf dem HP listen lassen und mit
GET NAME
die Variable vom HP saugen. Gross-, Kleinschreibung bei den
Befehlen spielt keine Rolle.
Da man natürlich zu faul ist, die Schnittstellenparameter immer einzugeben, schreibt man sich ein kleines Kerbang Script:
#!/usr/local/bin/kermit +
SET LINE /dev/ttyS0
SET MODEM TYPE DIRECT
SET SPEED 9600
SET CARRIER-WATCH OFF
SET FLOW NONE
SET PARITY NONE
Ausführbar machen mit chmod
und aufrufen.
Programme
Ein klick auf den Titel führt zum Programmcode. Die Dateien wurden direkt mit Kermit vom HP auf den PC kopiert (Übertragunsart ASCII im Übersetzungsmodus 3).
Alle Programme unterstehen der General Public License.
Die x-Werte und die Funktionswerte müssen jeweils in einer Liste im Stack stehen. Die Funktionswerte an der ersten Stelle (1:). Bei Listen dürfen Brüche in '' enthalten. Der Aufruf von Diff
legt nacheinander alle dividierten Differenzen im Stack ab.
Beispiel:
2: { 0 1 2 3 4 5 }
1: { -2 '5/2' 4 '1/2' -2 '5/2' }
Diff
ergibt nun:
7: { 0 1 2 3 4 5 }
6: { -2 '5/2' 4 '1/2' -2 '5/2' }
5: { '9/2' '3/2' '-(7/2)' '-(5/2)' '9/2' }
4: { '-(3/2)' '-(5/2)' '1/2' '7/2' }
3: { '1/3' 1 1 }
2: { '100000000000/300000000001' 0}
1: { '-(10000000000/150000000001)' }
Da der HP 48 keine Brüche in Matrizen unterstüzt kann man die Martix als
verschachtelte Liste eingeben (wie Matrizen aber anstelle von [], {} verwenden).
Die Brüche müssen zwischen ' ' gesetzt werden. Danach Li2Ma
aufrufen
und das ganze wird in eine Matrix umgewandelt.
Umkehrfunktion zu Li2Ma
, versucht also Brüche wiederherzustellen.
Matrix in den Stack stellen und Ma2Li
aufrufen.
Bringt eine Matrix auf Zeilenstufenform und gibt alle Zwischenschritte aus.
Die Matrizen können wahlweise auch als Listen mit Brüchen ausgegeben werden, daher wird Ma2Li im selben Verzeichnis benötigt. Wahlweise kann auch zusätzlich noch die Matrix mit den Quotienten ausgegeben werden (L-Matrix).
Die Matrizen werden in der folgenden Reihenfolge im Stack abgelegt:
n+2: P-Matrix
Permutationsmatrix (quadratisch)
Dimension max(Zeile, Spalte) ursprüngliche Matrix
Im 1. Schritt Einheitsmatrix
n+1: L-Matrix
Dimension wie ursprüngliche Matrix
Im 1. Schritt pseudo Einheitsmatrix
n : U-Matrix
Im 1. Schritt die ursprüngliche Matrix
.
.
.
6: P-Matrix (vorletzter Schritt)
5: L-Matrix (vorletzter Schritt)
4: U-Matrix (vorletzter Schritt)
3: P-Matrix (letzter Schritt)
2: L-Matrix (letzter Schritt)
1: U-Matrix (letzter Schritt)
Falls die Matrix quadratisch ist, gibt PLU die ursprüngliche Matrix, welche im Stack bei der Postion n steht.
Rundet die x-Werte der Nullstellen des Polynoms und errechnet den absoluten Fehler.
Das Polynom muss in der HP48 üblichen Notation im Stack an zweiter Stelle (2:) und die Anzahl Nachkommastellen, auf die die Nullstellen gerundet werden sollen, an erster Stelle (1:) im Stack stehen.
Das Programm legt an zweiter Stelle im Stack (2:) die gerundeten Nullstellen ab und an erster Stelle (1:) das Polynom ausgewertet an den gerundeten Stellen die an zweiter Stelle (2:) stehen.
Beispiel (x^3+3*x^2+3*x+1):
2: [ 1 3 3 1 ]
1: 5
Poly
ergibt nun:
4: [ 1 3 3 1 ]
3: 5
2: [ (-1,0) (-1,0) (-1,0) ]
1: { (0,0) (0,0) (0,0) }
Programmname -- (c) 2001 Thomas Kuster, thomas[at]fam-kuster.ch
This program is free software; you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the license, or (at your option) any later version.
The software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY to the extent of law; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
www.gnu.org