Logo Foltyn Presentation
Table of Contents Previous Page Next Page
ActiveVBmember

Begleitende Diskussionen zur
Active VB Community

14. März 2017

3. Thema: Programmierung von Vektor-Rechnung für Planetenbahn-Berechnungen

Hier ein Code zur Auflistung von Permutationen

Es werden Zahlen von 1 bis n generiert (maximal 9) und mit CStr(i) in einen String gegeben "123.. n", weil man da am leichstest die Zeichen vertauschen kann. Man kann dann alle Permutationen in einer TextBox anzeigen, aber wenn man n = 5 wählt, hat man schon 120 Zeilen (5!). Bei einer Matrix von 3 * 3 wären es 9! Das sind 362880 Zeilen mit je 9 Zeichen. Bei größeren Matrizen müßte man das abschätzen, ob man das noch rechnen kann und eine andere Konfiguration für den String "123456789", bei einer Matrix von 4 * 4 könnte man einen String erzeugen mit "0123456789ABCDEF", wenn man es statt mit einem String mit einem Zahlen-Array macht, wird die Programmierung schwieriger.

    ' Program in Visual BASIC 2015
    ' Permatuation
    Public Function Permutation(NrOfElmts As Integer) As List(Of String)
        Dim P As New List(Of String) : Dim s As String = "" : Dim s1, s2, b
        For i = 1 To NrOfElmts : s = s & CStr(i) : Next : P.Add(s)
        For i = 2 To NrOfElmts
            For j = 0 To P.Count - 1 : s = P.Item(j)
                s1 = Left(s, i - 1) : b = Mid(s, i, 1) : s2 = Mid(s, i + 1)
                For k = 1 To Len(s1) : P.Add(InsertByte(s1, b, k) & s2) : Next
            Next
        Next : Return P
    End Function
    Public Function InsertByte(xStrg As String, xByte As Byte, Pos As Integer) As String
        If Pos = 0 Then Return xStrg
        Return Left(xStrg, Pos - 1) & xByte & Mid(xStrg, Pos)
    End Function
    Function factorial(ByVal n As Integer) As Integer ' recursive call of itsself
        If n <= 1 Then Return 1
        Return factorial(n - 1) * n
    End Function

Damit könnte man dann die Determinante so berechnen, wie es ihrer klassischen Definition entspricht. Es seien n n-dimensionale Vektoren gegeben.



Die Determinante dieser n Vektoren ai ist wie folgt definiert:

Der Fehlstand oder Inversion, das bildet die Vorzeichen für die Glieder der Reihe in der Form: -1I. D.h. alle geradzahligen I erzeugen ein +1 und alle ungeradzahligen ein -1. Im Programmcode wird I durch f (für Fehlstand) ersetzt.

    ' Code in Visual BASIC 2015
    ' Inversion
    Public Function Inversion(xStrg As String) As Integer
        ' for example xStrg = "954312678"
        Dim f As Integer = 0
        For i = 1 To Len(xStrg) - 1
            For j = i + 1 To Len(xStrg)
                If Mid(xStrg, i, 1) > Mid(xStrg, j, 1) Then f += 1
            Next
        Next : Return f
    End Function

Die Ziffern in xStrg sind ein Beispiel für eine Reihenfolge von Ziffern. Dieser Rechengang stellt meine persönliche Meinung dar und ich bitte um Überprüfung.

Das sind ungefähr die Grundlagen für das Verständnis zur Programmierung der Determinante. Diese kommt aber in der Planetenbahn- Berechnung selten vor, hier sind statt dessen viele Koordinaten-Transformationen, wo Vektoren mittels Matrizen mehrfach gedreht werden. Statt Matrizen kann man auch Tensoren sagen, weil die Defintion für einen Tensor lautet, dass er einem Vektor einen anderen zuordnet, obwohl er noch viele andere Eigenschaften hat, die hier nicht beachtet werden. Manche Koordinaten-Systeme bewegen sich oder rotieren. Und die Vektor- und Matrizen-Rechnung soll hier auch dargestellt werden.

Es handelt sich darum, andeutungsweise zu zeigen, dass man mit einer Sammlung von Prozeduren mächtige Berechnungen machen kann, wobei der Standort und die Bewegung des Beobachters wegen der Erdrotation und das Schwanken der Erdbahnebene und manches Andere usw. völlig automatisch heraus- und hereingerechnet werden kann. Und man kann auch sehen, was eine Einzelperson für Funktionen schreiben kann.


Hier ein Programm zur Berechnung einer Determinante

Im Programm sind Zeilen immer mit i nummeriert, Spalten mit k. In der Mathematik sind Indizes immer 1-basiert, im Programm sind sie alle nullbasiert, da sie nur Bezeichner sind und ihr absoluter Zahlenwert keine Rolle spielt, aber in einzelnen Fällen, z.B. bei (-1)i müsste man i+1 schreiben.

Es seien n Vektoren m(i) in einer Matrix



    ' Program in Visual BASIC 2015
    Public Function Determinante(M(,) As Double) As Double
        Dim q, det As Double, n, i, j As Byte : n = 2 : det = 1
        For k = 0 To n - 1 : i = k ' if element M(k,k) is zero, change rows
            Do : If M(k, k) <> 0 Then Exit Do
                i += 1 : If i > n Then Exit Do
                SWAPlines("rows", M, k, i) : det = -det
            Loop : If M(k, k) = 0 Then Return 0
            ' add multiplied row to current row
            For i = k + 1 To n : q = -M(i, k) / M(k, k)
                For j = 0 To n : M(i, j) = M(i, j) + M(k, j) * q : Next
            Next
        Next : For k = 0 To n : det *= M(k, k) : Next : Return det
    End Function
    Public Function SWAPlines(xLine As String, M(,) As Double, j1 As Byte, j2 As Byte) As Double
        Dim n As Byte = 2 : If j1 = j2 Or j1 > n Or j2 > n Then Return M(n, n)
        For j = 0 To n
            If xLine = "rows" Then SWAP(M(j1, j), M(j2, j))
            If xLine = "cols" Then SWAP(M(j, j1), M(j, j2))
        Next : Return M(n, n)
    End Function
    Public Sub SWAP(Of T)(ByRef d1 As T, ByRef d2 As T)
        Dim d As T = d2 : d2 = d1 : d1 = d
    End Sub