harmonische schwingung darstellen

cantharis

Grünschnabel
Hallo,

ich versuche mit Java eine harmonische Schwingung grafisch darzustellen. Leider sieht die Schwingung nicht ganz vollständig aus :(. Ich weiß nicht ob ich einen Programmierfehler oder einen Fehler in den Formeln habe. Vielleicht hat ja wer eine Idee :D
Code:
double  ds = 10;
		double  a = ds;
		double  mm = 1000;
		double  dd = 10;
		double  dv = 0;
		double  T =100;
		int     anz =1000;
		double  dt = T/anz;
		double  da=-dd/mm*ds;
		double  old=0;
		double  xk;
		double  yk;
		g.setColor(Color.RED);
		for (double t = 0; t < T; t=t+dt){
			
			ds=ds+0.5*da*t*t+dv*t;

			da = -dd/mm*ds;
			
			dv =da*dt;
				
			xk=250/T*t+250;
			yk=250/a*ds+250;
			if(t==0)
				old=yk;
			
			g.drawLine((int) xk, (int)old/2, (int) xk, (int) yk/2);
			old = 250/a*ds+250;
		}
vielleicht kennt sich ja wer damit aus und kann mir helfen
Liebe Grüße
 
Zuletzt bearbeitet:
Guten Abend!

Zunächst mal wären [ code ] Tags eine tolle Sache - Dein Code wird dadurch lesbarer :)

Zum Thema: Für mich hat eine harmonische Schwingung immer was mit Sinus, manchmal auch mit Cosinus-Funktionen zu tun - sowas finde ich in deinem Code aber nicht. Kannst du mal genauer erklären, was für Formeln du benutzt?

mfg,

RoCMe
 
Hallo,

tut mir Leid das mit dem [ code ] habe ich gestern Abend völlig vergessen :\ .
Ja genau harmonische Schwingungen haben immer eine Sinus Cosinus Form. Allerdings sollte diese Sinus Cosinus Schwingung durch die von mir verwendeten Formeln zustande kommen.

Also dd ist die Federkonstante, mm die Masse, ds die Auslenkung, dv die Geschwindigkeit, T sollte der Zeitabschnitt den ich betrachte sein.

da=-dd/mm*ds; Mit dieser Formel wird die Beschleunigung berechnet. Man sieht sie kann nur positiv werden wenn die Auslenkung negativ wird.

dv =da*dt; Damit berechne ich die Geschwindigkeit.

ds=ds+0.5*da*t*t+dv*t; Und mit dieser Formel sollte eigentlich die Auslenkung berechnet werden.

xk=250/T*t+250;
yk=250/a*ds+250;
Mit diesen beiden Formeln möchte ich die Werte die ich für t und ds herausbekomme, da es ja Punkte wie 0.5 in meinem Fenster nicht gibt, umrechnen in Koordinaten.
 
Hallo!

Ganz kurz:

Hier steht, dass drawLine die Argumente x1, y1, x2, y2 erwartet - in genau dieser Reihenfolge. Die x-Koordinaten der beiden Punkte, die du da übergibst, sind gleich. ist das wirklich so gewollt?

EDIT: Wie genau sieht die Darstellung denn überhaupt aus? "Nicht ganz vollständig" ist keine genaue Beschreibung des Problems...

EDIT2... war Blödsinn :)
 
Zuletzt bearbeitet:
Hi,
Ja das ist so gewollt könnte man besser machen hast du recht, ist glaube ich aber nicht das Problem. Ich habe mal ein screenshot der Schwingung gemacht und angehängt.
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    6,7 KB · Aufrufe: 6
Gerade mal deinen Code in eine main Methode gepackt und das ds ausgegeben - das lief gegen 0 und blieb dann da. Dein Koordinatensystem scheint also nicht mit deinem Graphen "synchron" zu sein...

Die Geschwindigkeit wurde auch 0... und genaues hinsehen ergab, dass du, statt die Geschwindigkeitsänderung zu addieren, die Geschwindigkeit gleich neu setzt:


Du willst aber ja die Änderung dazu addieren:


Code:
dv += da*dt;

Ausserdem solltest du dafür nicht die in diesem Iterationsschritt berechnete Beschleunigung nehmen, sondern die zuvor berechnete, also musst du die dv und die da Berechnung in der Reihenfolge noch austauschen.

Jetzt sieht das ganze bei mir so aus. Richtig funktionieren tuts aber immer noch nicht.
Code:
public class Swing {

