Funktioniert die Schleife korrekt?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Funktioniert die Schleife korrekt?

    Schönen Guten Tag!

    Ich habe eine Iterationsaufgabe zur Berechnung des Reibungsverluset in einem Rohr , in dem Luft strömt, zu lösen.

    Die Formel lautet: 2,51/(Re √λ)=-2 log (2,51/(Re √λ)+k/3,71 d))

    Lambda muss iteriert werden.

    In Excel hat das mit der Schleife

    For n = 0.00000008 To 0.4 Step 0.00001 'Step 0.00001
    Range("l5") = n + 0.0000001 'Lambda
    If Range("i5") <= Range("J5") Then Exit For
    Next n

    funktioniert. Hier wird beim Term 2,51/(Re √λ) = ca. 6,5 abgebrochen.

    Dann habe ich die Schleife in VS 2013 übertragen und die Iteration endet später an einem anderen Punkt (8,6) obwohl die Nebenrechnungen in beiden Methoden zu identischen Ergebnissen führen.

    Ich nehme an, es liegt wohl an meiner Schleifenprogrammierung.

    Nun habe ich mit verschiedenen Schleifenarten herumgebastelt weil ich dachte, VS 2013 rechnet vielleicht anders als Excel und bin jetzt bei dem Ergebnis gelandet:

    Sub Iteration()

    IterationLambda = 0.000000000001 ' Hier beginne ich mit der Iteration , Dim Iteration Lambda as Double

    Do

    IterationLambda = IterationLambda + 0.000001
    Nebenrechnungen() ' Ein Unterprogramm für Zwischenergebnisse der Gleichung
    WurzelTerm = 1 / Math.Sqrt(IterationLambda) ' Die Gliederung der Gleichung in 2 Terme
    rechterTerm = -2 * Math.Log10((2.51 / (Re * Math.Sqrt(IterationLambda)) + (k / (3.71 * Nennweite))))

    If WurzelTerm <= rechterTerm Then Exit Do ' Abbruchbedingung d.h. wohl wenn WurzelTerm <= rechterTerm dann abbrechen sonst Sprung zu Do?

    Loop

    End Sub

    Trotzdem bricht die Iteration bei 8,6 ab.

    Mich macht das natürlich wuschig, wenn ich mit 2 eigentlich korrekten Methoden zu unterschiedlichen Ergebnissen komme.

    Erkennt jemand meinen Fehler?

    Abschließende Frage: Wie macht man es, dass die Iteration von Lambda in einem Label verfolgt werden kann?


    Mit besten Grüßen
    ?(
    @Uchi-Komi Was ist Range()? Warum hat das ein String-Argument?
    Hast Du Option Strict On?
    Vielleicht wäre es besser, Du lässt die Schleife mit einem Integer-Index laufen und berechnest Dir das Lambda zum Int-Index. Das ist dann gut, wenn Du den Bereich verändern willst.
    ===
    In einem Label verfolgen ist Tinnef.
    Du kannst aber Debug-Ausgaben einfügen:

    VB.NET-Quellcode

    1. Console.WriteLine(lambda)
    Das erscheint dann im Ausgabe-Tab des Studios unter dem Quellcode.
    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!
    Der WurzelTerm Deiner theoretischen Formel: 2,51/(Re √λ) scheint mir nicht korrekt durch die Codezeile 1 / Math.Sqrt(IterationLambda) abgedeckt zu sein. Der rechte Teil der Formel ist anscheinend korrekt. Nicht, dass es einfach nur daran liegt.
    Für den Fall, dass Du noch Re, k und d angeben willst/darfst, ohne irgendwelche Geheimnisse preiszugeben, ließe sich das auch bei uns nachberechnen, sodass eventuell der Fehler gefunden werden könnte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Erstmal vielen Dank für die schnelle Hilfe!

    Zwischenbericht:

    Ich hatte definiert:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict Off
    3. Imports Microsoft.VisualBasic
    4. Nach der Umstellung der Option Strict Off auf Option Strict On kommen die Fehlermeldungen:
    5. Fehler 4 "Option Strict On" lässt keine impliziten Konvertierungen von Double in Single zu. D:\Visual Studio 2013\AbwasserExeIntern2017\AbwasserExeIntern2017\frmKanalluft.vb 192 31 AbwasserExeIntern2017
    6. Fehler 1 "Option Strict On" lässt keine impliziten Konvertierungen von Double in Decimal zu. D:\Visual Studio 2013\AbwasserExeIntern2017\AbwasserExeIntern2017\frmKanalluft.vb 42 35 AbwasserExeIntern2017
    Ursache: IterationLambda = IterationLambda + 0.000001

    Vorschlag von VB : CSng(IterationLambda + 0.000001) ausgeführt
    Ebenso wird für drei numerisches Elemente vorgeschlagen z.B.: "NudKanalluftTempC.Value = CDec(LufttemperaturC)"
    Alles korrigiert und keine Fehlermeldungen mehr aber trotzdem bricht die Iteration bei 8,6 ab.

    Aklteller Stand:

    VB.NET-Quellcode

    1. Sub Iteration()
    2. Index += 1
    3. Do
    4. IterationLambda = CSng(Index / 100) ' Hier beginne ich mit der Iteration , Dim Iteration Lambda as Double
    5. Nebenrechnungen() ' Ein Unterprogramm für Zwischenergebnisse der Gleichung
    6. WurzelTerm = 1 / Math.Sqrt(IterationLambda) ' Die Gliederung der Gleichung in 2 Terme
    7. rechterTerm = -2 * Math.Log10((2.51 / (Re * Math.Sqrt(IterationLambda)) + (k / (3.71 * Nennweite))))
    8. If WurzelTerm < rechterTerm Then Exit Do ' Abbruchbedingung d.h. wohl wenn WurzelTerm <= rechterTerm dann abbrechen sonst Sprung zu Do?
    9. Loop
    10. End Sub

    Zu "Was ist Range()? Warum hat das ein String-Argument?"
    In Excel werden die Zellen z.B. so angesprochen: Range("l5")

    Ich habe noch eine nicht plausible Nebenrechnung, die ich nach dem Mittagessen prüfen werde.

    Es gibt gebackene Kartoffen ;)

    Solang beste Grüße!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Uchi-Komi“ ()

    Uchi-Komi schrieb:

    In Excel werden die Zellen z.B. so angesprochen
    Jetzt hast Du auch noch Excel aus dem Hut gezaubert. :/
    Ich hätte gern eine vollständige Beschreibung eines Umfeldes.
    Wenn Excel mit dem Problenm nix zu tun hat, lösch die Zeilen einfach raus.
    Das beste wäre, Du machst ein neues kleines separates Testprojekt ohne Excel, das den Effekt reproduziert.
    Das kannst Du dann anhängen: Erweiterte Antwort => Dateianhänge => Hochladen.
    Projektmappe bereinigen (bin und obj löschen), in ein ZIP packen und anhängen.
    Dann können wir dran arbeiten. 8o
    Mach alle Deine Berechnungen in Double.
    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!
    Hallo @Uchi-Komi

    Im Übrigen gibt es noch ein Problem. Die Formel die du angegeben hast
    2,51/(Re √λ)=-2 log (2,51/(Re √λ)+k/3,71 d))

    Den Term links findet man im Term recht wieder. So wie ich jetzt das verstanden habe, willst du jedoch den rechten Term solange durch die Schleife jagen, bis er <= ist.

    Ich denke da musst du mehr Infos angeben, damit das klarer wird.

    Zum Beispiel wäre auch gut wenn du die Werte der einzelnen Variablen in der Formel bekannt gibst. Oder ein paar numerische Beispiele um es besser verfolgen zu können. Um was für ein Medium handelt es sich jetzt nun definitiv? Luft oder?

    Dann wären bei ca. 20° C oder? (k = kinematische Viskosität, p = Dichte)

    Quellcode

    1. Re = 2320; k = 0.0000181; p = 1.1839


    Freundliche Grüsse

    exc-jdbi
    Vielen Dank an: VaporiZed

    Ich habe die Formel 2,51/(Re √λ)=-2 log (2,51/(Re √λ)+k/3,71 d)) falsch angegeben, aber im Code ist sie korrekt, denke ich.

    Korrekt lautet sie : 1/√λ=-2 log (2,51/(Re √λ)+k/3,71 d))

    Insofern sollte dann der Code "1 / Math.Sqrt(IterationLambda)" stimmen.

    Bitte um Entschuldigung!

    Neuer Stand:


    Das Problem ist umzingelt!

    Ich hatte eine Trackbar eingefügt mit der ich Lambda manuell verändere und somit zunächst iterierte.
    Der Code "Await System.Threading.Tasks.Task.Delay(1)" erschien mir ratsam, damit der Nutzer nicht denkt, das Programm ist gestorben.

    Schließlich funktierte es nach vielem Probieren mit dem Code:
    ****

    VB.NET-Quellcode

    1. Async Function Iteration() As Task
    2. Do Until EinsDurchWurzelLambda < rechterTerm
    3. IterationLambda = CSng(IterationLambda + 0.00001) ' Hier beginne ich mit der Iteration , Dim Iteration Lambda as Single
    4. Nebenrechnungen() ' Ein Unterprogramm für Zwischenergebnisse der Gleichung
    5. 'lblIterationLambda.Text = Format(IterationLambda, "##,##0.000000000000 ")
    6. Await System.Threading.Tasks.Task.Delay(1)
    7. lblIterationLambda.Text = Format(IterationLambda, "##,##0.000000000000 ")
    8. EinsDurchWurzelLambda = 1 / Math.Sqrt(IterationLambda) ' Die Gliederung der Gleichung in 2 Terme
    9. rechterTerm = -2 * Math.Log10((2.51 / (Re * Math.Sqrt(IterationLambda)) + (k / (3.71 * Nennweite))))
    10. Loop
    11. End Function

    ***
    Vielen Dank an Alle die halfen!

    :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Uchi-Komi“ ()

    @Uchi-Komi
    Würdest Du Deinen Code so formatieren, dass wir ihn als Code lesen können :?:
    Code markieren und den entsprechenden Button drücken.

    Editiere Deine Posts entsprechend.
    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!
    "Jetzt hast Du auch noch Excel aus dem Hut gezaubert...."
    Ich habe Excel nur zur Programmkontrolle bemnutzt. Wollte nicht verwirren.

    Wer natürlich für den internen Gebrauch Interesse hat... Ich habe keine Geheimnisse.

    Das Programm ist aber noch nicht fertig!

    Als Anlage zwei Formulare.

    Wenn ich so nachdenke, habe ich an dem Fehler in der Schleife bestimmt 10 Stunden gebastelt.

    Vielen Dank auch an exc-jdbi!!!
    Bilder
    • Colebrook_Konstanten.jpg

      80,25 kB, 1.048×515, 118 mal angesehen
    • Colebrook_Ergebnisse.jpg

      95,5 kB, 1.089×537, 140 mal angesehen