# Kapitel 3_k:
# Der unsymmetrische Pyramidenkreisel unter Momentenbelastung
# (Kardanwinkel)
#  2015  Friedrich U. Mathiak, 
# mathiak@mechanik-info.de
# 
> restart: with(LinearAlgebra): with(plottools): with(plots):
# Fr die anstehenden  Aufgaben bentigen wir die folgende Prozedur:
> read "Proc_Calc_19.m";  #Berechnung der massengeometrischen Gren des Kreisels
;
# Beispiel 3-22:  Mit den Werten des Beispiels  ergeben sich folgende Systemwerte  (Lngen in [cm], Masse in [Gramm, g]).
> a:=6.; b:=3.; h:=9.; rho:=0.670; 
# Wir bentigen zur Beschreibung des Pyramidenkreisel eine Knoten- und eine Elementdatei.  Dazu beschreiben wir die Pyramide durch ihre vier  Eckpunkte und fassen diese in der Matrix COORD zusammen. 
> r1:=[0,0,0]: r2:=[a,0,h]:  r3:=[0,b,h]: r4:=[0,0,h]: 
> COORD:=Matrix([r1,r2,r3,r4]);
# Die  Elementmatrix (Koinzidenztafel) enthlt die Zuordnung von jeweils drei Knoten zu einem Oberflchendreieck des Tetraeders . Es liegen insgesamt 4 Dreieckselemente vor.
> IZES:=Matrix([[1,3,2],[1,4,3],[1,3,2],[2,3,4]]);
# Mittels der folgenden Maple-Prozedur erzeugen wir fr unseren Kreisel  eine global vereinbarte  3D-Plotstruktur mit dem Namen PL, die wir auch zur Animation des Bewegungsvorganges bentigen. 
> read "Proc_Graf_02.m":
# Wir schauen uns den Kreisel an:
> TITEL:="Der unsymmetrische Pyramidenkreisel im raumfesten Bezugssystem": ABEZ:=["x1","x2","x3"]:
> Proc_Graf_02(COORD,IZES,TITEL,ABEZ);
> Proc_Calc_19(COORD,IZES,rho);
# Zur Lsung des nichtlinearen  Differenzialgleichungssystems bentigen wir die Haupttrgheitsmomente und die Haupttrgheitsachsen bezogen auf den Ursprung des krperfesten Punktes P1, die wir der folgenden Eigenwertberechnung entnehmen. Dabei ist zu beachten, dass die Eigenvektoren nur bis auf einen konstanten Faktor bestimmt sind.
> (EWq,EVq):=LinearAlgebra[Eigenvectors](Matrix(Thetaq,shape=symmetric));
# Hinweis: Die Eigenvektoren sind nur bis auf einen konstanten Faktor bestimmt. Bilden die spaltenweise in der Eigenvektormatrix  EVq  erscheinenden und auf die Lnge 1 normierten Eigenvektoren ein Rechtssystem, dann muss die Determinante der Eigenvektormatrix  den Wert +1 besitzen. Ergibt sich fr die Determinante der Wert  -1, dann kann ein Rechtsystem gebildet werden, indem aus den ersten beiden Spaltenvektoren e1 und e2 ein dritter Vektor e3 = e1e2  gebildet wird. Mit den Eigenvektoren sind nmlich nur die Achsrichtungen und nicht die Achsorientierungen festgelegt, da neben ei auch -ei (i = 1,2,3) ein Eigenvektor ist.  Wir berprfen das und erhalten
> DET:=Determinant(EVq);
# Hinweis: Ergibt sich fr die Determinante der Wert  -1, dann kann ein rechtsystem gebildet werden, indem aus den ersten beiden Spaltenvektoren e1 und e2 ein dritter Vektor e3 = e1e2  gebildet wird. Mit den Eigenvektoren sind nmlich nur die Achsrichtungen und nicht die Achsorientierungen festgelegt, da neben ei auch -ei ein Eigenvektor ist. 
# Der Aufbau eines rechtshndigen Basissystems kann brigens auch manuell erfolgen. Dazu orientieren wir uns optisch an der Grafik im Buch TM 3 und whlen folgende Eigenvektoren:
> EVm:=Matrix([Column(EVq,2),Column(EVq,3),Column(EVq,1)]);
# Die zugehrigen Eigenwerte sind:
> EWm:=Vector([EWq[2],EWq[3],EWq[1]]);
# Wir prfen, ob es sich bei den obigen Einheitsvektoren um eine rechtshndige Basis handelt. Der resultierende Vektor aus dem folgenden Kreuzprodukt muss dann verschwinden.
> CrossProduct(Column(EVm,1),Column(EVm,2))-Column(EVm,3);
# Wir beschaffen uns noch die Darstellung des Tetraeders mit Lage und Richtung der Hauptachsen. Der Ursprung des Hauptachsensystems ist identisch mit dem Ursprung des Bezugsachsensystems (Punkt P1 in der folgenden Grafik). 
> TITEL:="Der unsymmetrische Kreisel im raumfesten Bezugssystem mit Hauptachsendarstellung":
> Proc_Graf_01(COORD,IZES,TITEL,ABEZ):
> lambda:=6.:li:={}:T1:={}:
> for i to 3 do
> evi:=Column(EVm,i):
> rai:=convert(-lambda*evi,list):
> rbi:=convert( lambda*evi,list):
> li:=li union {plottools[line](rai,rbi,color=blue,linestyle = dash)}:
> T1:=T1 union {[rai[1],rai[2],rai[3],i]}:
> end do:
> TP1:=plots[textplot3d](T1,'font'=["times","roman",14],'align'={'below','left'},color=blue):
> TP2:=plots[textplot3d]([0,0,0,"P1",'font'=["times","roman",16]],'align'={'below','left'},color=black):
> plots[display](PL,li,TP1,TP2,axes=boxed,scaling=constrained,orientation =[-75,55,-5],labels=["x1","x2","x3"]);
# Die rechtshndig orientierten Eigenvektoren in der Eigenvektormatrix EVm bilden die Matrixkomponenten der Drehmatrix (s.h. Buch TM 3). Im gedrehten Hauptachsensystem sind dann die Eckpunkte des Tetraeders zeilenweise in der Matrix CH angeordnet. 
> CH:=COORD.EVm;
# Fr die Koordinaten des Schwerpunktes im Hauptachsensystem gilt
> RSH:=Transpose(EVm).RS;
# Wir stellen das Tetraeder im gedrehten Hauptachsensystem grafisch dar.
> TITEL:="Der unsymmetrische Kreisel im Hauptachsensystem": ABEZ:=["x1H","x2H","x3H"]:
> Proc_Graf_02(CH,IZES,TITEL,ABEZ);
# Im nchsten Schritt soll der Bewegungsvorgang des unsymmetrischen Kreisels berechnet werden. Wir whlen zur Lagebeschreibung Kardanwinkel und stellen zur nummerischen Lsung des gekoppelten nichtlinearen  Differenzialgleichungssystems folgende Prozedur zur Verfgung. 
> Proc_Calc_21:=proc(TR::Vector,M::Vector,AW::list,N::integer,TE,POLY)
> #---------------------------------------------------------------------------
> #Eingabe: 
> #          TR: Massentrgheitsmomente 
> #              TR[1]: Trgheitsmoment (A)
> #              TR[2]: Trgheitsmoment (B)
> #              TR[3]: Trgheitsmoment (C, Figurenachse)
> #           M: Momente in Komponenten des krperfesten Hauptachsensystems
> #              M[1]: Moment um die 1-Achse
> #              M[2]: Moment um die 2-Achse
> #              M[3]: Moment um die 3-Achse            
> #          AW: Anfangswerte in Kardankoordinaten und deren
> #              Ableitungen zum Zeitpunkt t = 0
> #              AW[1]: gam0               in [rad]
> #              AW[2]: d(gam0)/dt         in [rad/s]
> #              AW[3]: beta0              in [rad]
> #              AW[4]: d(beta0)/dt        in [rad/s]
> #              AW[5]: alpha0 	            in [rad]                              
> #              AW[6]: d(alpha0)/dt       in [rad/s]  
> #          N : Anzahl der Simulationsschritte
> #          TE: Dauer der Simulationszeit	               in [s]
> #        POLY: 3D-Geometrieobjekt des Kreisels
> #Ausgabe:  
> #          Kardanwinkel           
> #            q1:     gam(t)               in [rad]
> #            q2:    beta(t)               in [rad]
> #            q3:  alpha(t)               in [rad]
> #          Kardanwinkelgeschwindigkeiten
> #            q4: d( gam(t))/dt                             in [rad/s]
> #            q5: d(beta(t)/dt                              in [rad/s]
> #            q6: d( alpha(t))/dt                           in [rad/s]
> #          Winkelgeschwindigkeiten omega                     
> #            q7: omega1                                    in [rad/s]
> #            q8: omega2                                    in [rad/s]
> #            q9: omega3                                    in [rad/s]
> #-------------------------------------------------------------------------
> local eta,zeta,gl1,gl2,gl3,AB,sys,i,val,p1,p2,p3,NT,j,w1,w2,w3,P,Q;
> global L,ZG,AN,T,q1,q2,q3,q4,q5,q6,q7,q8,q9;
> description "Lsung der Bewegungsgleichungen in Kardanwinkeln und Animation der Bewegung eines unsymmetrischen Kreisels";
> eta:=TR[2]/TR[1]; zeta:=TR[3]/TR[1];
> gl1:=(diff(alpha(t),t,t))*cos(beta(t))*cos(gam(t))-(diff(alpha(t),t))*(diff(beta(t),t))*sin(beta(t))*cos(gam(t))-(diff(alpha(t),t))*cos(beta(t))*(diff(gam(t),t))*sin(gam(t))+(diff(beta(t),t,t))*sin(gam(t))+(diff(beta(t),t))*(diff(gam(t),t))*cos(gam(t))+(zeta-eta)*(-(diff(alpha(t),t))*cos(beta(t))*sin(gam(t))+(diff(beta(t),t))*cos(gam(t)))*((diff(alpha(t),t))*sin(beta(t))+diff(gam(t), t))-M[1]/TR[1];
> gl2:=eta*(-(diff(alpha(t),t,t))*cos(beta(t))*sin(gam(t))+(diff(alpha(t),t))*(diff(beta(t),t))*sin(beta(t))*sin(gam(t))-(diff(alpha(t),t))*cos(beta(t))*(diff(gam(t),t))*cos(gam(t))+(diff(beta(t),t,t))*cos(gam(t))-(diff(beta(t),t))*(diff(gam(t),t))*sin(gam(t)))-(zeta-1.)*((diff(alpha(t),t))*cos(beta(t))*cos(gam(t))+(diff(beta(t),t))*sin(gam(t)))*((diff(alpha(t),t))*sin(beta(t))+diff(gam(t),t))-M[2]/TR[1];
> gl3:=zeta*((diff(alpha(t),t,t))*sin(beta(t))+(diff(alpha(t),t))*(diff(beta(t),t))*cos(beta(t))+diff(gam(t),t,t))+(eta-1.)*((diff(alpha(t),t))*cos(beta(t))*cos(gam(t))+(diff(beta(t),t))*sin(gam(t)))*(-(diff(alpha(t),t))*cos(beta(t))*sin(gam(t))+(diff(beta(t),t))*cos(gam(t)))-M[3]/TR[1];
> #Anfangsbedingungen
> AB:=alpha(0)= AW[1], D(alpha)(0)= AW[2], beta(0)= AW[3], D(beta)(0)= AW[4], gam(0)= AW[5], D(gam)(0)= AW[6]; print(AB);
> sys:=[gl1,gl2,gl3,AB];
> val:=Array(1..N+1); for i to N+1 do val[i]:=(i-1)*TE/N end do:
> L:=dsolve(sys,numeric,method=rkf45,output=val);
> #Die zeitabhngigen Kardanwinkel
> q1:=plots[odeplot](L,[t,  gam(t)],0..TE,color=  red):
> q2:=plots[odeplot](L,[t, beta(t)],0..TE,color= blue):
> q3:=plots[odeplot](L,[t,alpha(t)],0..TE,color=green):
> #Die zeitabhngigen Kardanwinkelgeschwindigkeiten
> q4:=plots[odeplot](L,[t,diff(gam(t)  ,t)],0..TE,color=   red):
> q5:=plots[odeplot](L,[t,diff(beta(t),t)],0..TE,color=  blue):
> q6:=plots[odeplot](L,[t,diff(alpha(t)  ,t)],0..TE,color=green):
> #Die Winkelgeschwindigkeiten omega im krperfesten Koordinatensystem
> q7:=plots[odeplot](L,[t, diff(alpha(t),t)*cos(beta(t))*cos(gam(t))+diff(beta(t),t)*sin(gam(t))],0..TE,color=  red):
> q8:=plots[odeplot](L,[t,-diff(alpha(t),t)*cos(beta(t))*sin(gam(t))+diff(beta(t),t)*cos(gam(t))],0..TE,color= blue):
> q9:=plots[odeplot](L,[t, diff(alpha(t),t)*sin(beta(t))+diff(gam(t),t)]                         ,0..TE,color=green):
> #Grafische Darstellung der Ergebnisse 
> p1:=plots[display]([q1,q2,q3],axes=boxed,gridlines=true,title="\nKardanwinkel\ngamma (rot), beta (blau), alpha (grn)\n",labels = ["t"," "]):
> p2:=plots[display]([q4,q5,q6],axes=boxed,gridlines=true,title="\nKardanwinkelgeschwindigkeiten\ngammap (rot), betap (blau), alphap (grn)\n",labels = ["t"," "]):
> p3:=plots[display]([q7,q8,q9],axes=boxed,gridlines=true,title="\nWinkelgeschwindigkeiten omega\nomega1 (rot), omega2 (blau), omega3 (grn)\n",labels = ["t"," "]):
> ZG:=plots[display](Matrix(1,3,[p1,p2,p3])):
> #Animation des Bewegungsvorganges
> T:=NULL:
> NT:=LinearAlgebra[RowDimension](L[2,1]);
> for j to NT do  #Schleife ber jeden Zeitschritt
>   w1:=L[2,1][j,2];  #Winkel alpha
>   w2:=L[2,1][j,4];  #Winkel  beta
>   w3:=L[2,1][j,6];  #Winkel   gam
>   P:=plottools[rotate](plottools[rotate](plottools[rotate](POLY,0,0,-w3),0,-w2,0),-w1,0,0);
>   Q:=plots[display](P): T:= T,Q:
> end do:
> AN:=plots[display](T,insequence=true,scaling =constrained,orientation=[45, 45, 0],labels=[x1H,x2H,x3H]):
> end proc:
# Um die Prozedur fr nachfolgende Arbeitsbltter anwendbar zu machen, speichern wir diese ab. Das geht wie folgt:
> save Proc_Calc_21, "Proc_Calc_21.m":
# Wir bentigen als Eingabe fr die obige Prozedur noch den zeitabhngigen Momentenvektor in Komponenten des Hauptachsensystems. Entsprechend der Aufgabenstellung gilt fr den Momentenvektor
> MHS:=Vector([0,0,piecewise(t > ta and t < te,M,0)]);
> ta:=0.40; te:=0.42; M:=5.*10^4;
# Der Bewegungsvorgang zwischen den Zeitpunkten 0  d  t  d TD  wird in  N  gleichgroe Zeitschritte zerlegt. 
> N:=100; TD:=1.;
# Wir geben den Anfangszustand des Systems zum Zeitpunkt  t = 0 vor:
> alpha0:=0.: alpha0p:=5.: beta0:=evalf(Pi/4): beta0p:=3.: gam0:=0.: gam0p:=5.: 
> AB:=[alpha0,alpha0p,beta0,beta0p,gam0,gam0p]:
> Proc_Calc_21(EWm,MHS,AB,N,TD,PL):
# Wir geben die Zustandsgren aus
> ZG;
# und animieren den Bewegungszustand
> AN; 
> 
;
# 
