Gelöste Aufgaben/Kw28: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „k“) |
Keine Bearbeitungszusammenfassung |
||
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
k | [[Category:Gelöste Aufgaben]] | ||
[[Category:Dimensionslose Schreibweise]] | |||
[[Category:Numerische Lösung]] | |||
[[Category:Anfangswertproblem]] | |||
[[Category:Euler-Bernoulli-Balken]][[Category:Feder-Masse-System]] | |||
[[Category:Dynamik]][[Category:D’Alembertsches Prinzip]] | |||
[[Category:Haften und Reiben]] | |||
[[Category:Kennlinie]] | |||
[[Category:Maxima]] | |||
[[Category:Runge-Kutta-Verfahren]] | |||
[[Category:Nichtlineare Schwingungen]] | |||
==Aufgabenstellung== | |||
Das System besteht aus einer Kugel (Radius ''r'', Masse ''m<sub>2</sub>'') und einer Plattform (Masse ''m<sub>1</sub>''). Wie skizziert ist die Plattform mit einer Parallelführung aus zwei Euler-Bernoulli-Balken (Biegesteifigkeit ''EI'') elastisch gelagert. Aus der statischen Referenzkonfiguration wird die Kugel aus der Höhe H über der Plattform losgelassen. Kugel und Plattform stoßen also aufeinander und führen dann Ihre eigene vertikale Bewegung durch - bis zur nächsten Kollision. Der Stoß zwischen Kugel und Oberfläche sei ideal-elastisch. | |||
<onlyinclude> | |||
[[Datei:Kw28-01.png|alternativtext=|links|mini|Lageplan]] | |||
Für das skizzierte System modellieren Sie die Kugel als elastisch, die elastisch gelagerte Plattform als starr. | |||
Gesucht ist eine numerische Lösung als Anfangswertproblem und die nichtlinearen Schwingungen der beiden Systemteile. | |||
</onlyinclude> | |||
== Lösung mit Maxima == | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Header | |||
|text= | |||
Die Kugel können Sie sich im unteren Teil durch eine Feder der Steifigkeit ''k<sub>2</sub>'' ersetzt denken - das geht analog zu Beispiel [[Gelöste Aufgaben/Kw23|Kw23]]. | |||
Die Federkraft ''K'' ist also Null, solange die Kugel die Oberfläche nicht berührt und sie ist proportional zur Federkompression ''w'', wenn sich Kugel und Oberfläche berühren. | |||
<table class="wikitable" style="background-color:white; float: right; margin-right:14px;"> | |||
<tr><th colspan="2">''Kugel-Modell:'' | |||
''elast. Kontakt mit Einfederung w.'' | |||
</th></tr> | |||
<tr><td>[[Datei:Kw28-11.png|rahmenlos|80x80px]]<br/><br/><br/> | |||
</td><td>[[Datei:Kw23-03.png|rahmenlos]] | |||
</td></tr> | |||
</table> | |||
Die beiden Körper haben jeweils einen Freiheitsgrad in vertikale Richtung. Die Bewegungsgleichungen für die beiden Körper sind stückweise linear (Kontakt: ''K = k w'' / kein Kontakt ''K = 0''). Den Kontakt erfassen wir durch eine Kennlinie, die wir zwischen den beiden linearen Bereichen ausrunden. Das Ausrunden macht die numerische Integration schneller. | |||
Wir lösen das Anfangswertproblem zu der zugeordneten nichtlinearen Bewegungsgleichung. Die Nichtlinearität kommt hier aus der Kontaktbedingung zwischen der Kugel und der Plattform. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/*********************************************************/ | |||
/* MAXIMA script */ | |||
/* version: wxMaxima 15.08.2 */ | |||
/* author: Andreas Baumgart */ | |||
/* last updated: 2018-09-30 */ | |||
/* ref: Kw28 (TM-C, Labor 5) */ | |||
/* description: finds the solution for */ | |||
/* the nonlinear IVP */ | |||
/*********************************************************/ | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Declarations | |||
|text= | |||
Die Koordinaten der Verschiebung der beiden Massen nennen wir | |||
::<math>\underline{Q}(t)=\left(\begin{array}{l}u_1(t)\\u_2(t)\end{array}\right) \text{ und damit }\delta \underline{Q}=\left(\begin{array}{l}\delta u_1\\\delta u_2\end{array}\right)</math>. | |||
Für die beiden elastischen Balken verwenden die [[Sources/Lexikon/Ersatzfeder-Steifigkeit|Ersatzfeder-Steifigkeit]] | |||
::<math>\displaystyle k_1 =\displaystyle 2\cdot\frac{12 EI}{\ell^3}</math>. | |||
Und als Abkürzungen verwenden wir | |||
::<math>\begin{array}{ll}\alpha &= \displaystyle \frac{m_2}{m_1}\\\kappa &=\displaystyle \frac{k_2}{k_1}\end{array}</math>. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/*********************************************************/ | |||
/* declarations */ | |||
assume(g>0, r>0); | |||
/* declare variational variables - see 6.3 Identifiers */ | |||
declare("δΠ", alphabetic); | |||
declare("δW", alphabetic); | |||
declare("δu", alphabetic); | |||
declare("δQ", alphabetic); | |||
/* coordinates */ | |||
Q[t]: [ u[1](t), u[2](t)]; | |||
δQ[t]: [δu[1] ,δu[2] ]; | |||
/* abbreviations */ | |||
abbrev : [f(u[1](t)-u[2](t)) = f(w), | |||
gamma = m[2]/m[1], | |||
k[2] = kappa*k[1], | |||
m[2] = alpha*m[1]]; | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Contact Characteristic | |||
|text= | |||
Die Kennlinie für den Kontakt definieren wir stückweise zu | |||
::<math>K(w,\epsilon) = k\cdot \left\{ \begin{array}{ccl} 0 &\text{für}& \;\;\;\;\;\;\;\;w < -\epsilon\\\displaystyle \frac{1}{4} \left( 1+\frac{w}{\epsilon}\right)^2 &\text{für}& -\epsilon < w < +\epsilon\\ w &\text{für}& +\epsilon < w\\ \end{array} \right.</math> | |||
[[Datei:Kw28-13.png|mini|Kontakt-Kennlinie]]Und so sieht die Kennlinie dann aus: | |||
Die Parabel zwischen den beiden linearen Kennlinien-Stücken macht die Kraft ''K'' stetig differentierbar in ''w''. Das macht die numerische Integration schneller - und genauer. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/**** define nonlinear spring characteristic ***/ | |||
C(w) := if w < -1 then | |||
0 | |||
elseif w < 1 then | |||
1/4*(w+1)^2 | |||
else | |||
w; | |||
plot2d(C(w),[w,-2,2], | |||
[ylabel,"C/1->"], [xlabel,"w/ε->"], | |||
[legend, "restoring force"]); | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Equilibrium Conditions | |||
|text= | |||
[[Datei:Kw28-10.png|mini|Koordinaten|alternativtext=|250x250px]]Die Gleichgewichtsbedingung konstruieren wir mit dem [[Werkzeuge/Gleichgewichtsbedingungen/Arbeitsprinzipe der Analytischen Mechanik/Prinzip der virtuellen Verrückungen|Prinzip der virtuellen Verrückungen]] - wir brauchen also kein [[Sources/Lexikon/Freikörperbild|Freikörperbild]]. | |||
Dazu verwenden wir die Verschiebungs-Koordinaten ''u<sub>1</sub>, u<sub>2</sub>'' der beiden Körper wie skizziert. | |||
Für die allgemeine Gleichgewichtsbedingung | |||
::<math>\begin{array}{ll}\delta W &= 0\\&= \delta W^a - \delta \Pi\end{array}</math> | |||
setzen wir für die virtuelle Arbeit von äußeren, eingeprägte Kräften (inklusive der [[Sources/Lexikon/D'Alembert'sche Trägheitskraft|D'Alembert'sche Trägheitskraft]]) an: | |||
::<math>\displaystyle \delta W^a = -\sum_{i=1}^2 m_i\cdot\left(\ddot{u}_i+g\right) \cdot \delta u_i</math> | |||
sowie für die virtuelle Formänderungsenergie der beiden Ersatz-Federn: | |||
::<math>\delta \Pi = k_1 u_1(t) \cdot \delta u_1 + \underbrace{K(u_1(t)-u_2(t))}_{\displaystyle \text{Kontakt-Kraft}}\cdot (\delta u_1-\delta u_2)</math>. | |||
Sortieren nach den virtuellen Verrückungen und anschrieben der Gleichgewichtsbedingungen in Matrix-Form liefert | |||
::<math>\begin{pmatrix}{{m}_{1}} & 0\\ 0 & {{m}_{2}}\end{pmatrix} \cdot \begin{pmatrix}{\ddot{u}_{1}} \\ {\ddot{u}_{2}} \end{pmatrix} + \begin{pmatrix}{{k}_{1}} & 0\\ 0 & 0\end{pmatrix} \cdot \begin{pmatrix}{{u}_{1}} \\ {{u}_{2}} \end{pmatrix} = -g\cdot \begin{pmatrix}{{m}_{1}}\\ {{m}_{2}}\end{pmatrix} + K\left(u_1 - u_2\right) \cdot \begin{pmatrix}-1 \\ +1 \end{pmatrix} | |||
</math>. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/********************************/ | |||
/* derive ODE in dim'less coordinates U using the PvV */ | |||
/* virtual work of system (equilibrium condition) */ | |||
PvV : [δW = δW^a - δΠ, | |||
δW^a = - sum(m[i]* diff(u[i](t),t,2)*δu[i],i,1,2) - sum(m[i]*g*δu[i],i,1,2), | |||
δΠ = k[1]*u[1](t)*δu[1] + f(u[1](t)-u[2](t))*(δu[1]-δu[2])]; | |||
/* equlilbrium condition */ | |||
eom: subst(PvV[3],subst(PvV[2],subst(PvV[1],δW=0))); | |||
/* linear parts first */ | |||
M : -funmake('matrix,makelist(makelist(coeff(coeff(lhs(eom),δQ[t][i]),diff(Q[t][j],t,2)),i,1,2),j,1,2)); | |||
K : -funmake('matrix,makelist(makelist(coeff(coeff(lhs(eom),δQ[t][i]), Q[t][j] ),i,1,2),j,1,2)); | |||
G : funmake('matrix,makelist(coeff( | |||
subst(makelist(diff(Q[t][i],t,2)=0,i,1,2), | |||
subst(makelist( Q[t][i]=0 ,i,1,2),[lhs(eom)])),δQ[t][j]), j,1,2)); | |||
/* what's left ?*/ | |||
F : funmake('matrix,makelist(coeff(expand([lhs(eom)] + | |||
(M.diff(Q[t],t,2)+K.Q[t]-G).transpose(δQ[t])),δQ[t][j]), j,1,2)); | |||
/* control print-out */ | |||
print(M,"∙",transpose(diff(Q[t],t,2)),"+",K,"∙",transpose(Q[t]),"=",G,"+",F)$ | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Dimensionless Equations of Motion | |||
|text= | |||
Mit einer passenden Bezugszeit und -länge machen wir die Bewegungsgleichungen dimensionslos. | |||
Hier liefert die Periodendauer der Plattform - allein, ohne Kugel - die Bezugszeit ''T''. Die statische Absenkung der Plattform - ohne Einfluss der Kugel - liefert die Bezugslänge ''L''. | |||
Aus der Bewegungsgleichung oben lesen wir für ''K(u<sub>1</sub>-u<sub>2</sub>) = 0'' ab: | |||
::<math>T= \displaystyle \frac{2\pi}{\omega_0} \text{ mit } \omega_0^2= \displaystyle \frac{k_1}{m_1}</math> | |||
und | |||
::<math>L=\displaystyle \frac{m_1}{k_1} g</math>. | |||
Nun ist also | |||
::<math>\displaystyle \tau = \frac{t}{T} \text{ mit } (.)':=\frac{d}{d\tau}(.)</math> | |||
und | |||
::<math>\displaystyle U_i = \frac{u_i}{L} \text{ für } i=1,2</math> | |||
Die Kennlinie überführen wir entsprechend in | |||
::<math>K(w) = k_2\cdot L\cdot C\left(\displaystyle \frac{W}{\epsilon}\right) \text{ mit } W(\tau) = U_1-U_2 </math>. | |||
Einsetzen liefert die zwei Differentialgleichungen | |||
::<math>\begin{array}{llll}\displaystyle \frac{1 }{4\cdot \pi^2 }U''_1 \left( \tau\right)&+{{U}_{1}}\left( \tau\right) &+1&=-\kappa\cdot C\left( \frac{W}{\epsilon}\right) \\\displaystyle \frac{\alpha}{4\cdot \pi^2 }U''_2 \left( \tau\right)& &+\alpha&=+\kappa\cdot C\left( \frac{W}{\epsilon}\right) \end{array}</math>. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/* dimensionless equations of motion */ | |||
dimless : ['diff(u[1](t),t,2) = L*'diff(U[1](tau),tau,2)/T^2, | |||
'diff(u[2](t),t,2) = L*'diff(U[2](tau),tau,2)/T^2, | |||
u[1](t) = L*U[1](tau), | |||
u[2](t) = L*U[2](tau), | |||
L = m[1]*g/k[1], | |||
T^2 = (2*%pi/omega[1])^2, | |||
omega[1]^2 = k[1]/m[1]]; | |||
eom : makelist((M.diff(Q[t],t,2)+K.Q[t]-(G+F))[i][1]=0,i,1,2); | |||
eom : expand(subst(dimless,subst(abbrev,eom))); | |||
eom : subst([f(w) = subst(dimless,subst(abbrev,L*k[2]*C(W/epsilon)))],eom); | |||
eom : expand(solve(eom, ['diff(U[1](tau),tau,2),'diff(U[2](tau),tau,2)])[1]); | |||
params: [kappa = 5, alpha = 1/2, W=(U[1](tau)-U[2](tau)), epsilon=1/100]; | |||
eom : expand(subst(params,eom)); | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Solving | |||
|text=Für die numerische Lösung schreiben wir die zwei Bewegungsgleichung zweiter Ordnung um als vier Bewegungsgleichungen erster Ordnung zu | |||
::<math>\displaystyle \frac{d}{d\,\tau}\left(\begin{array}{c}U_1\\U_2\\V_1\\V_2\end{array}\right) = \underline{f}(U_1,U_2) \text{ mit } V_i = \frac{d U_i}{d\,\tau}</math>. | |||
Die rechte Seite der gewöhnlichen Differentialgleichung ("Right-hand-side of ODE") lautet damit | |||
::<math>\underline{f} = \left(\begin{array}{c}1\\1\\\displaystyle 4\pi^2 (-U_1-1-\kappa\cdot C \cdot \left( \frac{W}{\epsilon}\right))\\\displaystyle 4\pi^2 (-1+\frac{\kappa\cdot C}{\alpha} \cdot \left( \frac{W}{\epsilon}\right))\end{array}\right)</math> | |||
Die dimensionslosen Parameter wählen wir zu | |||
::<math>\displaystyle \kappa=10,\alpha=\frac{1}{2},\epsilon=\frac{1}{100}</math> | |||
und lösen die Bewegungsgleichungen numerisch - hier mit dem [[Anfangswertprobleme/Methoden zur Lösung von Anfangswertproblemen/Runge-Kutta-Verfahren 4.ter Ordnung|Runge-Kutta-Verfahren 4.ter Ordnung]]. | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/********************************/ | |||
/* numerical solution of IVP */ | |||
times : subst([t0 = 0, tmax = 20, dt = 0.001], | |||
[t, t0, tmax, dt]); | |||
dgl1stOrder : subst(params,[v1,v2,rhs(eom[1]),rhs(eom[2])]); | |||
dgl1stOrder : subst([U[1](tau) = h1,U[2](tau)=h2],dgl1stOrder); | |||
stateVabs : [h1,h2,v1,v2]; | |||
initiVals : [-1,20,0,0]; | |||
ivs : rk(dgl1stOrder, stateVabs, initiVals, times)$ | |||
</syntaxhighlight> | |||
}} | |||
<!--------------------------------------------------------------------------------> | |||
{{MyCodeBlock|title=Post-Processing | |||
|text=Als Lösung tragen wir die Zeitverläufe der Höhen ''U<sub>1</sub>, U<sub>2</sub>'' über der Zeit ''τ'' | |||
[[Datei:Kw28-21.png|mini|Zeitverlauf der Lösung|alternativtext=|ohne]]und ''U<sub>1</sub>, U<sub>2</sub>'' jeweils über ''V<sub>1</sub>, V<sub>2</sub>'' im Phasendiagramm auf: | |||
[[Datei:Kw28-22.png|mini|Phasendiagramm|alternativtext=|ohne]] | |||
|code= | |||
<syntaxhighlight lang="lisp" line start=1> | |||
/********************************/ | |||
/* solution samples */ | |||
Ti : makelist(ivs[j][1],j,1,length(ivs))$ | |||
Hi : [makelist(ivs[j][2],j,1,length(ivs)), | |||
makelist(ivs[j][3],j,1,length(ivs))]$ | |||
Vi : [makelist(ivs[j][4],j,1,length(ivs)), | |||
makelist(ivs[j][5],j,1,length(ivs))]$ | |||
/* time-domaine plot */ | |||
plot2d([[discrete, Ti, Hi[1]],[discrete, Ti, Hi[2]]], | |||
[legend, "Plattform", "Kugel"], | |||
[title, sconcat("start @: ",string(initiVals))], | |||
[xlabel,"τ/1->"], [ylabel,"U/1->"]); | |||
/* phase plot */ | |||
plot2d([[discrete,Hi[1],Vi[1]],[discrete,Hi[2],Vi[2]]], | |||
[legend, "Plattform", "Kugel"], | |||
[ylabel,"V/1->"], [xlabel,"H/1->"]); | |||
</syntaxhighlight> | |||
}} | |||
{{MyTip|title=Wie genau ist die Lösung?|text=Überlegen Sie, wie Sie bei diesem Ergebnis die Genauigkeit prüfen können. | |||
Das ist hier besonders einfach, weil es um ein konservatives System geht - also eins, bei dem keine Energie hinzugefügt oder dissipiert wird.}} | |||
<hr/> | |||
'''Links''' | |||
* ... | |||
'''Literature''' | |||
* ... |
Aktuelle Version vom 29. März 2021, 11:04 Uhr
Aufgabenstellung
Das System besteht aus einer Kugel (Radius r, Masse m2) und einer Plattform (Masse m1). Wie skizziert ist die Plattform mit einer Parallelführung aus zwei Euler-Bernoulli-Balken (Biegesteifigkeit EI) elastisch gelagert. Aus der statischen Referenzkonfiguration wird die Kugel aus der Höhe H über der Plattform losgelassen. Kugel und Plattform stoßen also aufeinander und führen dann Ihre eigene vertikale Bewegung durch - bis zur nächsten Kollision. Der Stoß zwischen Kugel und Oberfläche sei ideal-elastisch.
Für das skizzierte System modellieren Sie die Kugel als elastisch, die elastisch gelagerte Plattform als starr. Gesucht ist eine numerische Lösung als Anfangswertproblem und die nichtlinearen Schwingungen der beiden Systemteile.
Lösung mit Maxima
Header
Die Kugel können Sie sich im unteren Teil durch eine Feder der Steifigkeit k2 ersetzt denken - das geht analog zu Beispiel Kw23.
Die Federkraft K ist also Null, solange die Kugel die Oberfläche nicht berührt und sie ist proportional zur Federkompression w, wenn sich Kugel und Oberfläche berühren.
Kugel-Modell:
elast. Kontakt mit Einfederung w. | |
---|---|
Die beiden Körper haben jeweils einen Freiheitsgrad in vertikale Richtung. Die Bewegungsgleichungen für die beiden Körper sind stückweise linear (Kontakt: K = k w / kein Kontakt K = 0). Den Kontakt erfassen wir durch eine Kennlinie, die wir zwischen den beiden linearen Bereichen ausrunden. Das Ausrunden macht die numerische Integration schneller.
Wir lösen das Anfangswertproblem zu der zugeordneten nichtlinearen Bewegungsgleichung. Die Nichtlinearität kommt hier aus der Kontaktbedingung zwischen der Kugel und der Plattform.
/*********************************************************/
/* MAXIMA script */
/* version: wxMaxima 15.08.2 */
/* author: Andreas Baumgart */
/* last updated: 2018-09-30 */
/* ref: Kw28 (TM-C, Labor 5) */
/* description: finds the solution for */
/* the nonlinear IVP */
/*********************************************************/
Declarations
Die Koordinaten der Verschiebung der beiden Massen nennen wir
- .
Für die beiden elastischen Balken verwenden die Ersatzfeder-Steifigkeit
- .
Und als Abkürzungen verwenden wir
- .
/*********************************************************/
/* declarations */
assume(g>0, r>0);
/* declare variational variables - see 6.3 Identifiers */
declare("δΠ", alphabetic);
declare("δW", alphabetic);
declare("δu", alphabetic);
declare("δQ", alphabetic);
/* coordinates */
Q[t]: [ u[1](t), u[2](t)];
δQ[t]: [δu[1] ,δu[2] ];
/* abbreviations */
abbrev : [f(u[1](t)-u[2](t)) = f(w),
gamma = m[2]/m[1],
k[2] = kappa*k[1],
m[2] = alpha*m[1]];
Contact Characteristic
Die Kennlinie für den Kontakt definieren wir stückweise zu
Und so sieht die Kennlinie dann aus:
Die Parabel zwischen den beiden linearen Kennlinien-Stücken macht die Kraft K stetig differentierbar in w. Das macht die numerische Integration schneller - und genauer.
/**** define nonlinear spring characteristic ***/
C(w) := if w < -1 then
0
elseif w < 1 then
1/4*(w+1)^2
else
w;
plot2d(C(w),[w,-2,2],
[ylabel,"C/1->"], [xlabel,"w/ε->"],
[legend, "restoring force"]);
Equilibrium Conditions
Die Gleichgewichtsbedingung konstruieren wir mit dem Prinzip der virtuellen Verrückungen - wir brauchen also kein Freikörperbild.
Dazu verwenden wir die Verschiebungs-Koordinaten u1, u2 der beiden Körper wie skizziert.
Für die allgemeine Gleichgewichtsbedingung
setzen wir für die virtuelle Arbeit von äußeren, eingeprägte Kräften (inklusive der D'Alembert'sche Trägheitskraft) an:
sowie für die virtuelle Formänderungsenergie der beiden Ersatz-Federn:
- .
Sortieren nach den virtuellen Verrückungen und anschrieben der Gleichgewichtsbedingungen in Matrix-Form liefert
- .
/********************************/
/* derive ODE in dim'less coordinates U using the PvV */
/* virtual work of system (equilibrium condition) */
PvV : [δW = δW^a - δΠ,
δW^a = - sum(m[i]* diff(u[i](t),t,2)*δu[i],i,1,2) - sum(m[i]*g*δu[i],i,1,2),
δΠ = k[1]*u[1](t)*δu[1] + f(u[1](t)-u[2](t))*(δu[1]-δu[2])];
/* equlilbrium condition */
eom: subst(PvV[3],subst(PvV[2],subst(PvV[1],δW=0)));
/* linear parts first */
M : -funmake('matrix,makelist(makelist(coeff(coeff(lhs(eom),δQ[t][i]),diff(Q[t][j],t,2)),i,1,2),j,1,2));
K : -funmake('matrix,makelist(makelist(coeff(coeff(lhs(eom),δQ[t][i]), Q[t][j] ),i,1,2),j,1,2));
G : funmake('matrix,makelist(coeff(
subst(makelist(diff(Q[t][i],t,2)=0,i,1,2),
subst(makelist( Q[t][i]=0 ,i,1,2),[lhs(eom)])),δQ[t][j]), j,1,2));
/* what's left ?*/
F : funmake('matrix,makelist(coeff(expand([lhs(eom)] +
(M.diff(Q[t],t,2)+K.Q[t]-G).transpose(δQ[t])),δQ[t][j]), j,1,2));
/* control print-out */
print(M,"∙",transpose(diff(Q[t],t,2)),"+",K,"∙",transpose(Q[t]),"=",G,"+",F)$
Dimensionless Equations of Motion
Mit einer passenden Bezugszeit und -länge machen wir die Bewegungsgleichungen dimensionslos.
Hier liefert die Periodendauer der Plattform - allein, ohne Kugel - die Bezugszeit T. Die statische Absenkung der Plattform - ohne Einfluss der Kugel - liefert die Bezugslänge L.
Aus der Bewegungsgleichung oben lesen wir für K(u1-u2) = 0 ab:
und
- .
Nun ist also
und
Die Kennlinie überführen wir entsprechend in
- .
Einsetzen liefert die zwei Differentialgleichungen
- .
/* dimensionless equations of motion */
dimless : ['diff(u[1](t),t,2) = L*'diff(U[1](tau),tau,2)/T^2,
'diff(u[2](t),t,2) = L*'diff(U[2](tau),tau,2)/T^2,
u[1](t) = L*U[1](tau),
u[2](t) = L*U[2](tau),
L = m[1]*g/k[1],
T^2 = (2*%pi/omega[1])^2,
omega[1]^2 = k[1]/m[1]];
eom : makelist((M.diff(Q[t],t,2)+K.Q[t]-(G+F))[i][1]=0,i,1,2);
eom : expand(subst(dimless,subst(abbrev,eom)));
eom : subst([f(w) = subst(dimless,subst(abbrev,L*k[2]*C(W/epsilon)))],eom);
eom : expand(solve(eom, ['diff(U[1](tau),tau,2),'diff(U[2](tau),tau,2)])[1]);
params: [kappa = 5, alpha = 1/2, W=(U[1](tau)-U[2](tau)), epsilon=1/100];
eom : expand(subst(params,eom));
Solving
Für die numerische Lösung schreiben wir die zwei Bewegungsgleichung zweiter Ordnung um als vier Bewegungsgleichungen erster Ordnung zu
- .
Die rechte Seite der gewöhnlichen Differentialgleichung ("Right-hand-side of ODE") lautet damit
Die dimensionslosen Parameter wählen wir zu
und lösen die Bewegungsgleichungen numerisch - hier mit dem Runge-Kutta-Verfahren 4.ter Ordnung.
/********************************/
/* numerical solution of IVP */
times : subst([t0 = 0, tmax = 20, dt = 0.001],
[t, t0, tmax, dt]);
dgl1stOrder : subst(params,[v1,v2,rhs(eom[1]),rhs(eom[2])]);
dgl1stOrder : subst([U[1](tau) = h1,U[2](tau)=h2],dgl1stOrder);
stateVabs : [h1,h2,v1,v2];
initiVals : [-1,20,0,0];
ivs : rk(dgl1stOrder, stateVabs, initiVals, times)$
Post-Processing
Als Lösung tragen wir die Zeitverläufe der Höhen U1, U2 über der Zeit τ
und U1, U2 jeweils über V1, V2 im Phasendiagramm auf:
/********************************/
/* solution samples */
Ti : makelist(ivs[j][1],j,1,length(ivs))$
Hi : [makelist(ivs[j][2],j,1,length(ivs)),
makelist(ivs[j][3],j,1,length(ivs))]$
Vi : [makelist(ivs[j][4],j,1,length(ivs)),
makelist(ivs[j][5],j,1,length(ivs))]$
/* time-domaine plot */
plot2d([[discrete, Ti, Hi[1]],[discrete, Ti, Hi[2]]],
[legend, "Plattform", "Kugel"],
[title, sconcat("start @: ",string(initiVals))],
[xlabel,"τ/1->"], [ylabel,"U/1->"]);
/* phase plot */
plot2d([[discrete,Hi[1],Vi[1]],[discrete,Hi[2],Vi[2]]],
[legend, "Plattform", "Kugel"],
[ylabel,"V/1->"], [xlabel,"H/1->"]);
✔ Wie genau ist die Lösung?: |
Überlegen Sie, wie Sie bei diesem Ergebnis die Genauigkeit prüfen können. Das ist hier besonders einfach, weil es um ein konservatives System geht - also eins, bei dem keine Energie hinzugefügt oder dissipiert wird. |
Links
- ...
Literature
- ...