    public static void main(final String[] args) throws InterruptedException {
        double ds = 10;
        final double a = ds;
        final double mm = 1000;
        final double dd = 10;
        double dv = 0;
        final double T = 100;
        final int anz = 100;
        final double dt = T / anz;
        double da = -dd / mm * ds;
        double old = 0;
        double xk;
        double yk;
        // g.setColor(Color.RED);
        for (double t = 0; t < T; t = t + dt) {

            ds = ds + 0.5 * da * t * t + dv * t;

            dv += da * dt;
            da = -dd / mm * ds;

            xk = 250 / T * t + 250;
            yk = 250 / a * ds + 250;
            if (t == 0) {
                old = yk;
            }

            // g.drawLine((int) xk, (int) old / 2, (int) xk, (int) yk / 2);
            old = 250 / a * ds + 250;
            System.out.println(ds);
            //Thread.sleep(1000);

        }
    }
}

Irgendwo haben wir eine Art Dämpfung eingebaut, eventuell ändert sich auch die Periode, dass müsstest du noch mal genauer untersuchen.
Evtl. guck ich später noch mal genauer!
 
Hallo,

ja das stimmt. Bei mir beschleunigt die Schwingung entweder oder sie wird gedämpft.
Ich habe nochmal alles durchgetauscht und mögliche Variablen geändert, bin und bleibe aber ratlos :(

ich hab es auch schon anders versucht:
Code:
final double T =Math.PI*2*java.lang.Math.sqrt(mm/dd);
Schwindungsdauer berechnet und dann
Code:
ds=a*sin(2*Math.PI*1/T*t);
damit die Auslenkung berechnet. Allerdings funktioniert das auch nicht so wie ich mir das vorstelle.

Wäre echt super wenn du dir nochmal zeit nehmen würdest :D
Vielen Dank und liebe Grüße
 
Also los:

In deinem Code berechnest du die Auslenkung so:

ds = ds + 0.5 * da * t * t + dv * t;
Du darfst aber hier nicht t nehmen, sondern dt! Das mathematisch / physikalisch zu erklären ist mir gerade zu aufwendig, aber du simulierst hier ja eine Differentialgleichung - also dt, nicht t!

Wenn du das ersetzt, bekommst du eine Schwingung, allerdings kommt es früher oder später zu einer Resonanzkatastrophe ;-) Die Amplitude wird aus irgend einem Grund immer groesser...

Das war der punkt, wo ich dann doch meine Sinuskünste ausgepackt hab ;-)

Code:
    public static void main(final String[] args) throws InterruptedException {
        double ds = 10;
        final double a = ds;
        final double mm = 1000;
        final double dd = 10;
        final double T = 100;
        final int anz = 100;
        final double dt = T / anz;
        final double kreisfrequenz = Math.sqrt(dd / mm);
        for (double t = 0; t < T; t = t + dt) {
            ds = a * Math.sin(kreisfrequenz * t);
            System.out.println(t + ":\t" + ds);
        }
    }
}

So schwingt das ganze schon mal ganz toll. Wenn ich das mit deinen "Gleichungen" vergleiche, mache ich im Prinzip das gleiche wie du - mit dem Unterschied, dass ich mir das 2*Pi spare, weil es sich sowieso wieder rauskürzt... ;-)

Wenn du noch Fragen hast frag. Ansonsten versuch mal, die Anzeige einzubauen und melde dich, obs klappt!

EDIT: Ich hab deinen Fehler gefunden :p Beim Berechnen der Periode musst du die Federkonstante durch die Masse teilen (dd / mm), und nicht andersrum :-p
 
Super vielen vielen vielen Dank****** Klappt super.
Klasse das ich Stundenlang nach dem Fehler gesucht habe und einfach nur dd/mm vertauscht habe XD.

Aber eine Frage hätte ich noch die vielleicht nicht ganz zum Thema passt, aber ich zeichne auf einer Canvas und nach der 3ten Schwingung ist das ziemlich unübersichtlich. Gibt es eine Möglichkeit die zu clearen?
 
Gern geschehen! Ich hab sowas ähnliches vor Jahren mal gemacht, als ich meine Facharbeit in Physik mit einem kleinen Bonus-Programm etwas aufpeppen wollte...

Ich bin kein guter GUI Entwickler, insbesondere mit Swing hab ich nie viel gemacht. Was du auf jeden Fall machen kannst ist ein Rechteck über den gesamten Bereich schreiben. Canvas sagt mir nichts, aber ein Graphics Objekt besitzt eine clearRect Methode... Google mal ein bisschen, bist bestimmt nicht der erste, der sowas versucht ;-)
 
Zurück