PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : in VBA eine Iteration programmieren


3dzocker
2009-08-13, 01:20:41
als für mich große Übung um VBA ein wenig zu lernen, bastel ich grad an einem Programm mit dem man den R-Wert in mbar für ein Rohr berechnen kann.
Gegeben sind der Volumenstrom, der Rohrdurchmesser und die relative Rauhigkeit.
Immerhin hab ichs hinbekommen ausrechnen zu lassen wann laminar/turbulant und wann glatt/rauh/Übergangsbereich.

Zu den 3 Bereichen gehören 3 verschiedene Formeln:

http://de.wikipedia.org/wiki/Rohrreibungszahl

(für die 3 Bereiche gibts unzählige andere Formeln, aber der Einfachheit halber hab ich hier Wiki verlinkt)

Für den glatten und den rauhen Bereich gibts Formeln wo man Lambda direkt berechnen kann, aber für den Übergangsberich fand ich bisher nur Formeln wo man Lambda iterativ berechnen muss.

Wie programmiert man das in VBA???

In Excel hab ich dazu die Zielwertsuche benutzt, aber das muss doch zu proggen gehen...

edit: wie zum Geier bekomme ich den Logarithmus zur Basis 10 berechnet, mit "Log" berechnet er laut meinem Taschenrechner den nat. Logarithmus :(

tschau

Neomi
2009-08-13, 03:08:08
Vom konkreten Problem mit Rohrdruck und drumherum habe ich keine Ahnung, aber eine iterative Zielwertsuche funktioniert grob so:
Wenn du eine Abbildung (Funktion) von Parametern auf einen Zielwert hast, den Zielwert kennst, die Funktion aber nicht umkehren kannst, dann startest du einfach mit beliebigen (schätzometrisch ermittelten) Parametern und berechnest deren Ergebnis. Das vergleichst du mit dem Zielwert. Abhängig davon, wie das Ergebnis zum gesuchten Zielwert steht, paßt du die Startparameter für die Berechnung so an (z.B. den Mittelwert oder mehrere zufällige Versuche aus einem kleiner werdenden Intervall an möglichen Startparametern), daß du dem gewünschten Ergebnis näher kommen solltest. Damit berechnest du ein neues Ergebnis, paßt die Parameter wieder an und so weiter, jeder Durchlauf ist eine Iteration. Und das machst du dann so lange, bis du dem gewünschten Ergebnis nahe genug kommst, nicht mehr näher rankommst, du dein Budget an Iterationen aufgebraucht hast, die für dich beste Abbruchbedingung eben.

Der Logarithmus von x zur Basis y ist gleich dem Logarithmus von x zur Basis z geteilt durch den Logarithmus von y zur Basis z. In kurz:
log10(x) = logn(x) / logn(10)

3dzocker
2009-08-13, 12:38:15
also ich hab das jetzt mehrmals durchgelesen, aber da ich vom proggen nicht wirklich viel Ahnung hab, muss ich leider eingestehen dass ich das nicht ganz kapiere :(

Als Bsp. nehmen wir die Formel von Colebrook:
http://www.abload.de/thumb/colebrookbb0d.jpg (http://www.abload.de/image.php?img=colebrookbb0d.jpg)

k und d kenne ich (die sind konstant, du schreibst was von Parametern anpassen, das geht doch nicht) und die Funktion auch. Den Startwert würde ich auf 1 festlegen - das richtige Ergebnis kommt früher oder später ;)
Allerdings kenne ich den Zielwert nicht, deshalb kann ich da nix vergleichen.
Das Einzige was sich ändert ist halt der immer "besser" werdende Lambda-Wert.
Aber wie krieg ich das hin dass das Prog beim 2. Durchlauf den berechneten Wert des 1. Durchlaufs nimmt???
Irgendwo was in einer Zelle zwischenspeichern will ich nicht.

das mit dem Logarithmus muss ich mal probieren... liest sich kompliziert.

tschau

pest
2009-08-13, 15:08:50
wo ist das problem :confused:

in pseudo-code (wenn du eine fixpunkt-iteration durchführen willst)

l_neu = funktion(l_alt)
wenn abs(l_alt-l_neu)<1e-8 dann abbruch
l_alt = l_neu

3dzocker
2009-08-13, 19:21:50
das Problem ist dass ich NULL!!! Ahnung hab und mit dieser Aufgabe n bissi VBA lernen will.
So "Learning by Doing" ;)

Auch mit dem Pseudocode kann ich leider nix anfangen...

Wenn ich die Iteration Schritt für Schritt mache und das neue Ergebnis in ne Zelle schreibe ist das kein Problem, aber das wär doch unelegant.

tschau

instinct
2009-08-13, 19:41:10
Eine Iteration besteht nun einmal aus Schritten :)

Vielleicht solltest du dir mal ein paar Tutorials/Buecher besorgen, in denen die grundlegenden Konzepte wie Branches/Loops erklärt werden. Learning by doing bringt nur was, wenn du einen Leitfaden hast bzw. dich irgendworan orientieren kannst

Gast
2009-08-17, 14:36:04
was isn das hier, der endlosschleifen-thread? ^^