gauss/interpolationspolynom mit VB

  • VB6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Neptun.

    gauss/interpolationspolynom mit VB

    Hallo
    ich habe ein Problem mit einer Aufgabe bei der ich nicht weiß wie ich bei Visual basic vorgehen soll. Kann mir jemand helfen? Die Aufgabe lautet:
    Modifizieren Sie das Programm gauss.xlsm für die Berechnung eines Interpolationspolynoms 5. Grades zu den Punkten (,0 ;1) (0,5 ; 3) (1 ; 2) (1,5 ; 4) (1,8 ; 2) und (2 ; 3,5). Setzen Sie die Punkte in ein Polynom 5. Grades ein und bestimmen Sie so 6 lineare Gleichungen mit 6 Unbekannten (Koeff.), erstellen Sie daraus die Matrix A und die rechte Seite b für das zu lösende Gleichungssystem! Geben Sie als Lösung das Interpolationspolynom an.
    Folgende Programmierung habe ich bisher dazu:


    Option Explicit
    Sub gauss_sp() 'Gaussalgorithmus mit Spaltenpivotsuche
    Dim max As Double 'maximalwert der spaltenpivotsuche
    Dim s As Double 'Hilfsvariable
    Dim b(1 To 14) As Double 'rechte Seite
    Dim x(1 To 14) As Double 'Lösungsvektor
    Dim a(1 To 14, 1 To 14) As Double ' Matrix

    Dim n As Integer 'dimension
    Dim i As Integer 'schleifenparameter
    Dim j As Integer 'schleifenparameter
    Dim k As Integer 'schleifenparameter

    'Einlesen/Eingabe der Startwerte
    n = InputBox("maximal 14", " Dimension")
    If n > 14 Then
    MsgBox ("n darf nicht größer als 14 sein")
    n = InputBox("maximal 14", " Dimension")
    End If
    If n > 14 Then Exit Sub

    With Tabelle1

    For i = 1 To n
    b(i) = .Cells(i, n + 2)
    For j = 1 To n
    a(i, j) = .Cells(i, j)
    Next
    Next

    For i = 1 To n
    'Spaltenpivotsuche
    max = Abs(a(i, i))
    k = i
    For j = i + 1 To n
    If Abs(a(j, i)) > max Then
    max = Abs(a(j, i))
    k = j
    End If
    Next
    If k <> i Then
    s = b(i)
    b(i) = b(k)
    b(k) = s
    For j = i To n
    s = a(i, j)
    a(i, j) = a(k, j)
    a(k, j) = s
    Next
    End If

    If a(i, i) = 0 Then
    MsgBox ("Matrix singulär")
    Exit Sub
    End If

    'Dreieckszerlegung

    For j = i + 1 To n
    If a(j, i) <> 0 Then
    s = a(j, i) / a(i, i)
    a(j, i) = 0
    b(j) = b(j) - b(i) * s
    For k = i + 1 To n
    a(j, k) = a(j, k) - a(i, k) * s
    Next
    End If
    Next
    Next

    'Kontrollausgabe
    'For i = 1 To n
    ' For j = 1 To n
    ' .Cells(i + n + 2, j) = a(i, j)
    ' Next
    'Next

    x(n) = b(n) / a(n, n)
    .Cells(n, n + 4) = x(n)
    For j = n - 1 To 1 Step -1
    s = 0
    For k = j + 1 To n
    s = s + a(j, k) * x(k)
    Next
    x(j) = (b(j) - s) / a(j, j)
    .Cells(j, n + 4) = x(j)
    Next
    End With

    End Sub

    Danke schon mal im Voraus
    @flum: Willkommen im Forum. :thumbup:
    Bevor wir anfangen müssen wir folgendes klar stellen:
    Redest Du hier von VB6 und älter
    oder
    meinst Du VB.NET?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Option Explicit
    Sub gauss_sp() 'Gaussalgorithmus mit Spaltenpivotsuche
    Dim max As Double 'maximalwert der spaltenpivotsuche
    Dim s As Double 'Hilfsvariable
    Dim b(1 To 14) As Double 'rechte Seite
    Dim x(1 To 14) As Double 'Lösungsvektor
    Dim a(1 To 14, 1 To 14) As Double ' Matrix

    Dim n As Integer 'dimension
    Dim i As Integer 'schleifenparameter
    Dim j As Integer 'schleifenparameter
    Dim k As Integer 'schleifenparameter

    'Einlesen/Eingabe der Startwerte
    n = InputBox("maximal 14", " Dimension")
    If n > 14 Then
    MsgBox ("n darf nicht größer als 14 sein")
    n = InputBox("maximal 14", " Dimension")
    End If
    If n > 14 Then Exit Sub

    With Tabelle1

    For i = 1 To n
    b(i) = .Cells(i, n + 2)
    For j = 1 To n
    a(i, j) = .Cells(i, j)
    Next
    Next

    For i = 1 To n
    'Spaltenpivotsuche
    max = Abs(a(i, i))
    k = i
    For j = i + 1 To n
    If Abs(a(j, i)) > max Then
    max = Abs(a(j, i))
    k = j
    End If
    Next
    If k <> i Then
    s = b(i)
    b(i) = b(k)
    b(k) = s
    For j = i To n
    s = a(i, j)
    a(i, j) = a(k, j)
    a(k, j) = s
    Next
    End If

    If a(i, i) = 0 Then
    MsgBox ("Matrix singulär")
    Exit Sub
    End If

    'Dreieckszerlegung

    For j = i + 1 To n
    If a(j, i) <> 0 Then
    s = a(j, i) / a(i, i)
    a(j, i) = 0
    b(j) = b(j) - b(i) * s
    For k = i + 1 To n
    a(j, k) = a(j, k) - a(i, k) * s
    Next
    End If
    Next
    Next

    'Kontrollausgabe
    'For i = 1 To n
    ' For j = 1 To n
    ' .Cells(i + n + 2, j) = a(i, j)
    ' Next
    'Next

    x(n) = b(n) / a(n, n)
    .Cells(n, n + 4) = x(n)
    For j = n - 1 To 1 Step -1
    s = 0
    For k = j + 1 To n
    s = s + a(j, k) * x(k)
    Next
    x(j) = (b(j) - s) / a(j, j)
    .Cells(j, n + 4) = x(j)
    Next
    End With

    End Sub
    @flum: Jetzt hast Du uns 2 Mal Deinen Code gepostet, das zweite Mal ohne Kommentar.
    1. Formatiere Deinen Code bitte so, dass er wie Code aussieht.
    2. Verwende bitte einen Expander [+] neben dem [VB]-Tag
    Expander
    Das ist ein Expander für langen Code

    3. Editiere bitte Deine (Plural) Posts und pack Deinen Code in sowohl VB-Tags als auch in einen Expander.
    4. Beantworte bitte die Frage VB6 oder VB.NET.
    Dann werden Sie geholfen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Visual Basic-Quellcode

    1. [spoiler]Option Explicit
    2. Sub gauss_sp() 'Gaussalgorithmus mit Spaltenpivotsuche
    3. Dim max As Double 'maximalwert der spaltenpivotsuche
    4. Dim s As Double 'Hilfsvariable
    5. Dim b(1 To 14) As Double 'rechte Seite
    6. Dim x(1 To 14) As Double 'Lösungsvektor
    7. Dim a(1 To 14, 1 To 14) As Double ' Matrix
    8. Dim n As Integer 'dimension
    9. Dim i As Integer 'schleifenparameter
    10. Dim j As Integer 'schleifenparameter
    11. Dim k As Integer 'schleifenparameter
    12. 'Einlesen/Eingabe der Startwerte
    13. n = InputBox("maximal 14", " Dimension")
    14. If n > 14 Then
    15. MsgBox ("n darf nicht größer als 14 sein")
    16. n = InputBox("maximal 14", " Dimension")
    17. End If
    18. If n > 14 Then Exit Sub
    19. With Tabelle1
    20. For i = 1 To n
    21. b(i) = .Cells(i, n + 2)
    22. For j = 1 To n
    23. a(i, j) = .Cells(i, j)
    24. Next
    25. Next
    26. For i = 1 To n
    27. 'Spaltenpivotsuche
    28. max = Abs(a(i, i))
    29. k = i
    30. For j = i + 1 To n
    31. If Abs(a(j, i)) > max Then
    32. max = Abs(a(j, i))
    33. k = j
    34. End If
    35. Next
    36. If k <> i Then
    37. s = b(i)
    38. b(i) = b(k)
    39. b(k) = s
    40. For j = i To n
    41. s = a(i, j)
    42. a(i, j) = a(k, j)
    43. a(k, j) = s
    44. Next
    45. End If
    46. If a(i, i) = 0 Then
    47. MsgBox ("Matrix singulär")
    48. Exit Sub
    49. End If
    50. 'Dreieckszerlegung
    51. For j = i + 1 To n
    52. If a(j, i) <> 0 Then
    53. s = a(j, i) / a(i, i)
    54. a(j, i) = 0
    55. b(j) = b(j) - b(i) * s
    56. For k = i + 1 To n
    57. a(j, k) = a(j, k) - a(i, k) * s
    58. Next
    59. End If
    60. Next
    61. Next
    62. 'Kontrollausgabe
    63. 'For i = 1 To n
    64. ' For j = 1 To n
    65. ' .Cells(i + n + 2, j) = a(i, j)
    66. ' Next
    67. 'Next
    68. x(n) = b(n) / a(n, n)
    69. .Cells(n, n + 4) = x(n)
    70. For j = n - 1 To 1 Step -1
    71. s = 0
    72. For k = j + 1 To n
    73. s = s + a(j, k) * x(k)
    74. Next
    75. x(j) = (b(j) - s) / a(j, j)
    76. .Cells(j, n + 4) = x(j)
    77. Next
    78. End With
    79. End Sub
    80. [/spoiler]

    VB 6
    Und jetzt noch Expander ausserhalb von VB-Tags. :)

    EDIT: Kannst du bitte jede deiner Zeile kommentieren, was sie bedeuten soll? Und vielleicht a, b usw sinnvolle Namen geben. Du beschreibst es zwar am Anfang im Kommentar, aber im Code vergisst man es ja gleich. Also statt "a" gleich "Matrix", statt "b" "RightSide" oder "RechteSeite" usw.
    Und warum du welche Zuweisung machst, warum "n+2" usw.