HP 48G Awaiting Server Cmd.

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).

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.

Dividierte Differenzen

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)' }

Liste in Matrix umwandeln

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.

Matrix in Liste umwandeln

Umkehrfunktion zu Li2Ma, versucht also Brüche wiederherzustellen. Matrix in den Stack stellen und Ma2Li aufrufen.

Gauss

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.

Polynomnullstellen runden

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) }

General Public License

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