home *** CD-ROM | disk | FTP | other *** search
- {######################### Bibliothek MATHLIB. ##########################
-
- # Zu deklarierende Datentypen:
- type KOOPA=array[0..1,0..2] of real;
- type POLYGL=array[0..3,0..1] of real;
- type QUASTR=array[0..16] of char;
- type REALMAT=array[0..50,0..50] of real;
- type REALVEC=array[0..50] of real;
- type INTVEC=array[0..50] of integer;
- type SCANVEC=array[0..50] of record p:integer;t,x:real end;
- type COMPLEX=record re,im:real end;
-
- # Für Druckerausgabe Textfile "PRINTER" eroeffnen:
- var PRINTER:text;
- rewrite(PRINTER,'PRN:');
-
- # Zu declarierende Funktionen und Proceduren:
- function X(t:real):real;
- * Funktionenvektor: f[i]=fi(x)
- procedure FUNKVEC(var f:realvec;x:realvec);
- * Rechte Seite bei Differentialgleichungen:
- procedure F(t:real;x:realvec;var dx:realvec);
-
- # Sammlung aller function und procedure aus MATHLIB1:
- * Grundsätzliche Bildschirmfunktionen: }
-
- { Bewegt den Cursor eine Zeile nach oben. Kein Effekt in Zeile 0. }
- procedure CUR_UP;external;
-
- { Bewegt den Cursor eine Zeile nach unten. Kein Effekt in Zeile 24. }
- procedure CUR_DOWN;external;
-
- { Bewegt den Cursor eine Spalte nach rechts. Kein Effekt in Spalte 79. }
- procedure CUR_RIGHT;external;
-
- { Bewegt den Cursor eine Spalte nach links. Kein Effekt in Spalte 0. }
- procedure CUR_LEFT;external;
-
- { Loescht den gesamten Bildschirm und setzt den Cursor in die Ecke (0, 0). }
- procedure CLEAR_HOME;external;
-
- { Bewegt den Cursor in die linke obere Ecke, identisch mit gotoxy (0, 0). }
- procedure CURSOR_HOME;external;
-
- { Bewegt den Cursor eine Zeile nach oben. Schiebt den Schirminhalt runter, wenn
- in Zeile 0. }
- procedure CUR_UP_SCROLL;external;
-
- { Bewegt den Cursor eine Zeile nach unten. Schiebt den Schirminhalt hoch, wenn
- in Zeile 24. }
- procedure CUR_DOWN_SCROLL;external;
-
- { Loescht von der oberen, linken Ecke bis zum Cursor. }
- procedure START_OF_SCREEN;external;
-
- { Loescht von der Cursorposition bis zum Ende des Bildschirms. }
- procedure END_OF_SCREEN;external;
-
- { Loescht die Zeile mit dem Cursor. }
- procedure CLEAR_LINE;external;
-
- { Loescht vom Anfang der Zeile bis zum Cursor. }
- procedure START_OF_LINE;external;
-
- { Loescht von der Cursorposition bis zum Ende der Zeile. }
- procedure END_OF_LINE;external;
-
- { Fuegt eine Zeile vor der aktuellen ein und schiebt die anderen runter. Der
- Cursor steht danach am Anfang der neuen Zeile. }
- procedure INSERT_LINE;external;
-
- { Loescht die Zeile mit Cursor und schiebt nachfolgende Zeilen hoch. }
- procedure DELETE_LINE;external;
-
- { Positioniert den Cursor in Spalte 0 <= x <= 79 und Zeile 0 <= y <= 24. }
- procedure GOTOXY(x,y:integer);external;
-
- { Waehlt die Farbe fuer Schrift aus. Erlaubte Werte bei den Bildschirm-
- Aufloesungen hoch: 0 .. 1; mittel: 0 .. 3; niedrig: 0 .. 15. }
- procedure SELECT_COLOR(color:integer);external;
-
- { Waehlt die Farbe fuer den Hintergrund. Erlaubte Werte wie bei select_color. }
- procedure SELECT_BACKGROUND(color:integer);external;
-
- { Der Cursor wird sichtbar. }
- procedure CUR_ON;external;
-
- { Der Cursor wird unsichtbar. }
- procedure CUR_OFF;external;
-
- { Die Position des Cursors wird gespeichert. }
- procedure SAVE_CURSOR;external;
-
- { Der Cursor wird auf die letzte durch save_cursor gespeicherte Position
- gesetzt. }
- procedure RESTORE_CURSOR;external;
-
- { Schaltet inverse Schrift ein (Farbe von Schrift und Hintergrund getauscht). }
- procedure INVERSE_ON;external;
-
- { Schaltet inverse Schrift aus. }
- procedure INVERSE_OFF;external;
-
- { Aktiviert den automatischen Ueberlauf in die naechste Zeile. }
- procedure WRAP_ON;external;
-
- { Desaktiviert den Ueberlauf. }
- procedure WRAP_OFF;external;
-
- { Gibt das Zeichen aus und interpretiert dabei keine Control-Codes, sondern
- ersetzt diese durch Grafikzeichen. }
- procedure GRAFCHAR(which:char);external;
-
- { Setzt Pixel an x,y }
- procedure SETXY(x,y:integer);external;
-
- { Loescht Pixel an x,y }
- procedure RESETXY(x,y:integer);external;
-
- { Invertiert Pixel an x,y }
- procedure INVSETXY(x,y:integer);external;
-
- { Zeichnet Gerade von x1,y1 nach x2,y2 }
- procedure GERADE(x1,y1,x2,y2:integer);external;
-
- { Loescht Gerade von x1,y1 nach x2,y2 }
- procedure LGERADE(x1,y1,x2,y2:integer);external;
-
- { Invertiert Gerade von x1,y1 nach x2,y2 }
- procedure INVGERADE(x1,y1,x2,y2:integer);external;
-
- { Zeichnet horizontale Gerade von x1 nach x2 in y-Hoehe }
- procedure HGERADE(x1,y,x2:integer);external;
-
- { Loescht horizontale Gerade von x1 nach x2 in y-Hoehe }
- procedure LHGERADE(x1,y,x2,:integer);external;
-
- { Tastaturabfrage: keine Taste - chr(0), sonst 1. Zeichen aus Puffer }
- function GETC:char;external;
-
- { Wartet auf Taste, 1. Zeichen aus Puffer }
- function WAITC:char;external;
-
- { Wartet auf Taste, 1. Zeichen aus Puffer, leert Puffer }
- function FIRSTC:char;external;
-
- { Wartet auf Taste, letztes Zeichen aus Puffer }
- function LASTC:char;external;
-
- { wartet auf Tastendruck }
- procedure WARTE;external;
-
- { erstellt hardcopy }
- procedure HARDCOPY;external;
-
- { physikalische Bildschirmaddresse }
- function PHYSBASE:long_integer;external;
-
- { logische Bildschirmaddresse }
- function LOGBASE:long_integer;external;
-
- { warten auf den naechsten Vertical Blank Interrupt }
- procedure VSYNC;external;
-
- {# Sammlung von mathematischen Funktionen
- # als Ergaenzung zu den implementierten:}
-
- { Vertauschen von a und b }
-
- procedure SWAPR(var a,b:real);external;
-
- procedure SWAPL(var a,b:long_integer);external;
-
- procedure SWAPI(var a,b:integer);external;
-
- { Signumsfunktion sgn=0 bei Argument 0 }
-
- function ISGN(x:integer):integer;external;
-
- function LSGN(x:long_integer):integer;external;
-
- function RSGN(x:real):integer;external;
-
- { Liefert den Nachkommaanteil }
- function FRAC(x:real):real;external;
-
- function INTUP(x:real):long_integer;external;
-
- function INTDOWN(x:real):long_integer;external;
-
- { 10er Logarithmus }
- function LOG(x:real):real;external;
-
- { Loagrithmus zur Basis a }
- function LOGA(b,a:real):real;external;
-
- function XHOCH10(x:real):real;external;
-
- function AHOCHB(a,b:real):real;external;
-
- { ate Wurzel }
- function WURZA(b,a:real):real;external;
-
- { Grad -> Rad }
- function TORAD(grad:real):real;external;
-
- { Rad -> Grad }
- function TOGRAD(rad:real):real;external;
-
- function TAN(x:real):real;external;
-
- function SEC(x:real):real;external;
-
- function CSC(x:real):real;external;
-
- function ARCSIN(x:real):real;external;
-
- function ARCCOS(x:real):real;external;
-
- function SINH(x:real):real;external;
-
- function COSH(x:real):real;external;
-
- function TANH(x:real):real;external;
-
- function ARCSINH(x:real):real;external;
-
- function ARCCOSH(x:real):real;external;
-
- function ARCTANH(x:real):real;external;
-
- { n-Fakultät }
- function FAC(n:integer):real;external;
-
- { Binominalkoeffizient }
- function BINOM(a,b:real;n:integer):real;external;
-
- { Zufallsgenerator: Zahlen zwischen 0 und 1 }
- function RANDOM:real;external;
-
- {# Soundfunktionen:}
-
- procedure SOUND(kanal,periode,laut,centisec:integer);external;
-
- procedure SOUNDEIN(kanal,periode,laut:integer);external;
-
- procedure SOUNDAUS(kanal:integer);external;
-
- {# Umwandlung von Zahlen in ein array of char:}
-
- procedure LONGTOSTR(l:long_integer;var c:quastr);external;
-
- procedure INTTOSTR(i:integer;var c:quastr);external;
-
- procedure REALTOSTR(x:real;s:integer;ex:boolean;var c:quastr);external;
-
- {# Einlesen von Zahlen mit festgelegter Anzahl von Ziffern,
- # Fehler werden soweit als moeglich abgefangen:}
-
- function ZIFFER(c:char):boolean;external;
-
- procedure ELONG(var l:long_integer;stellen:integer);external;
-
- procedure EINT(var i:integer;stellen:integer);external;
-
- procedure EREAL(var r:real;stellen:integer);external;
-
- {# Formatierte Ein/Ausgabe von Vectoren und Matrizen:
- # E=Eingabe, B=Bildschrimausgabe, P=Printerausgabe
- # n:Anzahl der Zeilen oder Vektorelemente
- # m:Anzahl der Spalten
- # chelem:Anzahl der Stellen bei der Ausgabe (mit Vorzeichen,Exponent)
- # vname:Name des Vektors oder der Matrix
- # Textfile PRINTER muss eröffnet sein }
-
- procedure EVEC(var x:realvec;n,chelem:integer;vname:string);external;
-
- procedure EMAT(var a:realmat;n,m,chelem:integer;vname:string);external;
-
- procedure BVEC(var x:realvec;n,chelem:integer;vname:string);external;
-
- procedure BMAT(var a:realmat;n,m,chelem:integer;vname:string);external;
-
- procedure PVEC(var x:realvec;n,chelem:integer;vname:string);external;
-
- procedure PMAT(var a:realmat;n,m,chelem:integer;vname:string);external;
-
- {# Darstellung eines Koordinatensystems:}
-
- { Umwandlung ins Bildkoordinatensystem x:0..639, y:0..399 (hohe Auflösung)
- Weltkoordinaten: t,x Bildkoordinaten: h,v
- inbild=TRUE, falls Punkt innerhalb der Bilschirmgrenzen }
- procedure REALTOBILD(t,x:real;ap:koopa;var h,v:integer;var inbild:boolean);
- external;
-
- { Umkehrfunktion von REALTOBILD }
- procedure BILDTOREAL(h,v:integer;ap:koopa;var t,x:real;var inreal:boolean);
- external;
-
- { Zeichnet ein Achsenkreuz ein und setzt die Steigungen in ap für die
- die linearen Transformationen REALTOBILD und BILDTOREAL }
- procedure AXIS(var ap:koopa);external;
-
- { Eingabe der notwendigen Parameter, um ein Achsenkreuz zu zeichnen }
- procedure KOORDFESTLEGEN(var ap:koopa);external;
-
- { Markiert den Bildpunkt h,v mit einem kleinen Kreuz }
- procedure MARKPOINT(h,v:integer);external;
-
- { Zeichnet eine Funktion in ein bestehendes Koordinatensystem ein,
- von t bis te mit intervalle Zwischenpunkten.
- wie=0: Nur einzelne Punkte
- wie=1: Punkte sind durch Geraden verbunden
- mark=true: Punkte werden markiert }
- procedure ZEICHNEFUNKTION(function x(t:real):real;ap:koopa;t,te:real;
- intervalle,wie:integer;mark:boolean);external;
-
- { Bringt eine Funktion einschliesslich Koordinatensystem auf den Bildschirm }
- procedure DISPLAYFUNKTION(function x(t:real):real);external;
-
- {# Ablaufsuche einer Funktion x(t)
- # auf Nullstellen, Maxima, Minima, Wechselpunkte und Sprünge:}
-
- { Sucht eine Nullstelle zwischen l und r mit den Genauigkeiten epst und epsx }
- procedure BISEK(function X(t:real):real;l,r,epst,epsx:real;var t,xx:real);
- external;
-
- { Sucht ein Extremum zwischen l und r mit den Genauigkeiten epst und epsx,
- max=1 suche Maximum
- max=-1 suche Minimum }
- procedure BIMINMAX(function X(t:real):real;
- l,r,epst,epsx:real;max:integer;var t,xx:real);external;
-
- { Sucht einen Wechselpunkt
- zwischen l und r mit den Genauigkeiten epst und epsx }
- procedure WECHSELPUNKT(function X(t:real):real;
- l,r,epst:real;var t,xx:real;var gefunden:boolean);
- external;
-
- { Sucht einen Sprung zwischen l und r mit den Genauigkeiten epst und epsx }
- procedure SPRUNG(function X(t:real):real;
- l,r,epst:real;var t:real;var gefunden:boolean);external;
-
- { Ablaufsuche: eine Funktion wird in den Grenzen t,te mit der
- Schrittweite h mit den Genauigkeiten epst,epsx nach Nullstellen,
- Extramas, Wechselpunkten und Sprüngen abgesucht.
- Das Ergebnis steht in ip:
- ip.p:Art des Ereignisses:1=Nullstelle
- 2=Maximum
- 3=Minimum
- 4=Wechselpunkt
- 5=Sprung
- ip.t:t-Koordinate des entsprechenden Ereignisses
- ip.x:x-Koordinate
- nst:Anzahl der in ip verfügbaren Speicheplätze }
- procedure SCANFUNKTION(function X(t:real):real;
- t,te,h,epst,epsx:real;nst:integer;var ip:scanvec);
- external;
-
- { Formatierte Ausgabe der durch SCANFUNKTION gefundenen Ereignisse }
- procedure SCANVECBILD(ip:scanvec);external;
-
- {# Finden von Nullstellen nach dem Sekantenverfahren:
- # Das Hauptprogramm benoetigt die Vereinbarung der function X(t:real):real;
- # Eingabe Startwert in t
- # Ausgabe Enderte t,x
- # itmax: >0 :Erfolg, Werte brauchbar
- # =0 :itmax Iteration durchgefuehrt
- # <0 :x(tn)=x(tn-1), keine weitere Berechnung
- # mehr moeglich }
- procedure SEKANT(function X(t:real):real;
- var t,f:real;epst,epsx:real;var itmax:integer);external;
-
- {# Verarbeitung komplexer Zahlen:
- # !Achtung ARCCSIN,ARCCCOS,ARCCTAN sind reine Näherungsverfahren und mit
- # !Vorsicht zu geniessen in Bezug auf Genauigkeit und Konvergenz }
-
- { z=v }
- procedure CLET(var z:complex;v:complex);external;
-
- procedure CNEG(var z:complex);external;
-
- procedure CKON(var z:complex);external;
-
- { z=z+v }
- procedure CADD(var z:complex;v:complex);external;
-
- { z=z-v }
- procedure CSUB(var z:complex;v:complex);external;
-
- { z=z*v }
- procedure CMUL(var z:complex;v:complex);external;
-
- { z=z/v }
- procedure CDIV(var z:complex;v:complex);external;
-
- { z=z+-*/eine Zahl r+j*s }
-
- procedure CADDZ(var z:complex;r,s:real);external;
-
- procedure CSUBZ(var z:complex;r,s:real);external;
-
- procedure CMULZ(var z:complex;r,s:real);external;
-
- procedure CDIVZ(var z:complex;r,s:real);external;
-
- { z=v+-*/w }
-
- procedure CPLUS(v,w:complex;var z:complex);external;
-
- procedure CMINUS(v,w:complex;var z:complex);external;
-
- procedure CMAL(v,w:complex;var z:complex);external;
-
- procedure CDURCH(v,w:complex;var z:complex);external;
-
- { Reziprokwert }
- procedure CREZI(var z:complex);external;
-
- function CBETRAG(z:complex):real;external;
-
- function CARG(z:complex):real;external;
-
- procedure CEXP(v:complex;var z:complex);external;
-
- procedure CLN(v:complex;var z:complex);external;
-
- procedure CSIN(v:complex;var z:complex);external;
-
- procedure CCOS(v:complex;var z:complex);external;
-
- procedure CTAN(v:complex;var z:complex);external;
-
- { z=v^r }
- procedure CHOCHR(v:complex;r:real;var z:complex);external;
-
- procedure CSQRT(v:complex;var z:complex);external;
-
- { rte Wurzel aus v }
- procedure CRWURZ(v:complex;r:real;var z:complex);external;
-
- procedure ARCCSIN(v:complex;var z:complex);external;
-
- procedure ARCCCOS(v:complex;var z:complex);external;
-
- procedure ARCCTAN(v:complex;var z:complex);external;
-
- { komplexe quadratische Gleichung x^2+p*x+q=0,
- Lösungen z,s }
- procedure CQUADGL(p,q:complex;var z,s:complex);external;
-
- { Input, Bildschirmausgabe, Druckerausgabe komplexe Zahl }
-
- procedure ICOM(var z:complex;c:string);external;
-
- procedure BCOM(z:complex;c:string);external;
-
- procedure PCOM(z:complex;c:string);external;
-
- {# Lösen von Polynomgleichungen bis zum Grade 4: }
-
- { die Lösung ist in lsg enthalten:
- lsg[ ,0]:Realteil
- lsg[ ,1]:Imaginärteil
- lsgan:Anzahl der Lösungen
- lsgan<0:keine Lösung
- lsgan=0:Lösung beliebig }
-
- procedure LINGL(A,B:real;var lsg:polygl;var lsgan:integer);external;
-
- procedure QUADGL(A,B,C:real;var lsg:polygl;var lsgan:integer);external;
-
- procedure KUBGL(D,A,B,C:real;var lsg:polygl;var lsgan:integer);external;
-
- procedure VIERGL(E,A,B,C,D:real;var lsg:polygl;var lsgan:integer);external;
-
- { Formatierte Ausgabe der gefundenen Lösungen }
- procedure AUSLSG(lsgan:integer;lsg:polygl);external;
-
- {# Sammlung aller function und procedure aus MATHLIB2:
- # Lösen von Gleichungssystemen : }
-
- { Lgs nach dem Gaussvefahren mit Zeilenpivotsuche: }
- procedure LGSGAUSS (n:integer;a:realmat;b:realvec;
- var x:realvec;var erfolg:boolean);external;
-
- { loest ein GLS nach dem allgemeinen Newtonverfahren:
- h: Schrittweite fuer die partiellen Ableitungen
- Abbruchkriterien:
- epsdx: Grenze fuer den Bertrag des Aenderungsvektors dx
- epsf: Grenze fuer den Betrag des Funktionenvektors f
- maxit: Groesstmoegliche Anzahl der Iterationen
- konv=false bei - Iterationen>maxit
- - dx0>dx1>dx2 oder f0>f1>f2
- - LGS fuer dx singulaer
- Vereinbarung der Funktionen :procedure FUNKVEC(var f:realvec;x:realvec);}
- procedure GENEWTON(procedure FUNKVEC(var f:realvec;x:realvec);
- n:integer;var x:realvec;
- h,epsdx,epsf:real;maxit:integer;var konv:boolean);
- external;
-
- {# Hilfsprocedures für Matrizen:}
-
- { füllt eine Matrix mit w; a:n x m -Matrix }
- procedure FILLMAT(var a:realmat;n,m:integer;w:real);external;
-
- { erzeugt Einheitsmatrix, soweit als möglich; a:n x m -Matrix }
- procedure EINHEITSMAT(var a:realmat;n,m:integer);external;
-
- { Matrix a= Matrix b; a,b:n x m -Matrizen }
- procedure LETMAT(var a:realmat;b:realmat;n,m:integer);external;
-
- { negiert Matrix; a:n x m -Matrix }
- procedure NEGMAT(var a:realmat;n,m:integer);external;
-
- { transponiert Matrix, soweit als möglich; a:n x m -Matrix }
- procedure TRANSMAT(var a:realmat;n,m:integer);external;
-
- { Matrizenaddition, c=a+b; a,b,c:n x m -Matrizen }
- procedure ADDMAT(a,b:realmat;var c:realmat;n,m:integer);external;
-
- { Matrizensubtraktion, c=a-b; a,b,c:n x m -Matrizen }
- procedure SUBMAT(a,b:realmat;var c:realmat;n,m:integer);external;
-
- { Matrizenmultiplikation, c=a*b;
- a:n x m -Matrix, b:m x l -Matrix, c:l x m -Matrix }
- procedure MATMULMAT(a,b:realmat;var c:realmat;n,m,l:integer);external;
-
- { Multipliziert Matrix mit Vektor c=a*b;
- a:n x m -Matrix, b:n -Vector, c:m -Vector }
- procedure MATMULVEC(a:realmat;b:realvec;var c:realvec;n,m:integer);external;
-
- { Multipliziert Matrix a mit Faktor w; a:n x m -Matrix }
- procedure FACMULMAT(var a:realmat;n,m:integer;w:real);external;
-
- { Berechnet Obere Dreiecksmatrix mit elementaren Umformungen;
- a:n x n -Matrix }
- procedure ODREIMAT(var a:realmat;n:integer);external;
-
- { Berechnet Determinante; a:n x n -Matrix }
- procedure DETERMINANTE(a:realmat;n:integer;var det:real);external;
-
- { Invertiert Matrix (falls möglich) nach dem Sweeping-Out-Verfahren }
- procedure SWEEPOUT(var a:realmat;n:integer;gelungen:boolean);external;
-
- { Invertiert Matrix (falls möglich) nach dem Stiefel-Verfahren,
- langsamer aber genauer als SWEEPOUT }
- procedure STIEFEL(var a:realmat;n:integer;var gelungen:boolean);external;
-
- {# Differentiation einer function X(t:real):real; }
-
- { Berechnet die Ableitung Nr.abl (abl<=4) im Punkt t einer Funktion
- mit der Schrittweite h, die Ableitung steht in xp }
- procedure DIFFERPUNKT(function X(t:real):real;
- t,h:real;var abl:integer;var xp:real);external;
-
- { Wie vor, jedoch wird ein Intervall ta,te mit der Unterteilung intv
- berechnet die intv+1 Ableitungswerte stehen in xp.
- Achtung: intv darf nicht grösser sein als die Dimension von REALVEC,
- soll die Unterteilung feiner sein, einfach DIFFERINTV mehrmals
- aufrufen }
- procedure DIFFERINTV(function X(t:real):real;
- ta,te:real;var abl:integer;intv:integer;
- var xp:realvec);external;
-
- {# Das bestimmte Integral der
- # function X(t:real):real;
- # in den Grenzen ta,tb; Anzahl der Berechnungsschritte iv }
- procedure WEDDLER(ta,tb:real;iv:integer;var w:real);external;
-
- {# Lösen von Differentialgleichungssystemen : }
-
- { Runge-Kutta-Verfahren 4./7. Ordnung :
- Eingabe n: Dimension-1
- ta,te: Intervallgrenzen
- h: Schrittweite
- xa: Anfangswerte x(ta)
- Ausgabe xa: Endwerte x(te) }
-
- procedure RK4(procedure F(t:real;x:realvec;var dx:realvec);
- n:integer;ta,te,h:real;var xa:realvec);external;
-
- procedure RK7(procedure F(t:real;x:realvec;var dx:realvec);
- n:integer;ta,te,h:real;var xa:realvec);external;
-
- {# Das war's & viel Spaß: Magnus Knobel, Rotkreuzstr. 51 A, 8058 Erding #}
-