Hey Community!
Ich programmiere momentan an einem Programm, welches den freien Fall in Luft berechnen soll. Ich orientiere mich hierbei an einem JavaScript, welches einwandfrei funktioniert.
Code:
Spoiler anzeigen
Mein vb.net Code sieht so aus:
Spoiler anzeigen
Wenn ihr die beiden Programme, bzw. das Script ausführt, werdet ihr merken, dass bei dem vb.net Code komplett unrealistische Werte rauskommen.
Habt ihr eine Idee was ich da falsch gemacht habe? Freue mich auf eure Antworten
Edit: 'Tschuldigung Quellecode von VB.NET war falsch bezüglich der Übertragung der Werte für die Variablen. (Jetzt korrigiert)
Scheint ja doch eher ein VB-Problem zu sein => Topic verschoben
Ich programmiere momentan an einem Programm, welches den freien Fall in Luft berechnen soll. Ich orientiere mich hierbei an einem JavaScript, welches einwandfrei funktioniert.
Code:
HTML-Quellcode
- <!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
- <html>
- <head>
- <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
- <meta name="GENERATOR"
- content="Mozilla/4.74 [de] (X11; U; Linux 2.2.16-SMP i686) [Netscape]">
- <title>Fall mit Luftwiderstand</title>
- </head>
- <body>
- <form name="Fall">
- <h3>Tabelle zum Fall mit Luftwiderstand</h3>
- <h3><span style="font-weight: normal;">Hier ist also ein kleines
- Programm, das die Berechnung für
- den freien Fall mit Luftwiderstand
- ausführt.</span><br>
- </h3>
- <br>
- Wir gehen davon aus, dass ein Körper mit der Masse m aus einer
- vorgegebene Höhe fallen gelassen wird.<br>
- Dabei wirkt der Luftwiderstand, zu seiner Berechnung sind der c<sub>w</sub>-Wert
- (von der Form abhängig, <a href="cw-Werte.html">hier steht
- eine Tabelle zur Orientierung)</a> und die Fläche notwendig.
- <br>
- <br>
- <br>
- In der Eingabezeile sind für Höhe, c<sub>w</sub>-Wert,
- Masse,
- Fläche usw. schon Werte vorgegeben: Eine große Kugel
- (Fläche 1 m<sup>2</sup>) mit 20 kg Masse fällt aus 100 m
- Höhe zur Erde. <br>
- Die Werte kannst Du durch
- einfaches Überschreiben ändern. <br>
- <br>
- Mit dem Button "Hau rein" lässt Du den Computer dann die aktuelle
- Kraft, Beschleunigung, Geschwindigkeit und Höhe des
- Körpers in Abhängigkeit von der Zeit berechnen.
- <p>Es erscheint dann auf einer neuen Seite eine Tabelle mit den
- Werten für F, a, v und s in Abhängigkeit von der Zeit t.<br>
- Daraus kannst Du<br>
- - ablesen, wie lange der Körper bis zum Boden gebraucht hat.<br>
- - ablesen, ob und ab wann die Geschwindigkeit konstant geblieben ist.<br>
- - ablesen, wie Kraft und Beschleunigung sich verhalten, wenn die
- Geschwindigkeit konstant bleibt.<br>
- - Beschleunigung, Geschwindigkeit und Höhe in Abhängigkeit
- von t
- darstellen.<br>
- </p>
- <p>Bei kleinen Zeitschritten erhältst Du wesentlich mehr Werte,
- dafür wird das Ergebnis aber genauer. <br>
- </p>
- <p>Wenn Du die Datei "fall.html" herunterlädst und in
- einem
- Texteditor öffnest, kannst Du mit dem JavaScript-Code
- experimentieren.Viel
- Spaß! <br>
-
- <table border="1" cellpadding="3">
- <tbody>
- <tr>
- <td colspan="10">Starthöhe in m</td>
- <td colspan="10"><input type="text" value="100" name="h0"
- size="5"></td>
- <td colspan="10">cw-Wert</td>
- <td colspan="10"><input type="text" value="0.50" name="cw"
- size="5"></td>
- <td colspan="10">Masse in kg</td>
- <td colspan="10"><input type="text" value="20.00" name="m"
- size="5"></td>
- <td colspan="10">Fläche in m^2</td>
- <td colspan="10"><input type="text" value="1.00" name="A"
- size="5"></td>
- <td colspan="10">Zeitschritt in s</td>
- <td colspan="10"><input type="text" value="0.1" name="dt"
- size="5"></td>
- <td colspan="10"><input type="button" value="Hau rein"
- onclick="rechnefall()"></td>
- </tr>
- </tbody>
- </table>
- <script language="JavaScript">
- function rechnefall(){
- var f=document.Fall;
- var h0=parseFloat(f.h0.value);
- var cw=parseFloat(f.cw.value);
- var m=parseFloat(f.m.value);
- var A=parseFloat(f.A.value);
- var dt=parseFloat(f.dt.value);
- var v = 0;
- var h = h0;
- var t = 0;
- document.write("<CENTER> <TABLE BORDER>");
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(" t[s]" );
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write("F[N]");
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write("a[m/s^2]");
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write("v[m/s]");
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write("h[m]");
- document.write("<br>");
- while (h>0){
- F=-m*9.81+1/2*1.2*cw*A*v*v;
- a=F/m;
- dv=a*dt;
- v=v+dv;
- dh=v*dt;
- h=h+dh;
- t=t+dt;
- tr=Math.round(1000*t)/1000;
- Fr=Math.round(1000*F)/1000;
- ar=Math.round(1000*a)/1000;
- vr=Math.round(1000*v)/1000;
- xr=Math.round(1000*h)/1000;
- document.write("<TR>");
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(tr );
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(Fr);
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(ar);
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(vr);
- document.write("<TD COLSPAN= 50 ALIGN=CENTER>");
- document.write(xr);
- document.write("<br>");
- }
- document.write("</TABLE></CENTER> ");
- }
- </script>
- </p>
- </form>
- </body>
- </html>
Mein vb.net Code sieht so aus:
VB.NET-Quellcode
- Imports System.IO
- Class MainWindow
- Private Sub Rechnen_click(sender As Object, e As RoutedEventArgs) Handles Rechnen.Click
- 'Legt die einzelnen Variablen als Dezimalzahlen fest
- Dim F, Fg, Fl, v, h, t, dv, dh, dt, cw, m, ar, Fr, tr, vr, xr, g, p, halbe, a, af As Decimal
- 'Zur Vereinfachung des folgendenen Codes, werden hier die Werte in Variablen geschrieben
- g = Val("9.81")
- p = Val("1,2")
- halbe = Val("0,5")
- F = Val("0")
- 'Konvertierung der Decimal-Werte zu Double
- af = Decimal.ToDouble(AFläche.Text)
- cw = Decimal.ToDouble(cwt.Text)
- dt = Decimal.ToDouble(deltaT.Text)
- m = Decimal.ToDouble(mt.Text)
- h = Decimal.ToDouble(ht.Text)
- If af > 0 And cw > 0 And dt > 0 And m > 0 And h > 0 Then
- 'Ordner für StreamWriter erstellen
- Dim DirectoryPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Ergebnisse"
- 'Legt fest was objStreamWriter{0,1,2,3,4} sind
- Dim objStreamWriter0 As StreamWriter
- If (Directory.Exists(DirectoryPath) = True) Then
- Else
- Directory.CreateDirectory(DirectoryPath)
- End If
- 'Legt fest wohnin die Tabelle geschrieben werden soll
- objStreamWriter0 = New StreamWriter(DirectoryPath & "\Ergebnisse.html")
- 'Schreibt die Formation für Das HTML-Dokument
- objStreamWriter0.WriteLine("<CENTER> <TABLE BORDER>")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(" t[s]")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine("F[N]")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine("a[m/s^2]")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine("v[m/s]")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine("h[m]")
- objStreamWriter0.WriteLine("<br>")
- 'Schleife um die Werte auszurechnen und ihn ihr jeweiliges Dokument zu schreiben
- Do While h > 0
- 'Berechnungen der Einzelnen Werte
- Fg = -m * g
- Fl = halbe * p * cw * af * v * v
- F = Val(Fg + Fl)
- a = Val(F / m)
- dv = a * dt
- v = v + dv
- dh = v * dt
- h = h + dh
- t = t + dt
- 'Berechnung der gerundeten Werte für die Tabelle
- tr = Math.Round(1000 * t) / 1000
- Fr = Math.Round(1000 * F) / 1000
- ar = Math.Round(1000 * a) / 1000
- vr = Math.Round(1000 * v) / 1000
- xr = Math.Round(1000 * h) / 1000
- 'Schreibt die Ergebnisse in die Tabelle
- objStreamWriter0.WriteLine("<TR>")
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(tr)
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(Fr)
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(ar)
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(vr)
- objStreamWriter0.WriteLine("<TD COLSPAN= 50 ALIGN=CENTER>")
- objStreamWriter0.WriteLine(xr)
- Loop
- 'Schließt das Dokument mit der Tabelle und zeigt an, dass die Berechnungen fertig sind.
- objStreamWriter0.Close()
- Info.Text = "Berechnungen sind fertig."
- Process.Start(DirectoryPath & "\Ergebnisse.html")
- Else
- 'Wird angezeigt, wenn einer der Werte gleich Null ist.
- If (af <= 0) Then
- AFläche.Text = "Überpüfen sie bitte die Eingabe"
- End If
- If (cw <= 0) Then
- cwt.Text = "Überpüfen sie bitte die Eingabe"
- End If
- If (dt <= 0) Then
- deltaT.Text = "Überpüfen sie bitte die Eingabe"
- End If
- If (h <= 0) Then
- ht.Text = "Überpüfen sie bitte die Eingabe"
- End If
- If (m <= 0) Then
- mt.Text = "Überpüfen sie bitte die Eingabe"
- End If
- End If
- End Sub
- End Class
Wenn ihr die beiden Programme, bzw. das Script ausführt, werdet ihr merken, dass bei dem vb.net Code komplett unrealistische Werte rauskommen.
Habt ihr eine Idee was ich da falsch gemacht habe? Freue mich auf eure Antworten
Edit: 'Tschuldigung Quellecode von VB.NET war falsch bezüglich der Übertragung der Werte für die Variablen. (Jetzt korrigiert)
Scheint ja doch eher ein VB-Problem zu sein => Topic verschoben
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Agassi“ ()