Nullstellenberechnung nach Regula Falsi

  • VB6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Nullstellenberechnung nach Regula Falsi

    moin moin,

    ich soll für die näherungsweise Berechnung einer Nullstelle für die Funktion: f(x)= e^-x² -w
    ein Programm schreiben, nach Regula-Falsi-Schema (ich hoffe einige von euch kennen es, ansonsten kann ich gern nochmal erklären.

    Es gilt: w>0
    w, beide intervallgrenzen, die maximalen iterationsschritte und die genauigkeitsschranke können über textfelder eingegeben werden.

    es gilt dafür sgn(f(u)) ungleich sgn(f(v)) und u(i+1)=u(i); v(i+1) =t für sgn(f(t)) = sgn(f(vi))

    folgendes habe ich schon erarbeitet (vorsicht, vba-anfänger )


    Quellcode

    1. Private Sub Command1_Click()
    2. Dim w As Integer, itmax As Integer, it As Integer, u As Integer, v As Integer
    3. Dim genauigkeit As Double, t As Double, ft As Double, fv As Double, fu As Double
    4. it = 0
    5. 'Deklarierung der Eingabewerte
    6. w = TextW.Text
    7. itmax = TextIterationsschritt.Text
    8. u = TextU.Text
    9. v = TextV.Text
    10. genauigkeit = TextGenauigkeitsschranke.Text
    11. 'Funktion für f(u)
    12. fu = (e ^ (u ^ 2)) - w
    13. 'Funktion für f(v)
    14. fv = (e ^ (v ^ 2)) - w
    15. 'Funktion für t
    16. t = v - fv * ((v - u) / (fv - fu))
    17. 'Funktion für f(t)
    18. ft = (e ^ (t ^ 2)) - w
    19. 'Anweisung
    20. If fu <> fv Then
    21. Do While it < itmax
    22. t = v - fv * ((v - u) / (fv - fu))
    23. ft = (e ^ (t ^ 2)) - w
    24. If ft <> fu Then
    25. v = t
    26. fv = ft
    27. Else
    28. u = t
    29. fu = ft
    30. End If
    31. it = it + 1
    32. If ft <= genauigkeit Then
    33. Debug.Print "Sie haben die gewünschte Genauigkeit nach " & it & ". Schritten erreicht. Der Wert ist " & t
    34. End If
    35. Exit Do
    36. Loop
    37. Debug.Print "Nach " & itmax & " maximalen Schritten ist der Wert " & t & " und Sie haben die gewünschte Genauigkeit damit nicht erreicht"
    38. Else
    39. MsgBox "In diesem Intervall gibt es keine Nullstelle!"
    40. End If
    41. End Sub


    mein problem ist nun folgendes. meine if-anweisung mit do-loop-schleife erkennt schonmal richtig die vorzeichen. nun möchte ich aber, dass jeder schritt einzeln durchlaufen wird (am ende muss jeder schritt ein in einer picturebox gezeichnet werden). ist es dann besser eine for-schleife zu nehmen? die durchläuft dann aber doch die schleife so oft, welcher der maximale wert ist, in diesem fall itmax.

    ich weiß auch nicht recht, ob die schleife so funktioniert. ich hab so die vermutung, dass die immer nur einmal durchlaufen wird.

    bitte um hilfe.

    vielen dank für eure zeit
    For Schleifen nimmt man, wenn man vorher schon weiß wie oft sie durchlaufen werden soll.

    Do oder While Schleifen bricht man ab, sobald eine Bedingung erfüllt ist.
    Meinetwegen eine Variable, die man erst in der Schleife berechnet, überschreitet einen bestimmten Wert.

    Da du itmax vorher schon festlegts, wirst du besser die For Schleife verwenden.

    Du solltest noch eine Umwandlung deiner Eingabestrings aus den TextBoxen in
    passende Zahlenwerte vornehmen. Früher oder später werden diese Zahlen dir
    nämlich Probleme bereiten.

    itmax wird wahrscheinlich ein Integer oder Long sein.

    Also besser:

    itmax=CLng(TextIterationsschritt.Text)

    Du verwendest itmax als Zähler in einer Schleife, darum wird sie eine Zahl ohne Kommastellen sein.
    Integer Zahlen werden vom Computer schneller verarbeitet als Variantwerte.

    Bei den anderen musst du selbst überlegen, ob es Kommazahlen sein können.
    Dann musst du vielleicht auch darauf achten, ob der User ein Komma(,) oder einen Punkt(.)
    als Dezimaltrenner eingibt.
    Ich hab leider keine Startwerte, so kann ich nicht genau nachverfolgen, was passiert.
    1. Option Strict On
    2. ich hab mal die entsprechenden Korrekturen vorgenommen und das Exit Do in die If-Konstriktion verschoben.
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim w As Integer, itmax As Integer, it As Integer
    3. Dim u As Double, v As Double ' u As Integer, v As Integer
    4. Dim genauigkeit As Double, t As Double, ft As Double, fv As Double, fu As Double
    5. it = 0
    6. 'Deklarierung der Eingabewerte
    7. w = CInt(TextW.Text)
    8. itmax = CInt(TextIterationsschritt.Text)
    9. u = CDbl(TextU.Text)
    10. v = CDbl(TextV.Text)
    11. genauigkeit = CInt(TextGenauigkeitsschranke.Text)
    12. 'Funktion für f(u)
    13. fu = (Math.Exp(u ^ 2)) - w
    14. 'Funktion für f(v)
    15. fv = (Math.Exp(v ^ 2)) - w
    16. 'Funktion für t
    17. t = v - fv * ((v - u) / (fv - fu))
    18. 'Funktion für f(t)
    19. ft = (Math.Exp(t ^ 2)) - w
    20. 'Anweisung
    21. If fu <> fv Then
    22. Do While it < itmax
    23. t = v - fv * ((v - u) / (fv - fu))
    24. ft = (Math.Exp(t ^ 2)) - w
    25. If ft <> fu Then
    26. v = t
    27. fv = ft
    28. Else
    29. u = t
    30. fu = ft
    31. End If
    32. it = it + 1
    33. If ft <= genauigkeit Then
    34. Debug.Print("Sie haben die gewünschte Genauigkeit nach " & it & ". Schritten erreicht. Der Wert ist " & t)
    35. Exit Do ' in die If-Konstruktion rein
    36. End If
    37. Loop
    38. Debug.Print("Nach " & itmax & " maximalen Schritten ist der Wert " & t & " und Sie haben die gewünschte Genauigkeit damit nicht erreicht")
    39. Else
    40. MsgBox("In diesem Intervall gibt es keine Nullstelle!")
    41. End If
    42. End Sub
    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!