Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi (realistische) Dämpfung eines Pendels (https://www.delphipraxis.net/25350-realistische-daempfung-eines-pendels.html)

Wheelie 5. Jul 2004 10:41


(realistische) Dämpfung eines Pendels
 
Wie einige schon wissen, entwickle ich für eine kleine Belegarbeit eine grafische Pendelkomponente zur Simulation eines mathematischen Pendels. Dabei habe ich mich an Luckie's Pendelsimulation orientiert ... Danke schonmal an Luckie :zwinker:

Nun möchte ich die reale Pendeldämpfung bei maximaler Auslenkung entwickeln, finde dazu aber überhaupt keinen Ansatz.

Hier der bisherige Quelltext:
Delphi-Quellcode:
unit Pendel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, Math;

type
  TPendel = class(TCustomControl)
  private
    { Private-Deklarationen }

    Timer: TTimer;
    Bitmap: TBitmap;

    Winkel, PendelLaenge: Integer;
    PendelLinks: Boolean;

    procedure TimerOnTimer(Sender: TObject);
    procedure PendelZeichnen(Winkel: Integer);

  protected
    { Protected-Deklarationen }

  public
    { Public-Deklarationen }

    constructor Create(AOwner: TComponent); override;
    procedure Paint; override;
    function Gegenkathete(Winkel: Integer): Real;
    function Ankathete(Winkel: Integer): Real;

  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Pendel', [TPendel]);
end;

function TPendel.Gegenkathete(Winkel: Integer): Real;
begin
  Result := Sin(DegToRad(Winkel)) * PendelLaenge;
end;

function TPendel.Ankathete(Winkel: Integer): Real;
begin
  Result := Cos(DegToRad(Winkel)) * PendelLaenge;
end;

constructor TPendel.Create;
begin
  inherited Create(AOwner);

  if Width = 0 then Width := 300;
  if Height = 0 then Height := 250;

  Bitmap := TBitmap.Create;

  Timer := TTimer.Create(Self);
  Timer.Interval := 50;
  Timer.OnTimer := TimerOnTimer;
  Timer.Enabled := True;
end;

procedure TPendel.TimerOnTimer(Sender: TObject);
begin
  if (Width <> Bitmap.Width) or (Height <> Bitmap.Height) then
  begin
    Bitmap.Width := Width;
    Bitmap.Height := Height;
    PendelLaenge := Height - 50;
  end;

  if not PendelLinks then Inc(Winkel)
   else Dec(Winkel);

  if Winkel = 30 then PendelLinks := True;
  if Winkel = -30 then PendelLinks := False;

  Paint;
end;

procedure TPendel.PendelZeichnen(Winkel: Integer);
begin
  Bitmap.Canvas.MoveTo(Width div 2, 25);

  // Pendelfaden
  Bitmap.Canvas.LineTo(Width div 2 + Round(Gegenkathete(Winkel)),
    Round(Ankathete(Winkel)));

  // Pendelkörper
  Bitmap.Canvas.Brush.Color := clBlack;
  Bitmap.Canvas.Brush.Style := bsSolid;
  Bitmap.Canvas.Ellipse(Width div 2 + Round(Gegenkathete(Winkel))
    - 20, Round(Ankathete(Winkel)) - 20, Width div 2 +
    Round(Gegenkathete(Winkel)) + 20, Round(Ankathete(Winkel)) + 20);
end;

procedure TPendel.Paint;
begin
  inherited Paint;

  // Pendel auf Bitmap im Speicher zeichnen
  PendelZeichnen(Winkel);

  // Bitmap auf Canvas der Komponente kopieren
  BitBlt(Canvas.Handle, 0, 0, Width, Height,
    Bitmap.Canvas.Handle, 0, 0, SRCCOPY);

  // Bitmap mit weiß überschreiben
  Bitmap.Canvas.Brush.Color := clWhite;
  Bitmap.Canvas.Rectangle(0, 0, Width, Height);
  Bitmap.Canvas.Brush.Color := clBlack;
end;

end.
Tatsache ist, dass das Intervall des Timers ständig geändert werden muss. Zur Berechnung fehlt mir aber irgendwie das physikalische Hintergrundwissen (:|), ihr könnt mir da aber bestimmt weiterhelfen :thuimb:

atreju2oo0 5. Jul 2004 12:07

Re: (realistische) Dämpfung eines Pendels
 
Das sind die Vorbereitungen die wir in der Uni bekommen haben...
Da steht alles drin was Du brauchen solltest...
PDF-Datei

Mario 5. Jul 2004 12:08

Re: (realistische) Dämpfung eines Pendels
 
Du veränderst mit jedem Timer-Aufruf den Winkel um 1? So ein Ansatz dürfte nicht funktionieren, da der Timer nicht "echtzeitfähig" ist.

Besser: Im Timer den Zeitablauf seit Start bestimmen und daraus den Winkel berechnen. Als Ansatz könnte dienen, das die Schwingungszeit eines Pendels ja konstant ist. Wie Du aber die Dämpfung rein rechnen könntest, weiß ich nicht.

[edit]Da war wohl jemand schneller und hatte gleich die Lösung zur Hand :zwinker: [/edit]

Wheelie 7. Jul 2004 16:26

Re: (realistische) Dämpfung eines Pendels
 
mmh ... hab mir das pdf-file zwar durchgelesen, finde dort aber keinen hinweis für die lösung meines problems. am besten wäre wirklich eine funktion, der die zeit in sekunden übergeben wird und die als funktionsergebnis den entsprechenden winkel liefert (pendellänge und fallbeschleunigung/erdbeschleunigung spielen natürlich auch eine rolle). ist sowas möglich?

EDIT: übrigens soll das pendel nicht gedämpft sein, sondern einfach eine dynamische winkelgeschwindigkeit besitzen (-> mathematisches pendel), sprich die geschwindigkeit nimmt bei maximaler auslenkung ab.

atreju2oo0 7. Jul 2004 16:37

Re: (realistische) Dämpfung eines Pendels
 
Also für ein mathematisches Pendel reicht doch ne einfache Sinus-Funktion für die Winkelbestimmung...???
Aber je realistischer das ganze werden soll desto mehr wirst Du Dich wohl mit dem Hauptsatz der Kinetik beschäftigen müssen:
Ekin=EPot

Ekin ist die kinetische Energie(Also die Geschwindigkeit in diesem Fall)
EPot ist die potentielle Energie(Also die Höhe mal masse)

In den oberen Wendepunkten ist Epot maximal und in der Mitte Ekin!
Dann noch die Dämpfung als Reibung reinrechnen und schon siehts schön aus...

Luckie 7. Jul 2004 17:49

Re: (realistische) Dämpfung eines Pendels
 
Nun ja. Wo druch wird denn das Pendel gedämpft? Durch den Luftwiderstand, durch die Reibung am Aufhängepunkt. Und damit sind wir dann bei Differenzialgleichungen gelandet, um eine realistische Dämpfung hinzubekommen.

Ein mathematisches Pendel funktioniert ja so, dass es am Punkt der maximalen Amplitude die Geschwindigkeit null hat. Mist, jetzt habe ich den Faden verloren... :roll:

em-sigma 8. Jul 2004 08:22

Re: (realistische) Dämpfung eines Pendels
 
Hallo zusammen,

so wie ich Wheelie verstanden habe, möchte er nur ein simples (mathematische Pendel) ohne gedämpfte Schwingung, sondern nur mir dynamischer Geschwindigkeit (also abhängig von der Auslenkung).

atreju2oo0 hatte schon recht mit dem Sinus. Das sieht prinzipiell folgendermaßen aus:

Auslenkung = sin(Zeit*2*pi)*MaxWinkel oder
Auslenkung = sin(Zeit*360)*MaxWinkel

MaxWinkel= maximale Auslenkung in Grad
Zeit = Periodendauer
Auslenkung = Auslenkungswinkel, abhägig von der Zeit

Ich hoffe das hilft.

Have fun,

em-sigma

em-sigma 8. Jul 2004 09:01

Re: (realistische) Dämpfung eines Pendels
 
... und hier noch ein kleiner Zusatz:

möchte man wirklich ein Pendel mit gedämpfter Schwingung, wird noch eine Exponential-Funktion benötigt.

Die Formel sieht dann folgendermaßen aus:

Auslenkung = sin(Zeit*2*pi)*exp(Zeit*Stärke)*MaxWinkel

Stärke < 0 : Schwingungsamplitude wird kleiner
Stärke > 0 : Schwingungsamplitude wird größer

Auf diese Weise wird aus dem mathematischen Pendel ein realistisches Pendel.

Viel Spaß,

em-sigma

Christian S. 8. Jul 2004 09:54

Re: (realistische) Dämpfung eines Pendels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Ich habe mal alle drei Gleichungen, die man bei einer gedämpften Schwingung erhalten kann, zusammengefasst und auch aufgeschrieben, wie man über die Lösung der DGL daran kommt.

MfG
Peter

//edit: Irgendwie komme ich mit Aktualisieren des Attachments nicht klar :?

Jelly 8. Jul 2004 10:10

Re: (realistische) Dämpfung eines Pendels
 
Zitat:

Zitat von atreju2oo0
Ekin=EPot

Das stimmt so natürlich nicht, da bei Dämpfung ja grad Energie verloren geht... Peter Lustig hat genau geschrieben, wie du ans Problem ranzugehen hast. DGl aufstellen, lösen, Systemparameter einsetzen (Pendellänge, Auslenkung, Dämpfungskonstante) und für gegebene Zeitpunkte t die Lösung ausrechnen (liefert dir dann die Auslenkung zum Zeitpunkt t) und zeichnen...

Gruß,
Tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz