Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Mathematik

Legendre Polynome

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedTJF 17.04.2012
Polynome 0. bis 14. Ordnung
Vergrößern
Polynome 0. bis 14. Ordnung

Der folgende Quelltext definiert eine Datenstruktur (UDT / TYPE) zur Generierung eines Satzes von Externer Link!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

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

English

See Externer Link!English forum.


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 29.04.2011 von MitgliedTJF angelegt.
  • Die aktuellste Version wurde am 17.04.2012 von MitgliedTJF gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen