Servus!
Ich möchte ein Programm schreiben, das die harmonische Schwingung simuliert,
also die DGl s(t)=-D/m*a(t) numerisch löst.
Den Teil habe ich (mit umfangreicher Unterstützung) auch geschafft.
Der Code, der den nächsten Schritt der DGl (mit der Schrittweite h) berechnet, lautet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TOsz.nextStep(var s: Single; var v: Single); var Fa, Fb, Fc, Fd: Array[0..1] of Single; omega, z1, z2: Single; begin omega := - D / m; z1 := s; z2 := v;
Fa[0] := z2; Fa[1] := omega * z1;
Fb[0] := z2 + (h / 2) * Fa[1]; Fb[1] := omega * (z1 + (h / 2) * Fa[0]);
Fc[0] := z2 + (h / 2) * Fb[1]; Fc[1] := omega * (z1 + (h / 2) * Fa[0]);
Fd[0] := z2 + h * Fc[1]; Fd[1] := omega * (z1 + h * Fc[0]);
s := s + (h / 6) * (Fa[0] + (2 * Fb[0]) + (2 * Fc[0]) + Fd[0]); v := v + (h / 6) * (Fa[1] + (2 * Fb[1]) + (2 * Fc[1]) + Fd[1]); end; |
Jetzt wollte ich nicht nur ein, sondern mehrere Oszillatoren abhängig voneinander, also gekoppelt, schwingen lassen.
Die untenstehende Funktion wird von einem Timer aufgerufen und das Ergebnis ausgegeben (habe ich hier weggelassen).
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| for i := 0 to AnzahlOsz - 1 do begin BuffS[i] := OszS[i]; BuffV[i] := OszV[i]; end; if AnzahlOsz > 1 then begin
for i := 0 to AnzahlOsz - 1 do begin if (i = 0) then begin OszS[i] := OszS[i] - BuffS[i + 1]; Osz.nextStep(OszS[i], OszV[i]); OszS[i] := OszS[i] + BuffS[i + 1]; end;
if (i > 0) and (i < AnzahlOsz - 1) then begin OszS[i] := 2 * OszS[i] - BuffS[i - 1] - BuffS[i + 1]; Osz.nextStep(OszS[i], OszV[i]); OszS[i] := 0.5 * (OszS[i] + BuffS[i - 1] + BuffS[i + 1]); end;
if (i = AnzahlOsz - 1) then begin OszS[i] := OszS[i] - BuffS[i - 1]; Osz.nextStep(OszS[i], OszV[i]); OszS[i] := OszS[i] + BuffS[i - 1]; end; end; end else Osz.nextStep(OszS[0], OszV[0]); |
Mein Problem ist, dass alles (bei mehr als einem Schwinger) ausser Kontrolle zu geraten scheint.
Zunächst läuft alles normal, aber nach einer Weile verschieben sich alles OszS-Werte immer weiter in den
negativen Bereich.
An der nextStep-Methode liegt es meines Erachtens nach nicht, denn ein einzelner Oszillator macht
nicht so nen Quatsch.
Habt ihr eine Idee?
Und Danke schonmal im Vorraus!