Code-Beispiel
Legendre Polynome
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | TJF | 17.04.2012 |
Polynome 0. bis 14. Ordnung
Der folgende Quelltext definiert eine Datenstruktur (UDT / TYPE) zur Generierung eines Satzes von Legendre Polynomen. Dies sind Funktionen, die einer Variablen X einen Wert Y zuweisen.
Das besondere an Legendre Polynomen ist, dass sie in dem Interval [-1, 1] orthogonal sind, also linear unabhängig. Durch diese Eigenschaft eignen sie sich für besondere mathematische Anwendungen, z. B. für die X/Y-Regression.
Die Polynome können mit beliebiger Potenz der Variable X erzeugt werden (im Rahmen der Rechengenauigkeit), wodurch die Anzahl der Nullstellen und damit die Welligkeit der Polynome bestimmt wird.
Zur Anwendung wird die Bibliothek libFBla benötigt. Der folgende Quelltext sollte unter dem Namen "LegendrePolynom.bas" abgespeichert werden.
' This is file "LegendrePolynom.bas"
' (C) LGPLv2 by Thomas[ dot ]Freiherr{ at }gmx{ dot }net
#INCLUDE ONCE "../libFBla/libFBla.bas"
#DEFINE LP_Posi(_P_) CUINT((_P_ + 1) ^ 2 / 4)
TYPE LegendrePolynom
DECLARE CONSTRUCTOR(BYVAL O AS UINTEGER)
DECLARE FUNCTION Ord_() AS UINTEGER
DECLARE FUNCTION Par_(BYVAL N AS UINTEGER, BYVAL O AS UINTEGER) AS DOUBLE
DECLARE FUNCTION Val_(BYVAL X AS DOUBLE, BYVAL O AS UINTEGER) AS DOUBLE
Private:
AS LA_V Param
AS UINTEGER Order
END TYPE
CONSTRUCTOR LegendrePolynom(BYVAL O AS UINTEGER)
Order = O
Param = LA_V(LP_Posi(O + 1))
Param.Val_(0) = 1. : IF O = 0 THEN EXIT CONSTRUCTOR
Param.Val_(1) = 1.
FOR n AS INTEGER = 2 TO O
VAR f = (1 - n) / n, po = LP_Posi(n - 2), p = LP_Posi(n)
FOR i AS INTEGER = 1 TO n SHR 1
Param.Val_(p) = f * Param.Val_(po)
p += 1 : po += 1
NEXT
p = LP_Posi(n) + IIF(BIT(n, 0), 0, 1)
f = (2 * n - 1) / n
FOR i AS INTEGER = 1 TO (n + 1) SHR 1
Param.Val_(p) = Param.Val_(p) + f * Param.Val_(po)
p += 1 : po += 1
NEXT
NEXT
END CONSTRUCTOR
FUNCTION LegendrePolynom.Ord_() AS UINTEGER
RETURN Order
END FUNCTION
FUNCTION LegendrePolynom.Val_(BYVAL X AS DOUBLE, BYVAL O AS UINTEGER) AS DOUBLE
VAR i = LP_Posi(O), p = -BIT(O, 0), r = Param.Val_(i) * X ^ p
FOR n AS UINTEGER = 1 TO O SHR 1
p += 2
i += 1
r += Param.Val_(i) * X ^ p
NEXT : RETURN r
END FUNCTION
FUNCTION LegendrePolynom.Par_(BYVAL N AS UINTEGER, BYVAL O AS UINTEGER) AS DOUBLE
IF N > O THEN RETURN 0.
IF BIT(O, 0) ANDALSO 0 = BIT(N, 0) THEN RETURN 0.
IF 0 = BIT(O, 0) ANDALSO BIT(N, 0) THEN RETURN 0.
RETURN Param.Val_(LP_Posi(O) + (N SHR 1))
END FUNCTION
Anwendung
- Mit VAR neu = LegendrePolynom(xx) wird unter dem Namen neu ein Satz von Polynomen von 0. bis xx. Ordnung erzeugt. Z. B. werden für xx = 7 dann 8 Polynome von der Ordnung 0 bis 7 erzeugt. Das Polynom 0. Ordnug ist konstant = 1, hat also keine Nullstelle. Das Polynom 7. Ordnung hat 7 Nullstellen im Intervall [-1, 1].
- Der Funktionswert eines Polynoms wird mit der Funktion neu.Val_(X_Wert, Ordnung) berechnet. Um z. B. den Wert des Polynoms 3. Grades and der Stelle X = 0.375 zu berechnen, verwendet man neu.Val_(0.375, 3).
- Die Parameter der Polynome können einzeln abgefragt werden, z. B. um Ableitungen zu berechnen. Dazu dient die Funktion neu.Par_(Parameter#, Ordnung). Um z. B. den 4. Parameter des Polynoms 7. Ordnung abzufragen, verwendet man neu.Par_(4, 7).
- Die höchste Potenz des zuvor generierten Polynom-Satzes (die maximale Ordnung) kann mit der Funktion neu.Ord_() bestimmt werden.
Beispiel
' This is file "LegendrePolynomTest.bas"
' (C) GPLv3 by Thomas[ dot ]Freiherr{ at }gmx{ dot }net
#INCLUDE ONCE "LegendrePolynom.bas"
' Generate 15 polynomials (order 0 to 14)
VAR neu = LegendrePolynom(14)
' Prepare graphics
CONST gr = 1.01, bg = 30
SCREENRES 800, 600, 8
WINDOW (-gr, -gr) - (gr, gr)
COLOR 0, bg : CLS
' View each polynom
CONST st = 0.005
FOR i AS INTEGER = 0 TO neu.Ord_()
COLOR i + 1, 0
FOR x AS DOUBLE = -1 TO 1 + st / 2 STEP st
CIRCLE (x, neu.Val_(x, i)), st, , , , , F
NEXT
' Wait for user action
LINE (-0.5, -0.90) - STEP(0.9, -0.09), bg, BF
DRAW STRING (-0.35, -0.95), i & ".Ordnung. (Taste druecken)"
SLEEP : IF ASC(INKEY) = 27 THEN EXIT FOR
NEXT
' View parameters of 14. polynom
CLS : COLOR 15
VAR o = neu.Ord_()
? "Das Polynom " & o & ". Ordnung:"
? : ? : ?
? "f(x) ="
? : ?
? "X ^ 0 * " & neu.Par_(0, o)
FOR i AS INTEGER = 1 TO o
? : ? " +" : ?
? "X ^";
? USING "###"; i;
? " * " & neu.Par_(i, o)
NEXT
SLEEP
Anmerkung
- Der Quelltext verwendet eine optimierte Methode zur Speicherung der Parameter, die einerseits geringen Speicherverbrauch zur Folge hat und andererseits schnelle Berechnung von Polynomen höheren Grades ermöglicht. Dabei wird sowohl die Dreieck-Struktur der Parametermatrix ausgenutzt, als auch die Tatsache, dass bei Legendre-Polynomen jeder zweite Parameter gleich 0 ist.
English
See English forum.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|