|
Numeric Library / Referenz |
|
Omikron Basic im Internet: http://www.berkhan.de |
|
|
2. Numeric Library Referenz
| In diesem Abschnitt sollen die Prozeduren und Funktionen der Numeric Library erläutert werden. Der theoretische Hintergrund der einzelnen Befehle kann jedoch hier nicht erläutert werden. Für den sinnvollen Einsatz der Library ist es daher empfehlenswert, zusätzliche Literatur zu verwenden. Dabei möchten wir besonders auf das Buch "Numerical Recipes" hinweisen, das viele Aspekte der numerischen Mathematik sehr ausführlich und praxisbezogen darstellt. |
| 2.1 An- und Abmelden der Library | ||||
|
||||
| Num_Exit | |
| Rufen Sie diese Prozedur am Ende Ihres Programms einmal auf. Danach können Sie die Numeric Library nicht mehr benutzen. |
| Numeric | |
| Es wird nur eine Copyright-Meldung der Numeric Library ausgegeben. |
| Num_Mode M | |
| M | Betriebsart: M=0 : Fehlermeldungen anzeigen. M=1 : Fehlermeldungen unterdrücken. |
| Mit dieser Prozedur können Sie die Betriebsart der Numeric Library einstellen. Wenn ein Fehler auftritt, wird dieser normalerweise in einer Alertbox angezeigt. Mit M=1 können Sie die Anzeige unterdrücken, z.B. um selbst eine Fehlerbehandlung durchzuführen. | |
| FN Num_Error | |
| Liefert die Nummer des zuletzt aufgetretenen Fehlers. Wenn Sie die automatischen Fehlermeldungen
mit Num_Mode 1 abgeschaltet haben, können Sie diese Funktion verwenden, um herauszufinden, welcher Fehler
aufgetreten ist. Im einzelnen sind folgende Fehlernummern möglich: 0 : Kein Fehler. 1 : FN Li#(N,X#) arbeitet nur mit N=1 oder N=2. 2 : FN Bessel#(N,X#) arbeitet nur mit N>=0. 3 : FN Weber#(N,X#) arbeitet nur mit N>=0. 4 : FN Mod_Bessel#(N,X#) arbeitet nur mit N>=0. 5 : FN Macdo#(N,X#) arbeitet nur mit N>=0. 6 : FN Zero# konnte keine Nullstelle finden. 7 : FN Minimum# konnte kein Minimum finden. 8 : FN Maximum# konnte kein Maximum finden. 9 : PROC Eigen arbeitet nur mit symmetrischen Matrizen. 10 : Eigenwertberechnung in PROC Eigen konvergiert nicht. 11 : Das Gleichungssystem in PROC Gauss hat keine Lösung, da die Matrix singulär ist. 12 : PROC Gauss_Seidel konvergiert nicht. 13 : Die Anzahl der Gleichungen ist nicht sinnvoll in PROC Band. 14 : PROC Newton_Sys konvergiert nicht. 15 : Zu wenig Stützpunkte in PROC Spline_Int. 16 : PROC Gauss_Fit konvergiert nicht. 17 : Fehler in PROC Fft. Verwenden Sie für N nur gerade, positive Zahlen! 18 : PROC Mean_Approx konvergiert nicht. 19 : Zu wenig Daten in PROC Derive (N>=7). 20 : Zu wenig Daten in FN Newton_Cotes (N>=5). 21 : FN Romberg konvergiert nicht. 22 : FN Romberg_2 konvergiert nicht. 23 : Ungültiger Parameter in FN Gauss_Leg# (2<=N<=15). |
| 2.2 Spezielle Funktionen |
| Achtung: Nicht alle Funktionen können exakt berechnet
werden. Viele Funktionen haben an einigen Stellen Singularitäten, müssen über Polynom-Interpolationen
oder rekursiv berechnet werden. Da die Genauigkeit von Fließkomma-Zahlen begrenzt ist, kann es zur Aufschaukelung
von Fehlern kommen, so daß die Ergebnisse völlig falsch werden. Z.B. liefert die modifizierte Bessel-Funktion
für N=100 in der Umgebung von X#=0 völlig falsche Ergebnisse. Für normale Anwendung sind die Funktionen
jedoch ohne Probleme zu verwenden und liefern recht genaue Funktionswerte. Tip: Setzen Sie in der Testphase das Steuerwort COMPILER "DEBUG ON". Dann werden Sie auf problematische Stellen aufmerksam gemacht, da alle Prozessor-Exceptions gemeldet werden. |
| FN Atn2#(X#,Y#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Y# | Fließkommazahl -INF<Y#<INF AND Y#<>0 |
| Berechnet den zweiwertigen Arcus Tangens (ARCTAN(X#/Y#)). Dabei wird je nach Vorzeichen von X#
und Y# der Quadrant so ausgewählt, daß
das Ergebnis im Intervall [-PI,PI] liegt. Diese
Funktion eignet sich daher z.B. sehr gut, um kartesische Koordinaten in Polarkoordinaten umzurechnen. Hinweis: Die BASIC Funktion ARCTAN(X#/Y#) liefert nur Ergebnisse im Intervall [-PI/2,PI/2] und stimmt daher nur für positive X# mit FN Atn2# überein. |
|
| FN Hypot#(X#,Y#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Y# | Fließkommazahl -INF<Y#<INF |
| Berechnet SQR(X#^2+Y#^2). Die Berechnung erfolgt direkt, also ohne erst die Summe der Quadrate zu bilden. Dadurch kommt es nicht so leicht zu einem Overflow, wie bei einer direkten Auswertung der Formel. | |
| FN Compound#(X#,Y#) | |
| X# | Fließkommazahl 0<X#<INF |
| Y# | Fließkommazahl 0<Y#<INF |
| Berechnet (1+X#)^Y#. Für kleine X# liefert diese Funktion genauere Werte als eine direkte Auswertung der Formel. Diese Funktion ist besonders für kaufmännische Anwendungen wichtig. | |
| FN Annuity#(X#,Y#) | |
| X# | Fließkommazahl 0<X#<INF |
| Y# | Fließkommazahl 0<Y#<INF |
| Berechnet (1-(1+X#)^(-Y#)/X#. Für kleine X# liefert diese Funktion genauere Werte als eine direkte Auswertung der Formel. Diese Funktion ist besonders für kaufmännische Anwendungen wichtig. | |
| FN Exp2#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet 2^X#. | |
| FN Expm1#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet EXP(X#)-1. Für kleine X# liefert diese Funktion genauere Werte als eine direkte Auswertung der Formel. | |
| FN Lnp1#(X#) | |
| X# | Fließkommazahl -1<X#<INF |
| Berechnet LN(X#+1). Für kleine X# liefert diese Funktion genauere Werte als eine direkte Auswertung der Formel. | |
| FN Erf#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet (2/PI)*INTEGRAL[0,X#]EXP((-t)^2)dt. Dieses Integral ist auch als Fehlerfunktion bekannt und hat in der Statistic und Wahrscheinlichkeitsrechnung eine große Bedeutung. | |
| FN Erfc#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet 1-FN Erf#(X#). Diese Funktion ist auch als komplementäre Fehlerfunktion bekannt und hat in der Statistic und Wahrscheinlichkeitsrechnung eine große Bedeutung. Für große positive Zahlen (ab 10) liefert diese Funktion genauere Ergebnisse als eine direkte Auswertung der Formel. | |
| FN Gamma#(X#) | |
| X# | Fließkommazahl -INF<X#<INF AND X#<>0,-1,-2,-3 ... |
| Berechnet INTEGRAL[0,INF]EXP(-t)*t^(X#-1)dt. Dieses Integral ist auch als Gammafunktion bekannt. Diese Funktion hat Singularitäten bei null und allen negativen ganzen Zahlen. Mit der Fakultätsfunktion des Omikron Basics gibt es den Zusammmenhang: FN Gamma#(X#)=FACT(X#-1). | |
| FN Lgamma#(X#) | |
| X# | Fließkommazahl -INF<X#<INF AND X#<>0,-1,-2,-3 ... |
| Berechnet LN(ABS(FN Gamma#(X#)). Weil die Gammafunktion sehr schnell gegen unendlich strebt, ist es häufig von Vorteil, mit dem Logarithmus der Gammafunktion zu arbeiten, um einen Overflow zu vermeiden. | |
| FN Hermite#(N,X#) | |
| N | Grad des Polynoms 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet den Wert des Hermite-Polynoms vom Grade N an der Stelle X#. | |
| FN Cheby#(N,X#) | |
| N | Grad des Polynoms 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet den Wert des Tschebyscheff-Polynoms vom Grade N an der Stelle X#. Verwechseln Sie diese Funktion nicht mit der zur Tschebyscheff-Approximation, die weiter unten besprochen wird. | |
| FN Legendre#(N,X#) | |
| N | Grad des Polynoms 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet den Wert des Legendre-Polynoms vom Grade N an der Stelle X#. | |
| FN Legendre_D#(N,X#) | |
| N | Grad des Polynoms 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF AND X#<>-1 AND X#<>1 |
| Berechnet den Wert der Ableitung des Legendre-Polynoms vom Grade N an der Stelle X#. Diese wird auch als Gegenbauer-Polynom bezeichnet. | |
| FN Horner#(&A#(),N,X#) | |
| A#(0:N) | Koeffizienten der ganzrationalen Funktion. |
| N | Grad der Funktion 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet den Wert der ganzrationalen Funktion A#(N)*X#^N+A#(N-1)*X#^(N-1)+...+A#(1)*X#+A#(0) an der Stelle X#. |
|
| FN Horner_D#(&A#(),N,X#) | |
| A#(0:N) | Koeffizienten der ganzrationalen Funktion. |
| N | Grad der Funktion 0<=N<INF |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet den Wert der Ableitung der ganzrationalen Funktion A#(N)*X#^N+A#(N-1)*X#^(N-1)+...+A#(1)*X#+A#(0)an der Stelle X#. |
|
| FN Beta#(X#,Y#) | |
| X# | Fließkommazahl -INF<X#<INF AND X#<>0,-1,-2,-3 ... |
| Y# | Fließkommazahl -INF<Y#<INF AND X#<>0,-1,-2,-3 ... |
| Berechnet die Beta-Funktion. Es gilt die Beziehung: FN Beta#(X#,Y#)=FN Gamma#(X#)*FN Gamma#(Y#)/FN Gamma#(X#+Y#) |
|
| FN Zeta#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet die Riemannsche Zeta-Funktion. | |
| FN Kappa#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet die Kappa-Funktion. | |
| FN Eta#(X#) | |
| X# | Fließkommazahl -INF<X#<INF |
| Berechnet die Eta-Funktion. | |
| FN Li#(N,X#) | |
| N | Ordnung des Polylogarithmus 1<=N<=2 |
| X# | Fließkommazahl -1<=X#<INF |
| Berechnet den Wert des Polylogarithmus der Ordnung N an der Stelle X#. | |
| FN Chi#(N,X#) | |
| N | Ordnung der Chi-Funktion 1<=N<=2 |
| X# | Fließkommazahl -1<=X#<INF |
| Berechnet den Wert der Chi-Funktion der Ordnung N an der Stelle X#. | |
| FN Bessel#(N,X#) | |
| N | Ordnung der Bessel-Funktion 0<=N |
| X# | Fließkommazahl -INF<=X#<INF |
| Berechnet den Wert der Bessel-Funktion der Ordnung N an der Stelle X#. | |
| Im Ordner DEMO finden Sie das Programm "Bessel.BAS", mit dem Sie alle Besselfunktionen graphisch darstellen können. | |
| FN Weber#(N,X#) | |
| N | Ordnung der Weber-Funktion 0<=N |
| X# | Fließkommazahl 0<X#<INF |
| Berechnet den Wert der Weber-Funktion der Ordnung N an der Stelle X#. Die Weber-Funktion wird in der Literatur auch häufig als Bessel-Funktion 2. Art bezeichnet. | |
| Im Ordner DEMO finden Sie das Programm "Bessel.BAS", mit dem Sie alle Besselfunktionen graphisch darstellen können. | |
| FN Mod_Bessel#(N,X#) | |
| N | Ordnung der modifizierten Bessel-Funktion 0<=N |
| X# | Fließkommazahl -INF<=X#<INF |
| Berechnet den Wert der modifizierten Bessel-Funktion der Ordnung N an der Stelle X#. | |
| Im Ordner DEMO finden Sie das Programm "Bessel.BAS", mit dem Sie alle Besselfunktionen graphisch darstellen können. | |
| FN Macdo#(N,X#) | |
| N | Ordnung der MacDonald-Funktion 0<=N |
| X# | Fließkommazahl 0<X#<INF |
| Berechnet den Wert der MacDonald-Funktion der Ordnung N an der Stelle X#. Die MacDonald-Funktion wird in der Literatur auch häufig als modifizierte Bessel-Funktion 2. Art bezeichnet. | |
| Im Ordner DEMO finden Sie das Programm "Bessel.BAS", mit dem Sie alle Besselfunktionen graphisch darstellen können. | |
| 2.3 Berechnung von Nullstellen und Extremwerten |
| Nullstellen und Extremwerte sind in den meisten Fällen nur schwer analytisch zu finden. Darum haben wir einige Funktionen in die Numeric Library implementiert, die derartige Probleme mit iterativen Methoden lösen. |
| FN Zero#(&FN Fun#(0,0),I,X0#,X1#) | |
| Fun#(I,X#) | Dies ist die Funktion, deren Nullstelle berechnet werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| X0# | Linke Grenze des Intervalls, in dem die Nullstelle liegt. |
| X1# | Rechte Grenze des Intervalls, in dem die Nullstelle liegt. |
| Diese Funktion sucht eine Nullstelle einer beliebigen Funktion mit Hilfe der Sekantenmethode. Dabei werden die Funktionswerte von X0# und X1# als Startwerte benutzt. Wenn nach 100 Schritten keine Nullstelle gefunden wurde, erzeugt FN Zero# eine Fehlermeldung und bricht ab. Als Funktionswert wird in diesem Fall NAN (Not A Number) zurückgegeben. | |
| Beispiel: Es soll die Stelle berechnet werden, an der SIN(3*X#)=COS(5*X#) ist. Diese Gleichung formen wir zuerst in die Form SIN(3*X#)-COS(5*X#)=0 um. Als Grenzen des Suchintervalls nehmen wir X0#=0 und X1#=PI. Damit sieht das Programm wie folgt aus: Num_Init PRINT FN Zero#(&FN Trig#(0,0),0,0,PI) INPUT "Ende mit [Return]";Dummy Num_Exit END DEF FN Trig#(I,X#)=SIN(3*X#)-COS(5*X#) Wenn Sie alles richtig gemacht haben, müssten Sie als Wert 2.356... erhalten. |
| FN Minimum#(&FN Fun#(0,0),I,E#,S#) | |
| Fun#(I,X#) | Dies ist die Funktion, deren Minimum berechnet werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| E# | Schätzwert für die Lage des Minimums. |
| S# | Schrittweite, mit der die Suche beginnen soll. Ein typischer Wert ist z.B. S#=5. |
| Diese Funktion sucht ein Minimum nach der Methode der parabolischen inversen Interpolation. Dabei wird mit dem übergebenen Schätzwert E# und der Schrittweite S# begonnen. Wenn nach 200 Schritten kein Minimum gefunden wurde, erzeugt FN Minimum# eine Fehlermeldung und bricht ab. Als Funktionswert wird in diesem Fall NAN (Not A Number) zurückgegeben. | |
| Beispiel: Es soll das Minimum der Funktion X#^4-10*X#^2+5*X# in der Nähe von 2 gefunden werden: Num_Init PRINT FN Minimum#(&FN Poly#(0,0),0,2,1) INPUT "Ende mit [Return]";Dummy Num_Exit END DEF FN Poly#(I,X#)=X#^4-10*X#^2+5*X# Wenn Sie alles richtig gemacht haben, müssten Sie als Wert 2.098... erhalten. |
| FN Maximum#(&FN Fun#(0,0),I,E#,S#) | |
| Fun#(I,X#) | Dies ist die Funktion, deren Maximum berechnet werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| E# | Schätzwert für die Lage des Maximums. |
| S# | Schrittweite, mit der die Suche beginnen soll. Ein typischer Wert ist z.B. S#=5. |
| Diese Funktion sucht ein Maximum nach der Methode der parabolischen inversen Interpolation. Dabei wird mit dem übergebenen Schätzwert E# und der Schrittweite S# begonnen. Wenn nach 200 Schritten kein Maximum gefunden wurde, erzeugt FN Maximum# eine Fehlermeldung und bricht ab. Als Funktionswert wird in diesem Fall NAN (Not A Number) zurückgegeben. | |
| 2.4 Berechnung von Eigenwerten und Lösen von Gleichungssystemen. |
| Gleichungen und Gleichungssysteme können in den meisten Fällen nur schwer analytisch gelöst werden. Entweder ist es überhaupt nicht möglich, eine analytische Lösung zu finden, oder die auftretenden Gleichungen sind sehr komplex und nur noch schwer zu handhaben. Darum haben wir einige Funktionen in die Numeric Library implementiert, die derartige Gleichungen zumindest näherungsweise lösen. |
| Eigen &M#(,),N,&E#() | |
| M#(0:N,0:N) | In diesem Feld müssen die Elemente der Matrix übergeben werden. Nach der Rückkehr enthält dieses Feld die Eigenvektoren. Wenn Sie Ihre Matrix später im Programm noch benötigen, müssen Sie diese zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| N | Höchster Index der Matrix (Dimension minus eins). |
| E#(0:N) | Nach der Rückkehr enthält dieses Feld die Eigenwerte. |
| Diese Prozedur berechnet die Eigenwerte einer reellen symmetrischen Matrix. Wenn die Matrix nicht symmetrisch ist oder der Algorithmus nicht konvergiert, erhalten Sie eine Fehlermeldung. | |
| Beispiel: Es sollen die Eigenwerte der Matrix berechnet werden, deren Elemente in der DATA Zeile angegeben sind: Num_Init -Matrix DATA 2,-1,2,-1,2,-2,2,-2,5 DIM M#(2,2),E#(2) RESTORE Matrix PRINT "Matrix:" FOR J=0 TO 2 FOR I=0 TO 2 READ M#(J,I):PRINT M#(J,I), NEXT I:PRINT NEXT J Eigen &M#(,),2,&E#() PRINT:PRINT "Eigenwerte:" FOR I=0 TO 2:PRINT E#(I):NEXT I INPUT "Ende mit [Return]";Dummy Num_Exit END |
| Gauss &M#(,),&C#(),N,&X#(),R D# | |
| M#(0:N,0:N) | In diesem Feld müssen die Koeffizienten des Gleichungssystems in Form einer Matrix übergeben werden. Wenn Sie Ihre Matrix später im Programm noch benötigen, müssen Sie diese zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| C#(0:N) | Dieses Feld muß die konstanten Werte auf der rechten Seite des Gleichungssystems enthalten. Wenn Sie diese Feld später im Programm noch benötigen, müssen Sie es zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| N | Höchster Index der Felder (Anzahl der Gleichungen minus eins). |
| X#(0:N) | Nach der Rückkehr enthält dieses Feld den Lösungsvektor. |
| D# | In dieser Variablen wird die Determinante zurückgegeben. |
| Diese Prozedur berechnet den Lösungsvektor X#(), der das Gleichungssystem A#(,)*X#()=C#() erfüllt. Dabei wird das Verfahren von Gauss mit Pivotisierung verwendet, um den rechnerbedingten Rundungsfehler gering zu halten. | |
| Beispiel: Es soll das Gleichungssystem 3*X0#+4*X1#=11 2*X0#-X1#=0 gelöst werden: |
| Num_Init -Equation DATA 3,4,11,2,-1,0 DIM M#(1,1),C#(1),X#(1) RESTORE Equation FOR J=0 TO 1 FOR I=0 TO 1 READ M#(J,I) NEXT I READ C#(J) NEXT J Gauss &M#(,),&C#(),1,&X#(),D# PRINT:PRINT "Die Lösung lautet:" PRINT "X0#=";X#(0) PRINT "X1#=";X#(1) PRINT "Determinante D#=";D# INPUT "Ende mit [Return]";Dummy Num_Exit END |
| Gauss_Seidel &M#(,),&C#(),N,&X#() | |
| M#(0:N,0:N) | In diesem Feld müssen die Koeffizienten des Gleichungssystems in Form einer Matrix übergeben werden. |
| C#(0:N) | Dieses Feld muß die konstanten Werte auf der rechten Seite des Gleichungssystems enthalten. |
| N | Höchster Index der Felder (Anzahl der Gleichungen minus eins). |
| X#(0:N) | In diesem Feld müssen Sie eine genäherte Lösung übergeben. Nach der Rückkehr enthält dieses Feld den verbesserten Lösungsvektor. |
| Diese Prozedur berechnet den Lösungsvektor X#(), der das Gleichungssystem A#(,)*X#()=C#()
erfüllt. Bei sehr großen Gleichungssystemen (100 oder mehr Variablen) benötigt der Gauss-Algorithmus
eine zu lange Rechenzeit und der Rundungsfehler wird zu groß. In diesen Fällen ist es besser, ein Iterationsverfahren
wie das von Gauss und Seidel zu verwenden, besonders wenn man schon ungefähre Werte für den Lösungsvektor
kennt. Natürlich ist es auch möglich, dieses Verfahren dem Gauss-Algorithmus nachzuschalten und dadurch den Rundungsfehler zu verringern. Achtung: Da das Gauss-Seidel-Verfahren iterativ arbeitet, kann es sein, daß es nicht konvergiert. Dieser Effekt tritt besonders dann auf, wenn kein genäherter Lösungsvektor übergeben wird. Wenn der Algorithmus nicht konvergiert, erhalten Sie eine Fehlermeldung. |
|
| Band &M#(,),N,K,&X#() | |
| M#(0:N,0:2*K+1) | In diesem Feld müssen die Koeffizienten des Gleichungssystems übergeben werden. Bitte beachten Sie, daß in der letzten Spalte die konstanten Werte von der rechten Seite des Gleichungssystems übergeben werden müssen. Wenn Sie dieses Feld später im Programm noch benötigen, müssen Sie es zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| N | Höchster Index der Felder (Anzahl der Gleichungen minus eins). |
| K | Abstand des am weitesten von der Hauptdiagonalen entfernten Elements, das ungleich null ist. |
| X#(0:N) | Nach der Rückkehr enthält dieses Feld den Lösungsvektor. |
| Diese Prozedur berechnet den Lösungsvektor X#(), der das Gleichungssystem A#(0:N,0:N)*X#(0:N)=A#(0:N,N+1) erfüllt. In der Praxis treten häufig Gleichungssysteme auf, bei denen die Koeffizienten-Matrix nur in der Nähe der Hauptdiagonalen von null verschiedene Elemente enthält. Solche Matrizen bezeichnet man als Bandmatrizen mit der Breite K. Ein solches Gleichungssystem läßt sich mit der Prozedur Band viel schneller lösen als mit dem Gauss-Verfahren, da überflüssige Rechenoperationen mit den Nullen der Matrix vermieden werden. Der Vorteil ist umso größer, je größer die Matrix und je schmaler das Band im Verhältnis zur Dimension der Matrix ist. |
|
| Beispiel: Es soll das folgende Gleichungssystem gelost werden: 2*X0#+9*X1#=1 2*X0#-3*X1#+12*x2#=2 8*X1#+3*X2#-5*X3#=3 6*X2#+4*X3#+X4#=4 X3#-2*X4#=-5 Wie man leicht erkennt, sind nur die Elemente auf der Hauptdiagonalen, sowie Elemente rechts und links davon ungleich null. Die Koeffizienten-Matrix kann daher auf eine Band-Matrix mit 3 Spalten reduziert werden. In der vierten Spalte werden dann noch die konstanten Elemente von der rechten Seite des Gleichungssystems eingetragen. Daher ergibt sich mit K=1 folgendes Programm: Num_Init -Band DATA 0,2,9,1 DATA 2,-3,12,2 DATA 8,3,-5,3 DATA 6,4,1,4 DATA 1,-2,0,-5 DIM M#(4,3),X#(4) RESTORE Band FOR J=0 TO 4 FOR I=0 TO 3 READ M#(J,I) NEXT I NEXT J Band &M#(,),4,1,&X#() PRINT:PRINT "Die Lösung lautet:" FOR I=0 TO 4 PRINT "X"+MID$(STR$(I),2)+"#=";X#(I) NEXT I INPUT "Ende mit [Return]";Dummy Num_Exit END |
| Newton_Sys &FN Fun#(0),&X#(),N | |
| Fun#(I) | Durch diese Funktion definieren Sie das Gleichungssystem, das gelöst werden soll. Diese Funktion
müssen Sie natürlich selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, der die Nummer der Gleichung identifiziert. Die Gleichung muß so umgeformt sein, daß auf der rechten Seite eine 0 steht. Ihre Funktion muß dann den Funktionswert der linken Seite zurückliefern. |
| X#(0:N) | In diesem Feld sollten Sie eine genäherte Lösung übergeben, falls diese bekannt ist. Nach der Rückkehr enthält dieses Feld den Lösungsvektor. |
| N | Höchster Index des Feldes (Anzahl der Gleichungen minus eins). |
| Diese Prozedur löst ein nichtlineares Gleichungssystem nach dem Newton-Verfahren. Wenn nach 100 Schritten keine Lösung gefunden wurde, erzeugt Newton_Sys eine Fehlermeldung und bricht ab. | |
| Beispiel: Es soll das nichtlineare Gleichungssystem X0#*X1#-5*X1#-5=0 X0#-2+X1#*COS(X2#)=0 SIN(X0#+3*X2#)=0 gelöst werden: |
| Num_Init DIM X#(2) Newton_Sys &FN Equation#(0),&X#(),2 PRINT:PRINT "Die Lösung lautet:" FOR I=0 TO 2 PRINT "X"+MID$(STR$(I),2)+"#=";X#(I) NEXT I PRINT:INPUT "Ende mit [Return]";Dummy Num_Exit END DEF FN Equation#(I):LOCAL X# SELECT I CASE 0:X#=X#(0)*X#(1)-5*X#(1)-5 CASE 1:X#=X#(0)-2+X#(1)*COS(X#(2)) CASE 2:X#=SIN(X#(0)+3*X#(2)) END_SELECT RETURN X# |
| 2.5 Interpolation |
| Oft kommt es vor, daß von einer benötigten Funktion nur tabellierte Werte bekannt sind.
In solchen Fällen bietet es sich an, die Zwischenwerte durch Interpolation mit einer bekannten Funktion zu
ermitteln. Die Numeric Library bietet Ihnen diverse Prozeduren und Funktionen, die für fast alle Interpolationsprobleme
geeignet sind. Bitte denken Sie aber immer daran, daß eine Interpolation nicht notwendigerweise die richtigen Zwischenwerte liefert. Z. B. können nicht differenzierbare oder gar unstetige Funktionen dadurch überhaupt nicht korrekt dargestellt werden. |
| Lagrange_Int &X#(,),N,&C#() | |
| X#(0:N,0:1) | In diesem Feld übergeben Sie die Stützstellen. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. |
| N | Höchster Index der Felder (Anzahl der Stützpunkte minus eins). |
| C#(0:N) | Nach der Rückkehr enthält dieses Feld die Koeffizienten des Interpolationspolynoms. Zur Berechnung der Interpolationsfunktion muß dieses Feld an FN Lagrange# übergeben werden. |
| Die Lagrange-Interpolation ist ein sehr gutes Verfahren, weil es im Gegensatz zu anderen auch nicht äquidistante Werte zuläßt. Bei sehr vielen Stützpunkten beginnt das Interpoaltionspolynom allerdings an den Intervallenden zu schwingen, wodurch die Qualität der Interpolation verschlechtert wird. | |
| Im Ordner DEMO finden Sie das Programm "Interpolation.BAS", mit dem Sie selbstgewählte Stützpunkte mit den verschiedenen Verfahren interpolieren können. |
| FN Lagrange# X#,&X#(,),N,&C#() | |
| X# | An dieser Stelle wird der Funktionswert der Lagrange-Interpolation berechnet. X# muß natürlich innerhalb des Intervalls liegen, in dem die Funktionswerte bekannt sind, sonst erhalten Sie unsinnige Ergebnisse. |
| X#(0:N,0:1) | Hier müssen Sie das gleiche Feld mit den Stützstellen wie bei der Prozedur Lagrange_Int übergeben. |
| N | Höchster Index der Felder (Anzahl der Stützpunkte minus eins). |
| C#(0:N) | Dieses Feld muß die Koeffizienten des Interpolationspolynoms enthalten. Es ist genau das Feld, das Sie von Lagrange_Int zurückerhalten haben. |
| Diese Funktion dient dazu, die Werte des Interpolationspolynoms zu berechnen. In der Praxis rufen Sie also zuerst die Prozedur Lagrange_Int auf, um die Koeffizienten des Interpolationspolynoms zu ermitteln und berechnen dann mit FN Lagrange# die Zwischenwerte. | |
| Spline_Int &X#(,),N,&C#(,) | |
| X#(0:N,0:1) | In diesem Feld übergeben Sie die Stützstellen. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. |
| N | Höchster Index der Felder (Anzahl der Stützpunkte minus eins). |
| C#(0:N,0:3) | Nach der Rückkehr enthält dieses Feld die Koeffizienten der Interpolationspolynome (4 pro Stützstelle). Zur Berechnung der Interpolationsfunktion muß dieses Feld an FN Spline# übergeben werden. |
| Diese Prozedur berechnet eine kubische Spline-Interpolation. Dadurch, daß am Ende jedes Interpolationsintervalls
auch die Ableitung berücksichtigt wird, liefert die Spline-Interpolation einen sehr glatten Interpolationsverlauf.
Auch die Spline-Interpolation erlaubt unterschiedliche Abstände zwischen den Stützpunkten. Im Unterschied zur Lagrange-Interpolation wird durch die Verwendung von Polynomen dritten Grades, die an den Stützpunkten zusammengesetzt werden, das starke Schwingen der Polynome bei einer hohen Anzahl von Stützstellen vermieden. Die Spline-Interpolation hat die Eigenschaft, daß die Spannung in der Kurve minimal wird, die Kurve also einem durch die Stützpunkte gelegten elastischen Lineal (engl. spline) entspricht. |
|
| Im Ordner DEMO finden Sie das Programm "Interpolation.BAS", mit dem Sie selbstgewählte Stützpunkte mit den verschiedenen Verfahren interpolieren können. |
| FN Spline# X#,&X#(,),N,&C#() | |
| X# | An dieser Stelle wird der Funktionswert der Spline-Interpolation berechnet. X# muß natürlich innerhalb des Intervalls liegen, in dem die Funktionswerte bekannt sind, sonst erhalten Sie unter Umständen falsche Ergebnisse. |
| X#(0:N,0:1) | Hier müssen Sie das gleiche Feld mit den Stützstellen wie bei der Prozedur Spline_Int übergeben. |
| N | Höchster Index der Felder (Anzahl der Stützpunkte minus eins). |
| C#(0:N,0:3) | Dieses Feld muß die Koeffizienten des Interpolationspolynoms enthalten (4 pro Stützstelle). Es ist genau das Feld, das Sie von Spline_Int zurückerhalten haben. |
| Diese Funktion dient dazu, die Werte der Interpolation zu berechnen. In der Praxis rufen Sie also zuerst die Prozedur Spline_Int auf, um die Koeffizienten der Interpolationspolynome zu ermitteln und berechnen dann mit FN Spline# die Zwischenwerte. | |
| Gauss_Int &FN Fun#(0,0),I,&X#(,),N,&P#(),M | |
| Fun#(I,X#) | Dies ist eine Funktion mit M frei
wählbaren Parametern, die im Feld P#() stehen.
Diese Funktion müssen Sie natürlich selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| X#(0:N,0:2) | In diesem Feld übergeben Sie die Stützstellen. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. In X#(0:N,2) können Sie noch eine Fehlertoleranz für die einzelnen Stützpunkte angeben. Im allgemeinen kann X#(0:N,2)=1 gesetzt werden. |
| N | Höchster Index des Feldes X#(,) (Anzahl der Stützpunkte minus eins). |
| P#(0:M) | Nach der Rückkehr enthält dieses Feld die Parameter Ihrer Funktion. |
| M | Höchster Index des Feldes P#() (Anzahl der frei wählbaren Parameter der Funktion FN Fun minus eins). |
| Diese Prozedur passt eine von Ihnen definierte Funktion mit M+1 frei wählbaren Parametern an N+1
Stützpunkte an. Dabei wird die Methode der kleinsten Fehlerquadrate nach Gauss verwendet, d.h. die Summe aus
den Quadraten der Fehler an den Stützstellen wird minimiert. Auch die Gauss-Interpolation erlaubt unterschiedliche
Abstände zwischen den Stützpunkten. Hinweis: Wenn Ihre Funktion weniger frei wählbare Parameter hat, als Stützpunkte übergeben werden, läuft die Funktion im allgemeinen nicht durch die Stützpunkte. |
|
| Im Ordner DEMO finden Sie das Programm "Interpolation.BAS", mit dem Sie selbstgewählte Stützpunkte mit den verschiedenen Verfahren interpolieren können. |
| Fourier_Int &X#(,),N,X1#,X2#,&C#(),M | |
| X#(0:N,0:1) | In diesem Feld übergeben Sie die Stützstellen. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. |
| N | Höchster Index des Feldes X#(,) (Anzahl der Stützpunkte minus eins). |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:M+M) | Nach der Rückkehr enthält dieses Feld die Koeffizienten der trigonometrischen Interpolationsfunktion. Zur Berechnung der Funktionswerte muß dieses Feld an FN Fourier# übergeben werden. |
| M | Die Anzahl der trigonometrischen Terme. |
| Diese Prozedur berechnet die Koeffizienten einer Interpolationsfunktion, die aus Kosinus- und Sinus-Funktionen
besteht. Dieser Interpolationstyp eignet sich daher besonders zur Interpolation von Werten, die sich periodisch
wiederholen, wie zum Beispiel Töne. Die Interpolationsfunktion hat dabei die Form: C#(0)+C#(1)*COS(X#)+C#(2)*COS(2*X#)+ ... +C#(M)*COS(M*X#)+ ... +C#(M+1)*SIN(X#)+C#(M+2)*SIN(2*X#)+C#(M+M)*SIN(M*X#) mit X#=2*PI*X#/(X2#-X1#)-PI Achtung: Die Stützstellen müssen äquidistant sein. Bei periodischen Funktionen muß sich das Intervall über mindestens eine oder mehrere ganze Perioden erstrecken. |
|
| Im Ordner DEMO finden Sie das Programm "FourierInterpolation.BAS", das die Verwendung dieser Interpolationsmethode demonstriert. |
| FN Fourier# X#,X1#,X2#,&C#(),M | |
| X# | An dieser Stelle wird der Funktionswert der Fourier-Interpolation berechnet. Wenn eine nichtperiodische Punktreihe interpoliert werden soll, muß X# natürlich innerhalb des Intervalls liegen, in dem die Funktionswerte bekannt sind, sonst erhalten Sie unter Umständen falsche Ergebnisse. |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:M+M) | Dieses Feld muß die Koeffizienten der trigonometrischen Interpolationsfunktion enthalten. Es ist genau das Feld, das Sie von Fourier_Int zurückerhalten haben. |
| M | Die Anzahl der trigonometrischen Terme. |
| Diese Funktion dient dazu, die Werte der Interpolation zu berechnen. In der Praxis rufen Sie also zuerst die Prozedur Fourier_Int auf, um die Koeffizienten der trigonometrischen Terme zu ermitteln und berechnen dann mit FN Fourier# die Zwischenwerte. Bei periodischen Meßreihen gilt die Interpolation auch außerhalb des interpolierten Intervalls. | |
| Fourier_Int_Sin &X#(,),N,X1#,X2#,&C#(),M | |
| X#(0:N,0:1) | In diesem Feld übergeben Sie die Stützstellen. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. |
| N | Höchster Index des Feldes X#(,) (Anzahl der Stützpunkte minus eins). |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:M+M) | Nach der Rückkehr enthält dieses Feld die Koeffizienten der trigonometrischen Interpolationsfunktion. Zur Berechnung der Funktionswerte muß dieses Feld an FN Fourier_Sin# übergeben werden. |
| M | Die Anzahl der Sinus-Funktionen. |
| Diese Prozedur berechnet die Koeffizienten einer Interpolationsfunktion, die nur aus Sinus-Funktionen
und einem konstanten Term C#(0) besteht. Dieser
Interpolationstyp eignet sich daher besonders zur Interpolation von Werten, die sich periodisch wiederholen, wie
zum Beispiel Töne. Die Interpolationsfunktion hat dabei die Form: C#(0)+C#(1)*SIN(X#+C#(M+1))+C#(2)*SIN(2*X#+C#(M+2))+ ... +C#(M)*SIN(M*X#+C#(M+M) mit X#=2*PI*X#/(X2#-X1#)-PI Im Unterschied zu Fourier_Int enthält die Interpolationsfunktion nur die halbe Anzahl an trigonometrischen Funktionen; die Berechnug dürfte im allgemeinen also schneller erfolgen. Achtung: Die Stützstellen müssen äquidistant sein. Bei periodischen Funktionen muß sich das Intervall über mindestens eine oder mehrere ganze Perioden erstrecken. |
|
| Im Ordner DEMO finden Sie das Programm "FourierInterpolation.BAS", das die Verwendung dieser Interpolationsmethode demonstriert. |
| FN Fourier_Sin# X#,X1#,X2#,&C#(),M | |
| X# | An dieser Stelle wird der Funktionswert der Fourier-Sinus-Interpolation berechnet. Wenn eine nichtperiodische Punktreihe interpoliert werden soll, muß X# natürlich innerhalb des Intervalls liegen, in dem die Funktionswerte bekannt sind, sonst erhalten Sie unter Umständen falsche Ergebnisse. |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:M+M) | Dieses Feld muß die Koeffizienten der trigonometrischen Interpolationsfunktion enthalten. Es ist genau das Feld, das Sie von Fourier_Int_Sin zurückerhalten haben. |
| M | Die Anzahl der Sinus-Funktionen. |
| Diese Funktion dient dazu, die Werte der Interpolation zu berechnen. In der Praxis rufen Sie also zuerst die Prozedur Fourier_Int_Sin auf, um die Koeffizienten und Phasen der Sinus-Funktionen zu ermitteln und berechnen dann mit FN Fourier_Sin# die Zwischenwerte. Bei periodischen Meßreihen gilt die Interpolation auch außerhalb des interpolierten Intervalls. | |
| Fft &R#(),&I#(),N,Flag | |
| R#(0:N) | Realteile der komplexen Werte. Nach der Rückkehr enthält dieses Feld die Realteile der transformierten Werte. Wenn Sie die ursprünglichen Werte später im Programm noch benötigen, müssen Sie diese zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| I#(0:N) | Imaginärteile der komplexen Werte. Nach der Rückkehr enthält dieses Feld die Realteile der transformierten Werte. Wenn Sie die ursprünglichen Werte später im Programm noch benötigen, müssen Sie diese zuvor mit dem BASIC-Befehl MAT in ein anderes Feld kopieren. |
| N | Anzahl der Werte. Dies muß eine gerade Zahl sein. Hinweis: Die Prozedur arbeitet besonders schnell, wenn N eine Zweierpotenz ist, aber auch Zahlen, die sich gut in Faktoren von 2,3,4,5 zerlegen lassen, ergeben kurze Rechenzeiten. |
| Flag | Flag = 1 : Die normale Fourier-Transformation wird durchgeführt. Flag = -1 : Die inverse Fourier-Transformation wird durchgeführt. |
| Diese Prozedur führt eine diskrete Fourier-Transformation durch. Dabei werden im Prinzip folgende
Summen gebildet. Normale Fourier-Transformation: R#(I)=SUM[J=0,N-1]R#(J)*COS(2*PI*I/N)-I#(J)*SIN(2*PI*I/N) I#(I)=SUM[J=0,N-1]I#(J)*COS(2*PI*I/N)+R#(J)*SIN(2*PI*I/N) R#(N)=R#(0):I#(N)=I#(0) Inverse Fourier-Transformation: R#(I)=(SUM[J=0,N-1]R#(J)*COS(2*PI*I/N)+I#(J)*SIN(2*PI*I/N))/N I#(I)=(SUM[J=0,N-1]I#(J)*COS(2*PI*I/N)-R#(J)*SIN(2*PI*I/N))/N R#(N)=R#(0):I#(N)=I#(0) Die Prozedur arbeitet allerdings nach der Methode der schnellen Fourier-Transformation, wodurch die Berechnungszeit wesentlich kürzer ausfällt, als wenn man die obigen Summen direkt ausrechnen würde. |
|
| Im Ordner DEMO finden Sie das Programm "FFT.BAS", das die Verwendung dieser Prozedur demonstriert. |
| 2.6 Approximation von Funktionen durch Funktionensysteme |
| In vielen Fällen steht man vor dem Problem, daß eine Funktion zwar analytisch bekannt, die Auswertung jedoch schwierig ist. Dann bietet es sich an, die Funktion durch andere, einfachere Funktionen anzunähern. Die gängigsten Verfahren für diesem Zweck sind in der Numeric Library enthalten. |
| Cheby_App &FN Fun#(0,0),I,X1#,X2#,&C#(),N | |
| Fun#(I,X#) | Dies ist die Funktion, die approximiert werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:N) | Nach der Rückkehr enthält dieses Feld die Koeffizienten für die Tschebyscheff-Approximation. Zur Berechnung der Funktionswerte muß dieses Feld an FN Cheby# übergeben werden. |
| N | Höchster Index des Feldes C#() (Anzahl der Tschebyscheff-Polynome minus eins). |
| Diese Prozedur passt eine von Ihnen definierte analytische Funktion FN
Fun# an das orthogonale Funktionensystem aus Tschebyscheff-Polynomen an. Der Vorteil der Tschebyscheff-Approximation besteht darin, daß normalerweise nur wenige Koeffizienten benötigt werden, um eine sehr gute Approximation zu erreichen und das es sehr effiziente Verfahren gibt, die Tschebyscheff-Polynome schnell zu berechnen. Dazu können Sie die Funktion FN Cheby# verwenden. Hinweis: Da, anders als bei der weiter unten besprochenen Prozedur Mean_App, zur Berechnung der Koeffizienten keine Integrale ausgewertet werden müssen, sind für die Anzahl der Polynome auch größere Zahlen möglich (N > 100). Zwar dauert dann die Berechnung schon etwas länger, man erhält aber recht gute Ergebnisse. |
| Im Ordner DEMO finden Sie das Programm "Approximation.BAS", das die Verwendung dieser Prozedur zeigt. |
| FN Cheby# X#,X1#,X2#,&C#(),N | |
| X# | An dieser Stelle wird der Funktionswert der Tschebyscheff-Approximation berechnet. X# muß natürlich innerhalb des Intervalls liegen, in dem die Funktionswerte bekannt sind, sonst erhalten Sie unter Umständen falsche Ergebnisse. |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| C#(0:N) | Dieses Feld muß die Koeffizienten der Tschebyscheff-Approximationsfunktion enthalten. Es ist genau das Feld, das Sie von Cheby_App zurückerhalten haben. |
| N | Höchster Index des Feldes C#() (Anzahl der Tschebyscheff-Polynome minus eins). |
| Diese Funktion dient dazu, die Werte der Approximation zu berechnen. In der Praxis rufen Sie also
zuerst die Prozedur Cheby_App auf, um die
Koeffizienten der Tschebyscheff-Polynome zu ermitteln und berechnen dann mit FN
Cheby# die Approximationswerte. Verwechseln Sie diese Funktion nicht mit der oben besprochenen Funktion FN Cheby#(I,X#), die nur den Funktionswert eines ganz bestimmten Tschebyscheff-Polynoms berechnet. |
|
| Im Ordner DEMO finden Sie das Programm "Approximation.BAS", das die Verwendung dieser Prozedur zeigt. |
| Mean_App &FN Fun#(0,0),I,X1#,X2#,&FN Sys#(0,0),&C#(),N | |
| Fun#(I,X#) | Dies ist die Funktion, die approximiert werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| X1# | Linke Intervallgrenze. |
| X2# | Rechte Intervallgrenze. |
| Sys#(I,X#) | Dies ist das Funktionen-System, mit dem FN Fun# approximiert werden soll. Es muß aus N+1
Elementen bestehen und die Koeffizienten C#(0:N)
verwenden. Dieses Funktionensystem müssen Sie natürlich selbst definieren und dann die Adresse übergeben. |
| C#(0:N) | Nach der Rückkehr enthält dieses Feld die Koeffizienten für Ihr Funktionen-System. |
| N | Höchster Index des Feldes C#() (Anzahl der von Ihnen definierten Funktionen minus eins). |
| Diese Prozedur passt eine von Ihnen definierte analytische Funktion FN
Fun# an ein ebenfalls von Ihnen definiertes Funktionen-System FN
Sys# dergestalt an, daß das Fehlerquadrat-Integral minimal wird. Die angepasste Funktion
berechnet sich aus: C#(0)*FN Sys#(0,X#)+C#(1)*FN Sys#(1,X#)+ ... +C#(N)*FN Sys#(N,X#) Hinweis: Da zur Berechnung der Koeffizienten sehr viele Integrale ausgewertet werden müssen, kann die Rechenzeit bei größeren Funktionensystemen (N >> 10) schon recht lang werden. Außerdem können Zahlenbereichsüberschreitungen auftreten, die das Ergebnis völlig verfälschen. Sie sollten darum zumindest in der Testphase das Steuerwort COMPILER "DEBUG ON" setzen, auch wenn die Rechengeschwindigkeit dadurch etwas abnimmt. |
| Beispiel: Es soll die Eulersche Funktion (EXP(X#)) durch eine Potenzreihe approximiert werden: |
| Num_Init N=5 DIM C#(N) Mean_App &FN Euler#(0,0),0,-1,1,&FN Potenz_Sys#(0,0),&C#(),N PRINT:PRINT " X#";TAB(7);"Ausgangsfunktion"; PRINT TAB(27);"Approximation" FOR X#=-1 TO 1 STEP 0.1 PRINT USING "##.##";X#;TAB(6);USING "";EXP(X#); PRINT TAB(25);FN Potenz_App#(X#) NEXT X# PRINT:INPUT "Ende mit [Return]";Dummy Num_Exit END DEF FN Euler#(I,X#)=EXP(X#) DEF FN Potenz_Sys#(I,X#)=X#^I DEF FN Potenz_App#(X#):LOCAL I,Y#=0 FOR I=0 TO N Y#+=C#(I)*X#^I NEXT I RETURN Y# |
Wie Sie mit diesem Programm leicht ausprobieren können, ergibt N=5 bessere Approximationswerte als N=10. Bei N=15 ergeben sich schon flasche Werte, weil Rundungsfehler sich bei der Berechnung der Koeffizienten akkumulieren und bei N=20 kommt es bereits zu einem Underflow. Im Ordner DEMO finden Sie das Programm "Approximation.BAS", das ebenfalls die Verwendung dieser Prozedur zeigt. |
| 2.7 Numerische Differentiation |
| Dieses Kapitel beschäftigt sich mit der Ableitung von Funktionen. Die numerische Differentiation ist sehr empfindlich gegen Rundungsfehler. Die Ergebnisse können daher immer nur Näherungswerte sein. |
| FN Derivative &FN Fun#(0,0),I,X#[,D#] | |
| Fun#(I,X#) | Dies ist die Funktion, deren Ableitung berechnet werden soll. Diese Funktion müssen Sie natürlich
selbst definieren und dann die Adresse übergeben. In I wird Ihrer Funktion ein Parameter übergeben, den Sie für eigene Zwecke verwenden können, z.B. um verschiedene Varianten einer Funktion zu identifizieren. In X# wird das Argument übergeben, dessen Funktionswert Ihre Funktion zurückliefern muß. |
| I | Ein Index, der an FN Fun# übergeben wird. |
| X# | Die Stelle, an der die Ableitung berechnet werden soll. |
| D# | In diesem Parameter kann optional eine Intervallgrenze angegeben werden, bei der die Differentiation abgebrochen wird. Der Standardwert ist 1D-10. Größere Werte können bei ungenauen Funktionen von Vorteil sein, da der Algorithmus die feinen Ungenauigkeiten dann nicht "sieht". |
| Diese Funktion berechnet die erste Ableitung einer analytischen Funktion. Durch wiederholte Anwendung auf sich selbst können auch höhere Ableitungen erhalten werden. Dann muß man im allgemeinen allerdings schrittweise die Intervallgrenze erhöhen. | |
| Im Ordner DEMO finden Sie das Programm "Derivative.BAS", das die Verwendung dieser Funktion zeigt. |
| Derivative &X#(,),N | |
| X#(0:N,0:3) | In diesem Feld übergeben Sie die Funktionswerte. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. Nach der Rückkehr enthält X#(0:N,1) die 1. Ableitung, X#(0:N,2) die 2. Ableitung und X#(0:N,3) die 3. Ableitung and der Stelle X#(0:N,0). |
| N | Höchster Index des Feldes X#(,) (Anzahl der Funktionswerte minus eins). |
| Diese Prozedur berechnet die ersten drei Ableitungen einer tabellarisch vorliegenden Funktion. Bedenken Sie bitte, daß die Qualität der Ergebnisse stark von der Qualität der Eingaben in X#(0:N,0:1) abhängt. Dafür gilt nämlich die alte Weißheit: "Garbage in, garbage out (Fehlerhafte Eingabewerte liefern fehlerhafte Ausgabewerte)". | |
| Beispiel: Es soll die ersten drei Ableitungen der Funktion X#^3 berechnet werden: Num_Init N=20:I=0 DIM X#(N,4) FOR X#=-1 TO 1 STEP 0.1 X#(I,0)=X# X#(I,1)=X#^3 I+=1 NEXT X# Derivative &X#(,),N PRINT:PRINT " X#";TAB(7);"Funktionswert"; PRINT TAB(27);"1. Ableitung";TAB(47);"2. Ableitung"; PRINT TAB(67);"3. Ableitung" I=0 FOR X#=-1 TO 1 STEP 0.1 PRINT USING "##.##";X#;TAB(7);USING "##.#########";X#(I,1); PRINT TAB(27);USING "##.#########";X#(I,2);TAB(47); PRINT TAB(27);USING "##.#########";X#(I,3);TAB(67);X#(I,4) I+=1 NEXT X# PRINT:INPUT "Ende mit [Return]";Dummy Num_Exit END |
| Da die Funktionswerte von einer glatten analytischen Funktion stammen, sind die Ergebnisse in diesem Fall auch recht gut, wie Sie leicht nachrechnen können. |
| 2.8. Numerische Integration |
| Im Unterschied zur Differentiation gibt es für die Integration von Funktionen schon keine allgemeingültigen
Algorithmen mehr, die es immer erlauben, den Wert des Integrals immer in Form eines geschlossenen Ausdrucks anzugeben.
So können schon relativ einfach aussehende Funktionen wie SIN(X#)/X# nicht elementar integriert werden. Um so wichtiger ist es, daß man numerische Methoden zur Verfügung hat, mit denen man solche Integrale mit guter Genauigkeit berechnen kann. |
| FN Newton_Cotes#(&X#(,),N) | |
| X#(0:N,0:1) | In diesem Feld übergeben Sie die Funktionswerte. Dabei stehen in X#(0:N,0) die X-Werte und in X#(0:N,1) die Y-Werte. Achtung: Die X-Werte müssen äquidistant sein. |
| N | Höchster Index des Feldes X#(,) (Anzahl der Funktionswerte minus eins). N muß größer oder gleich 5 sein, sonst erhalten Sie eine Fehlermeldung. |
| Diese Funktion berechnet das Integral der im Feld X#(,) übergebenen diskreten Funktionswerte. Hinweis: Wenn Sie keine äquidistanten Werte haben, können Sie auch zunächst eine der zuvor besprochenen Interpolationsfunktionen verwenden, um sich äquidistante Werte zu verschaffen und diese dann an FN Newton_Cotes# übergeben. Alternativ können Sie auch an eine der weiter unten besprochenen Integrationsfunktionen verwenden, an die Sie dann die Adresse der Interpolationsfunktion übergeben. |
|
| Beispiel: Bei einer Messung haben sich die den DATA-Zeilen aufgeführten Meßwerte ergeben. Es soll jetzt das Integral, also die Fläche unter der Meßkurve, berechnet werden. Da die X-Werte nicht äquidistant sind, wird zunächst interpoliert: |
| Num_Init -Values DATA 0,1,0.5,1.649,1,2.718,2,1.4,4,0.5,5,2 N=5 DIM X#(N,1),Y#(N,1),C#(N) RESTORE Values FOR I=0 TO 5:READ X#(I,0),X#(I,1):NEXT I 'Erstmal äquidistante Meßwerte durch 'Interpolation erzeugen. Lagrange_Int &X#(,),N,&C#() FOR I=0 TO 5 Y#(I,0)=I Y#(I,1)=FN Lagrange#(I,&X#(,),N,&C#()) NEXT I PR |