|
Begleitende Diskussionen zur | ||||
Active VB Community | ||||
14. März 2017 |
3. Thema: Programmierung von Vektor-Rechnung für Planetenbahn-BerechnungenHier ein Code zur Auflistung von PermutationenEs 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 DeterminanteIm 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 | ||