Lösen einer Differntial-Gleichung mit einem DSelfDef-Script

Wenn man eine Differntial-Gleichung in eine Differenzen-Gleichung überführt, ist es sehr einfach
möglich Diese Schritt für Schritt in einem DSelfDef zu berechnen.

Wir wollen ein System mit folgender Schwingungs-Gleichung beschreiben:

Es handelt sich hier um ein System, dessen Frequenz von Außen mittels der Variable Z gesteuert
werden soll.

Nach Einsetzen von Formel (2) in (1) und Diskretisierung der restlichen Variable erhalten wir:

Und schließlich durch Umstellung nach Xk:

Da die Berechnung bei k = 1 beginnt, müssen wir für X bei k = -1 und k = 0 Initialisierungs-Werte
festlegen. Wir legen also bei t = 0 für die Auslenkung X: Ampl0 fest.

So viel zur Theorie, jetzt ertsellen wir ein Element. Wir ersetzen X durch Uout sowie Z durch Uf und
nehmen einfach das Symbol für den VCO zur Hand:

   

In den Script schreiben wir nun rein:

#Parameter
Ampl = Amplidute(V), 5
Freq0 = 0V-Frequency(Hz), 1k
Kf = Kf(Hz/V), 1k
Rout = Rout(Ohm),60
Rctrl = Rctrl(Ohm), 10k
#End

#VarsAndConstants
omega0   = c_2pi*Freq0
Komega = c_2pi*Kf
#End

#InputVolts
Uf = 3,0,Rctrl
#End

#OutputVolts
Uout = 1,2,Ampl
#End

;x2 = x(k-2), x1 = x(k-1), x0 = x(k)

#StateVars
x1 = Ampl ;Initialize StateVars with StartValues
x2 = Ampl
#End

#InnerBehavior ;solve the DiffenceEquation step by step
omega = omega0 + Komega*Uf
x0 = (2-g_timestep*g_timestep*omega*omega)*x1 - x2
x2 = x1
x1 = x0
Uout = x0
#End

Hier der vollständige Script von DiffEquation.dselfdef. Das Ding ist unter Data/SignalSources zu finden.

Bei #StateVars werden X[k-1] und X[k-2] mit dem Ampl-Wert initialisiert. 
Bei #InnerBehavior wird die Differenzen-Gleichung ab k = 1 schrittweise gelöst. Außerdem findet hier 
ein Updaten der X[k-1] und X[k-2] für die früheren Zeitpunkte statt.

Um unsere Differential-Gleichung mit ToneCirc zu lösen, bitte die Schaltung DocSamples/DiffEquation.circ
öffnen und Dyna durchführen:

Da wir die Steuerspannung mittels Sig1 von 0V bis 3V durchfahren, ändert sich die Frequenz von 1khz bis 4khz
(Kf = 1khz/V, f0 = 1khz). Man sieht, dass sich die Amplidute halbiert wenn sich die Frequenz vervierfacht.



Diese Vermutung ist leider falsch !

Schauen wir uns einen mechanischen Feder-Schwinger an, die Gleichung sieht so aus:

Dabei ist m die Masse und k die Federkonstante. Die Masse muß konstant sein (wir setzen m = 1). k ist eine
Funktion der Zeit. Strenggenommen gilt die Schwingungs-Gleichung nämlich nur für konstante Masse.
Jetzt stellen wir uns vor, die Federkonstante ändert sich genau am 0-Durchgang (X = 0). Dann gilt wegen dem
Energieerhaltungssatz:

Nun stellen wir uns noch vor, die Federkonstante ändert sich genau bei X = Xmax, dann ist:

Man sieht, dass im ersten Fall die Energie unverändert bleibt, während im zweiten Falle sich die Energie
mit dem Quadrat der Frequenz erhöht.

Hier wird k genau bei X = Xmax (Feder voll gespannt) um den Faktor 9 geändert, die Frequenz erhöht
um den Faktor 3, die Energie verneunfacht sich:

Hier noch das Ergebniss für 1. Fall:

zur Hauptseite