Polynom

Letzte Woche wurde im Herber-Forum die Frage gestellt, wie man mit VBA den Schnittpunkt zweier Geraden berechnen kann (Link zum vollständigen Artikel). Ich möchte hier einen völlig anderen und allgemeingültigeren Lösungsansatz unter Verwendung von Klassen darstellen.

Die Klasse clsPolynom

Zunächst erstellen wir eine Klasse für Polynome beliebigen Grades (eine Gerade ist schließlich auch nur ein Polynom 1. Grades). Die Klasse soll Polynomfunktionen wie diese beschreiben:
y = a3*x^2 + a2*x + a1
y = a5*x^4 + a4*x^3 + a3*x^2 + a2*x + a1

Klassen

Für alle die noch nie eine Klasse geschrieben haben: Eine Klasse ist ein "Bauplan" für ein Objekt. Es können stets mehrere Objekte der selben Klasse erzeugt werden. Jedes Objekt kann sich durch bestimmte Eigenschaften unterscheiden.
Beispiel: Es gibt einen Bauplan (=Klasse) für ein Auto. Mein Auto (=Objekt) hat die Farbe (=Eigenschaft) grün, das Auto meines Nachbarns (=Objekt) hat die Farbe (=Eigenschaft) rot.
Weitere Informationen zur objektorientierten Programmierungen.

Der folgende Quellcode ist gekürzt. Fehlerbehandlungen und einige Kontrollstrukturen wurden entfernt. Vollständige Version

Quellcode Teil 1

Nun aber zum ersten Teil des Quellcodes der Klasse clsPolynom.
Im Datenfeld cVorfaktoren werden die Vorfaktoren (a1, a2, a3, ...) unseres Polynoms gespeichert.
Die zwei Events Class_Initalize und Class_Terminate haben keine Bedeutung für unser Polynom, zeigen aber im Direktbereich an ob die Klasse erstellt oder vernichtet wurde.

Option Explicit
Option Base 1

Private cVorfaktoren() As Double

'------------------------------------------------------------------
' Ereignisse / Events
'------------------------------------------------------------------
Private Sub Class_Initialize()
    Debug.Print "clsPolynom_Initialize"
End Sub
Private Sub Class_Terminate()
    Debug.Print "clsPolynom_Terminate"
End Sub

Code eingefügt mit Syntaxhighlighter 4.15

Quellcode Teil 2

Da es sich bei dem Datenfeld cVorfaktoren um eine privates Datenfeld handelt, kann es nicht von außen verändert werden. Mit den öffentlichen Funktionen Let und Get wird der Zugriff auf das Datenfeld gekapselt. Auf die Funktion UmwandlungInArray werde ich an dieser Stelle nicht genauer eingehen. Wichtig ist zu wissen, dass UmwandlungInArray Daten aus Arrays (Array(3,1,2), Datenfelder(Dim x(4) as Double) oder auch Range-Objekten ausliest und in ein neues Datenfeld schreibt.

'------------------------------------------------------------------
' Let und Get / let and get
'------------------------------------------------------------------
Public Property Let Vorfaktoren(ByVal newVorfaktoren)
    Call UmwandlungInArray(newVorfaktoren, cVorfaktoren)
End Property
Public Property Get Vorfaktoren()
    Vorfaktoren = cVorfaktoren
End Property

Code eingefügt mit Syntaxhighlighter 4.15

Quellcode Teil 3

Jetzt noch der Klasse eine Funktion hinzufügen um das Polynom an einer bestimmten Stelle x auszuwerten. Da nicht bekannt ist wie viele Vorfaktoren unser Polynom hat (Grad des Polynoms) läuft die Schleife von 1 bis Ubound(cVorfaktoren) und multipliziert an jeden Vorfaktor eine Potenz von x.

'------------------------------------------------------------------
' öffentliche Funktionen / public functions
'------------------------------------------------------------------
Public Function y(x As DoubleAs Double
    Dim i As Long

    For i = 1 To UBound(cVorfaktoren)
        y = y + cVorfaktoren(i) * x ^ (i - 1)
    Next
End Function

Code eingefügt mit Syntaxhighlighter 4.15

Verwendung der Klasse clsPolynom

Die Verwendung der Klasse clsPolynom ist denkbar einfach. Ein Modul mit allen Beispielen kann hier heruntergeladen werden. Die Sub TestPolynom zeigt verschiedene Möglichkeiten um die Vorfaktoren einzugeben und die Sub EinigeFunktionen erstellt eine Wertetabelle mit einer Geraden und einer Parabel.

Sub TestPolynom()
    Dim i As Long
    Dim dbl(3) As Double
    Dim myPolynom As clsPolynom
    Set myPolynom = New clsPolynom

    Select Case 1
    Case 1
        'Vorfaktoren über ein Datenfeld übernehmen
        For i = 1 To 3
            dbl(i) = i
        Next
        myPolynom.Vorfaktoren = dbl
    Case 2
        'Vorfaktoren aus einem Array übernehmen
        myPolynom.Vorfaktoren = Array(10, 5, 1)
    Case 3
        'Vorfaktoren aus einem verikalen Zellbereich übernehmen
        myPolynom.Vorfaktoren = Range("A1:A3")
    Case 4
        'Vorfaktoren aus einem horizontalen Zellbereich übernehmen
        myPolynom.Vorfaktoren = Application.WorksheetFunction.Transpose(Range("A1:C1"))
    End Select

    Debug.Print myPolynom.y(x:=2)
End Sub

Sub EinigeFunktionen()
    Dim t As Double, m As Double
    Dim Gerade As clsPolynom
    Dim a0 As Double, a1 As Double, a2 As Double
    Dim Parabel As clsPolynom

    'Gerade mit Steigung=-3 und y-Achsenabschnitt=6
    m = -2
    t = 4
    Set Gerade = New clsPolynom
    Gerade.Vorfaktoren = Array(t, m)

    'Normalparabel
    a0 = 0
    a1 = 0
    a2 = 1
    Set Parabel = New clsPolynom
    Parabel.Vorfaktoren = Array(a0, a1, a2)

    'Wertetabelle
    Debug.Print -3, -2, -1, 0, 1, 2, 3
    With Gerade
        Debug.Print .y(-3), .y(-2), .y(-1), .y(0), .y(1), .y(2), .y(3)
    End With
    With Parabel
        Debug.Print .y(-3), .y(-2), .y(-1), .y(0), .y(1), .y(2), .y(3)
    End With
End Sub

Code eingefügt mit Syntaxhighlighter 4.15
AnhangGröße
clsPolynom.cls3.27 KB
TestPolynom.bas1.79 KB
Your rating: Keine