Code:
Dim MotorDrehm, Antrieb, J, Mg, Hs, w, wneu, wkr, wkrneu, phi, phineu, Hp, Mp, Mrad, r, alpha, alphaneu, D, alphapunkt, alphapunktneu, n, t, g, pi, X, xneu, Y, yneu, v, Xmaus, Ymaus, Meter, Pendelausschlag, Pendelausschlagneu
Dim F1, F2, F3, F4
Private Sub Form_Load()
Mg = 4: Mrad = 1: Mp = 0.1: r = 0.3: Hs = 0.2: alpha = 0: Hp = 0.4: D = 0.1: g = 10
wkr = 0: v = 1.5: n = 1000: g = 10: MotorDrehm = 0.3: Meter = 100
pi = 3.1415926535
Label1 = "Zeitfaktor:" & vbCrLf & "Gesamtmasse (kg):" & vbCrLf & "Masse Reifen (kg):" & vbCrLf & "Radius Reifen (m):" & vbCrLf & "Höhe Schwerpunkt (m):" & vbCrLf & "Höhe Pendel (m):" & vbCrLf & "Masse Pendel (kg):" & vbCrLf & "Länge Pendel (m):" & vbCrLf & "Geschwindigkeit (m/s):" & vbCrLf & "MotorDrehmoment Nm:" & vbCrLf & "Massstab"
Text2 = n: Text3 = Mg: Text4 = Mrad: Text5 = r: Text6 = Hs: Text7 = Hp: Text8 = Mp: Text9 = D: Text10 = v: Text11 = MotorDrehm: Text13 = Meter
Command1.Caption = "Start"
Form1.Show
End Sub
Sub berechnen()
On Error Resume Next
J = Mrad * r ^ 2
Do
DoEvents
'Berechnungen nach der Formel d/dt (delta L/deltaqi) = deltaL/deltaqi
'als erstes von qi = alpha
AbLalpha = AblLalpha(w, wkr, alpha, alphapunkt)
dif = (AblLalphapunkt(w, wkr, alpha, alphapunkt + 0.0001) - AblLalphapunkt(w, wkr, alpha, alphapunkt)) * 10000
alphapunktpunkt = AbLalpha / dif
' qi = w und qi = wkr hängen voneinander ab und werden durch Iteration bestimmt
wkrpunkt = 1: wpunkt = 1
For i = 1 To 10
DoEvents
dif1 = AblLw(w + wpunkt * 0.0001, wkr + wkrpunkt * 0.0001, alpha + alphapunkt * 0.0001, alphapunkt + alphapunktpunkt * 0.0001) - AblLw(w, wkr, alpha, alphapunkt)
dif2 = AblLw(w + wpunkt * 0.0002, wkr + wkrpunkt * 0.0001, alpha + alphapunkt * 0.0001, alphapunkt + alphapunktpunkt * 0.0001) - AblLw(w, wkr, alpha, alphapunkt)
wpunkt = wpunkt - wpunkt / (dif2 - dif1) * dif1
dif3 = AblLwkr(w + wpunkt * 0.0001, wkr + wkrpunkt * 0.0001, alpha + alphapunkt * 0.0001, alphapunkt + alphapunktpunkt * 0.0001) - AblLwkr(w, wkr, alpha, alphapunkt)
dif4 = AblLwkr(w + wpunkt * 0.0001, wkr + wkrpunkt * 0.0002, alpha + alphapunkt * 0.0001, alphapunkt + alphapunktpunkt * 0.0001) - AblLwkr(w, wkr, alpha, alphapunkt)
wkrpunkt = wkrpunkt - wkrpunkt / (dif4 - dif3) * dif3
Next
'Aktualisieren der Werte nach Berechnung
wpunkt = wpunkt + Antrieb / J 'Einfluss Motor
wneu = w + wpunkt / n
wkrneu = wkr + wkrpunkt / n
'alphapunktpunkt = alphapunktpunkt + Pendelausschlagneu * Mp * Cos(alpha) / Mg / Hs ^ 2 ' Einfluss Pendel durch Schwerpunktverlagerung
alphapunktneu = alphapunkt + alphapunktpunkt / n
alphapunktneu = alphapunktneu - (Pendelausschlagneu - Pendelausschlag) * n * Mp * Hp / Mg / Hs ^ 2 ' Einfluss Pendel durch Impuls
alphaneu = alpha + alphapunktneu / n
v = wneu * r
phineu = phi + wkrneu / n
xneu = X + v * Sin(phineu) / n: yneu = Y + v * Cos(phineu) / n:
zeichnen
alphapunkt = alphapunktneu: alpha = alphaneu: w = wneu: wkr = wkrneu: phi = phineu: X = xneu: Y = yneu: Pendelausschlag = Pendelausschlagneu
If alpha > pi / 2 Or alpha < -pi / 2 Then Command1.Caption = "Start"
If Command1.Caption = "Start" Then Exit Sub
DoEvents
Loop
End Sub
Function L(w, wkr, alpha, alphapunkt) 'Lagrange-Funktion
DoEvents
L = 1 / 2 * Mg * (w * r - wkr * Hs * Sin(alpha)) ^ 2 'kinetische Energie durch Vorwärtsbewegung
L = L + 1 / 2 * J * w ^ 2 'kinetische Energie durch Raddrehung
L = L + 1 / 2 * Mg * Hs ^ 2 * alphapunkt ^ 2 'kinetische Energie durch Kippen
L = L + 1 / 2 * Mrad * r ^ 2 * (1 + Sin(alpha) * Sin(alpha)) * wkr ^ 2 'kinetische Energie durch Raddrehung um Hochachse
L = L - Mg * Hs * g * Cos(alpha) 'potentielle Energie
End Function
Function AblLw(w, wkr, alpha, alphapunkt) 'partielle Ableitung der Lagrange -Funktion nach w
AblLw = L(w + 0.0001, wkr, alpha, alphapunkt) - L(w, wkr, alpha, alphapunkt)
AblLw = AblLw * 10000
End Function
Function AblLwkr(w, wkr, alpha, alphapunkt) 'partielle Ableitung der Lagrange -Funktion nach wkr
AblLwkr = L(w, wkr + 0.0001, alpha, alphapunkt) - L(w, wkr, alpha, alphapunkt)
AblLwkr = AblLwkr * 10000
End Function
Function AblLalpha(w, wkr, alpha, alphapunkt) 'partielle Ableitung der Lagrange -Funktion nach alpha
AblLalpha = L(w, wkr, alpha + 0.0001, alphapunkt) - L(w, wkr, alpha, alphapunkt)
AblLalpha = AblLalpha * 10000
End Function
Function AblLalphapunkt(w, wkr, alpha, alphapunkt) 'partielle Ableitung der Lagrange -Funktion nach alphapunkt
AblLalphapunkt = L(w, wkr, alpha, alphapunkt + 0.0001) - L(w, wkr, alpha, alphapunkt)
AblLalphapunkt = AblLalphapunkt * 10000
End Function
Sub Formeln()
'w = v / r
'J = Mrad * r ^ 2
'vs = v - wkr * Hs * Sin(alpha)
'vs = w * r - wkr * Hs * Sin(alpha)
'E = 1 / 2 * Mg * vs ^ 2
'E = 1 / 2 * Mg * (w * r - wkr * Hs * Sin(alpha)) ^ 2
'E = E + 1 / 2 * J * w ^ 2
'E = E + 1 / 2 * Mg * Hs ^ 2 * alphapunkt ^ 2
'E = E + 1 / 2 * J * (1 + Sin(alpha) * Sin(alpha)) * wkr ^ 2
'P = Mg * Hs * g * Cos(alpha)
'L = E - P
'd/dt (delta L/deltaqi) = deltaL/deltaqi
End Sub
Private Sub Command1_Click()
If Command1.Caption = "Stop" Then
Command1.Caption = "Start"
Else
Command1.Caption = "Stop"
t = 1: w = 0: wkr = 0: alpha = 0: alphapunkt = 0: X = 0: Y = 0: phi = 0
n = Text2: Mg = Text3: Mrad = Text4: r = Text5: Hs = Text6: Hp = Text7: Mp = Text8: D = Text9: v = Text10: MotorDrehm = Text11: Meter = Text13
w = v / r
Picture1.Cls
For i = 1 To 300
Picture1.Line (Meter * i, 1)-(Meter * i, 100)
Next
berechnen
End If
End Sub
Sub zeichnen()
t = t + 1
Picture1.Line (3000 - Meter * X, 3000 - Meter * Y)-(3000 - Meter * xneu, 3000 - Meter * yneu)
Picture2.Cls
Picture2.Line (700, 700)-(700 - 500 * Sin(alpha), 700 - 500 * Cos(alpha))
Text1 = "Sec: " & t / n
Picture1.Refresh
Text12 = "Geschw.: " & Format(v, "##.###"): Text12.Refresh
End Sub
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Command1.Caption = "Start" Then Xmaus = X: Ymaus = Y
D1 = X - Xmaus: D2 = Ymaus - Y
If D2 >= 600 Then D2 = 600
If D2 <= -600 Then D2 = -600
If D1 >= 300 Then D1 = 300
If D1 <= -300 Then D1 = -300
Pendelausschlagneu = -D1 / 300 * D
Antrieb = MotorDrehm * D2 / 600
Picture3.Cls
Picture3.Circle (700 + D1, 700 - D2), 50
End Sub
Die Berechnunger erfolgen mit dem Lagrange-Formalismus. Wer sich damit auskennt, den möchte ich bitten darüber zu sehen. Fehler sind natürlich nicht auszuschließen. Insb. bin ich mir nicht sicher ob ich die
Lesezeichen