Analog zu FEAF untersuchen wir hier die Schwingungen eines Kontinuums beim Loslassen aus der entspannten Rugelage. Hier nicht mit einem Dehnstab, sondern einem Euler-Bernoulli-Balken.
Interessant ist hier, dass - im Gegensatz zu Stablängsschwingungen - die Eigenfrequenz nicht ein gerades Vielfaches der untersten Eigenfrequenz ist. Falls Sie ein Saiteninstrument spielen, verstehen Sie sofort, warum das wichtig ist.
Maxima können wir hier nicht gut gebrauchen: die Gleichungen werden zu umfangreich. Wir arbeiten also mehr mit numerischen Verfahren, da ist Matlab geeigneter.
Header
Im Programm arbeiten wir mit einer dimensionslosen Formulierung - wir brauchen dafür eine Bezugszeit tBez und eine Bezugslänge lBez.
Bezugsgrößen wählen
Dazu nehmen wir eine "Anleihe" bei der analytischen Lösung des Schwingungsproblems (vgl. Aufgabe SKEB):
Das α ist eine praktische Abkürzung, hinter der wir ω0 verstecken. Anders als beim Dehnstab (SKER) finden wir hier keine analytische Beziehung, sondern nur die numerischen Beziehungen, für die unsere Randbedingungen erfüllt sind:
Die langsamste Eigenmode gehört zu α1 mit der Periodendauer
Für die Diskretisierung wählen wir als Anzahl der Finiten Elemente (Number Of Elements):
und damit je Element
.
Wir wählen die kubische Ansatzfunktionen aus dem Abschnitt Finite Elemente Methode je Element, also
Für die numerisch Implementierung stört in dieser Darstellung das Element-spezifische ℓi - die Elementlänge. Wir behelfen uns, indem wir die Ansatzfunktionen schreiben als
,
wobei wir die Ansatz-Polynome in verpacken.
Das schaut unnötig komplex aus - allerdings stecken wir die Diagonal-Matrizen d (für jedes Element eine) in eine Matlab®-Variable, so dass sie dort nicht weiter auffällt.
Die abhängigen Koordinaten des FEM-Modells sind dann zunächst - bis zum Einarbeiten der Randbedingungen - diese:
.
Matlab
Classes
In dieser CODE-Sektion kommt ein Beispiele zum Aufbau des Matlab®-Programms mit Klassen (Objektbasierte Programmierung)
FEM-Section
classdefFEM_Section% section section parameters propertiesrho;E;beta;h;b;l;endmethods% Constructorfunctionself=FEM_Section(parHashMap)self.rho=parHashMap('rho');self.E=parHashMap('E');self.beta=parHashMap('beta');self.h=parHashMap('h');self.b=parHashMap('b');self.l=parHashMap('l');end% end Constructor% start bending stiffness EIfunctionEI=bendingStiffness(self)EI=self.E*1/12.*self.b*self.h^3;end% end bending stiffness% start cross-sectional areafunctionA=cossecArea(self)A=self.b*self.h;end% end bending stiffness% start massfunctionm=mass(self)m=self.rho*self.b*self.h*self.l;end% end massendend
FEM-Element-Model
classdefFEM_Element_Modell% modell parameters propertiestype;% element typenoe;% number of elements of this typenoc;% number of coordinates per nodephi;% trial-functionsM;% element-mass matrixK;% element-stiffness matrixG;% element-load matrix (g)endmethods% Constructorfunctionself=FEM_Element_Modell(parHashMap)self.type=parHashMap('Type');self.noe=parHashMap('NOE');ifself.type=='EBB'% Euler-Bernoulli-Beam Elementsself.phi=[[2,-3,0,1];...[1,-2,1,0];...[-2,3,0,0];...[1,-1,0,0]];self.noc=2;elseifself.type=='ER'% Extensible Rod typeself.phi=[[-1,1];...[1,0]];self.noc=1;end[self.M,self.K,self.G]=self.ElementMassMatrix();end% end Constructor function[M, K, G] = ElementMassMatrix(self)m=length(self.phi);M=zeros(m,m);K=zeros(m,m);G=zeros(m,1);forrow=1:mforcol=1:mM(row,col)=diff(...polyval(...polyint(...conv(self.phi(row,:),self.phi(col,:))),...[0,1]));ifself.type=='EBB'% -> second derivs K(row,col)=diff(...polyval(...polyint(...conv(polyder(polyder(self.phi(row,:))),polyder(polyder(self.phi(col,:))))),...[0,1]));elseifself.type=='ER'% -> first derivs K(row,col)=diff(...polyval(...polyint(...conv(polyder(self.phi(row,:)),polyder(self.phi(col,:)))),...[0,1]));endendG(row,1)=diff(...polyval(...polyint(...self.phi(row,:)),...[0,1]));endendendend
FEM-Container
classdefFEM_Container% holds all system matricsproperties% matricesM;% mass matrixD;% damping matrixK;% stiffness matrixG;% gravitational Loadingd;% scalting matrix with l[i]-Element% rod lengthl;% length% model propertiesNOE;% number of elementsNON;% number of nodesNOC% number of coordinates per nodeNOQ% number of coordinates in totalg;% 9.81 m/s^2% boundary conditions free;disabled;% functionstrials;% solutionsamples;% number of samples when plotting with pointsendmethods% Constructorfunctionself=FEM_Container(bezug,system,boundaries,element)% declarationsNOE=sum(element.noe);% number of all elements in all sectionsNON=NOE+1;% number of nodesNOC=element.noc;% number of coordinates per nodeNOQ=NON*NOC;% number of coordintesself.NOE=NOE;self.NON=NON;self.NOC=NOC;self.NOQ=NOQ;% number of samples when plottingself.samples=21;% global paramsself.g=9.81/(bezug('l_ref')/bezug('t_ref')^2);% FE-lengths self.l=[0];forsec=1:length(system)forele=1:element.noe(sec)self.l=[self.l,self.l(length(self.l))+system(sec).l/element.noe(sec)];endend% initialize system matrices[self.M,self.K,self.G,self.d]=self.systemMatrices(system,element);% collect boundary conditionsfree=linspace(1,1,element.noc*(sum(element.noe)+1));touch=[1];forsec=1:length(element.noe)touch=[touch,touch(length(touch))+element.noc*element.noe(sec)];endfori=1:min(length(touch),length(boundaries))nodeNo=touch(i);free(nodeNo:nodeNo+element.noc-1)=boundaries(i).free;enddisabled=~free;self.free=(1:length(free)).*free;self.free(self.free==0)=[];disabled=(1:length(disabled)).*disabled;self.disabled=(1:length(disabled)).*disabled;self.disabled(self.disabled==0)=[];% trial functionsself.trials=element.phi;end% end Constructor% start system matricesfunction[M,K,G,d]=systemMatrices(self, system, element)M=zeros(self.NOQ,self.NOQ);K=zeros(self.NOQ,self.NOQ);G=zeros(self.NOQ,1);d=zeros(4,4,self.NOE);g=self.g;e=0;% counter for all elements of all sectionsforsection=1:length(element.noe)L=system(section).l/element.noe(section);m=system(section).rho*system(section).cossecArea()*L;% beinding stiffnessb=system(section).bendingStiffness()/L^3;fori=1:element.noe(section)e=e+1;ifelement.type=='EBB'd(:,:,e)=diag([1,L,1,L]);% diagnoal matrix with l[i]-factorselseifelement.type=='ER'd(:,:,e)=diag([1,1]);end%j=2*(e-1)+1;M(j:j+3,j:j+3)=M(j:j+3,j:j+3)+m*d(:,:,e)*element.M*d(:,:,e);K(j:j+3,j:j+3)=K(j:j+3,j:j+3)+b*d(:,:,e)*element.K*d(:,:,e);G(j:j+3,1)=G(j:j+3,1)+m*g*d(:,:,e)*element.G;endendend% end system matrices% start boudaryconditionsfunction[M,K,G]=constrained(self)M=self.M(self.free,self.free);K=self.K(self.free,self.free);G=self.G(self.free,1);end% end system matrices% start eigensystemfunction[V,D]=eigensystem(self)% ODE: A q + B q = 0% = - = - -% define system matrices[A,B,G]=self.constrained();%S = linsolve(A,-B);S=inv(A)*(-B);% eigensystem[V,D]=eig(S);end% end eigensystem% start particular solutionfunctionQ=particularSolution(self)% ODE: A q + B q = G% = - = - -% define system matrices[A,B,G]=self.constrained();Q=linsolve(B,G);end% end particular solutionendend
zusammen - also den virtuellen Arbeiten je Element zuzüglich von virtuellen Arbeiten am Rand. In unserem Beispiel haben wir allerdings keine eingeprägten, äußeren Lasten am Rand, also ist
.
Je Element erfassen wir die virtuellen Arbeiten durch Element-Matrizen. So ist z.B. für die virtuelle Formänderungsenergie (vgl. Finite Elemente Methode)
könnten wir als Element-Lastmatrix (Spaltenmatrix) abspeichern.
.
Dass es auch anders geht,sehen Sie in der Definition der Matlab®-Klasse FEM_Element_Modell, bei der die Element direkt aus den Trial-Functions - hier den -
:
e = 0;% counter for all elements of all sections
for section = 1: length(element.noe)
:
for i = 1:element.noe(section)
e = e+1;
:
j = 2*(e-1)+1;
:
K(j:j+3,j:j+3) = K(j:j+3,j:j+3)+b* d(:,:,e)*element.K*d(:,:,e);
:
end
:
In Matrix-Schreibweise lautet die Bewegungsgleichung des Gesamt-Systems jetzt:
.
Einarbeiten der Randbedingungen
Randbedingungen einarbeiten.
Die Randbedingungen arbeiten wir ein, indem wir zeilenweise (für δW und δΦ) und spaltenweise (für W und Φ) streichen.
Hier sind es
die erste Zeile/Spalte für W0 (blau) und
die zweite Zeile / Spalte für Φ0 (grün).
NONE - see below
Solving
Die Lösung des Anfangs- und Randwertproblems ist in diesem Lösungsansatz mit Matlab® um die Klasse "FEM_Container" herum aufgebaut - in ihr sind alle Parameter und Lösungsprozesse beschrieben.
Hier heißt die Instanz des Modells
mathModel
In diesem Container sind alle Parameter und Zustandsgrößen des Modells bereits dimensionslos gemacht - und zwar mit den oben genannten Bezugsgrößen, die in der Excel-Eingabedatei im Blatt "0) Bezugsgrößen" definiert sind.
Die Lösung des Anfangswertproblems setzt sich aus zwei Teilen zusammen:
der partikularen Lösung, die die Rechte Seite "G" erfüllt und
der homogenen Lösung, die die Rechte Seite "0" erfüllt.
Die Gesamtlösung Qt setzt sich nun - bei diesem linearen System - additiv aus partikularer Qp und Qh homogener Lösung zusammen:
Particular Solution
Particulare Lösung.
Die rechte Seite der Bewegungsgleichung G ist nicht zeitabhängig - sie ist statisch. Also ist auch die Lösung Qp statisch, wir suchen nach der Lösung des Gleichungssystems
Die Eigenvektoren in V spannen nun den Nullraum (nullspace) der Matrix auf, es ist
Die homogene Lösung der Bewegungsgleichung lautet damit
mit den acht Integrationskonstanten Ci . Durch die komplexen Eigenwerte sind die Integrationskonstanten nun (eigentlich) auch komplexwertig. Darum kommen in diesem Fall herum, weil die Anfangsgeschwindigkeit des Balkens beim Loslassen Null ist - wir also nur cos-Anteile berücksichtigen müssen. Und die gehören wiederum zum Realteil der Exponential-Funktion.
Die Ci sind nun die Konstanten, die wir brauchen, um die Lösung an Anfangsbedingungen anzupassen.
Vorher schauen wir uns die Lösung jeweils zu einer Eigenfrequenz ωi an. Diese Funktionen heißen Modalformen ϕ(x) und deren Schwingungen können wir plotten:
Mode
Modalform ϕj(x)
Mode
Modalform ϕj(x)
#8
Mode #1
#7
Mode #2
#6
Mode #3
#5
Mode #4
#4
Mode #5
#3
Mode #6
Modalformen
Alle acht Moden ϕj können wir auch zum Zeitpunkt τ=0 übereinander darstellen:
✔Zur Euler-Bernoulli-Hypothese:
Praktisch haben die höheren Moden kaum Relevanz - meist klingen sie durch Dämpfung schnell ab. Man sieht allerdings bereits an der Schwingungs-Form, dass hier die Länge zwischen zwei Knoten nicht mehr sehr klein ist im Vergleich zur Höhe. Und das führt dazu, dass Schubverformungen eine Rolle spielen. Wir müssen zum Timoshenko-Balken wechseln ....
:::%% ***************************************************************************/% p a r t i c u l a r s o l u t i o n */% ***************************************************************************/NOV=length(mathModel.free)+length(mathModel.disabled);% initiate particular solution QpQp=zeros(NOV,1);Q=mathModel.particularSolution();Qp(mathModel.free,:)=Q;% get coordinates of nodesL=mathModel.l(length(mathModel.l));% plot particular solutionforele=1:mathModel.NOExi=linspace(mathModel.l(ele)/L,mathModel.l(ele+1)/L,mathModel.samples);plot(xi,Qp(2*ele-1:2*ele+2,1)'*(mathModel.d(:,:,ele)*phi),'LineWidth',4);holdon;endplot(mathModel.l/mathModel.l(length(mathModel.l)),Qp(1:2:length(Qp)),'ro','LineWidth',2);xlabel('\xi\rightarrow');ylabel('w/w_s\rightarrow');holdoff;
Main - part III (homogene Lösung)
:::%% ***************************************************************************/% * h o m o g e n e o u s s o l u t i o n */% ***************************************************************************/[V,D]=mathModel.eigensystem();% eigenfrequencies of systemomega=sqrt(diag(-D));Qh=zeros(NOV,length(mathModel.free));Qh(mathModel.free,:)=V(:,:);% plot modesformode=length(mathModel.free):-1:1forele=1:mathModel.NOExi=linspace(mathModel.l(ele)/L,mathModel.l(ele+1)/L,mathModel.samples);plot(xi,Qh(2*ele-1:2*ele+2,mode)'*(mathModel.d(:,:,ele)*phi),'LineWidth',2);holdon;endplot(mathModel.l/mathModel.l(length(mathModel.l)),Qh(1:2:length(Qp),mode),'ro','LineWidth',2);xlabel('\xi\rightarrow');ylabel('w/w_r\rightarrow');endholdoff;
Adapt to Initial Conditions
Die acht reell-wertigen Integrationskonstanten Ci bestimmen wir aus den Anfangsbedingungen für den Balken, nämlich
,
also
.
Wenn wir die Ci komplexwertig denken, so stehen hier 16 Anfangsbedingungen für acht komplexe Ci .
Denken wir die Ci gleich reelwertig, so können wir die acht Anfangsbedingungen in der rechten Spalte weglassen - sie sind dann implizit mit erfüllt - für unser spezielles Anfangswertproblem.
Die Anfangsbedingung für die Gesamtlösung lautet nun:
,
also
Wir finden
.
und damit
.
Offensichtlich ist der Beitrag der Mode 8 (also der langsamsten Mode) bei weitem am größten Anteil an Qh. Das können wir auch in der Animation der Lösung - also das Loslassen des Balken aus der Ruhe heraus - sehen.
Matlab®
Main Script
Main - part IV (adapt to initial conditions)
:::%% ***************************************************************************/% t o t a l ( c o m p o s e d ) s o l u t i o n */% ***************************************************************************/C=linsolve(Qh(mathModel.free,:),Qp(mathModel.free,1));Qi=zeros(NOV,length(mathModel.free));Qi(mathModel.free,:)=Qh(mathModel.free,:)*diag(C);forele=1:mathModel.NOExi=linspace(mathModel.l(ele)/L,mathModel.l(ele+1)/L,mathModel.samples);plot(xi,Qp(2*ele-1:2*ele+2,1)'*(mathModel.d(:,:,ele)*phi),'Color',[0.80.80.8],'LineWidth',8);holdon;endformode=1:length(mathModel.free)forele=1:mathModel.NOExi=linspace(mathModel.l(ele)/L,mathModel.l(ele+1)/L,mathModel.samples);plot(xi,Qi(2*ele-1:2*ele+2,mode)'*(mathModel.d(:,:,ele)*phi),'LineWidth',2);holdon;endendholdoff;
Post-Processing
Die FEM-Lösung im Zeitbereich, angepasst an die Anfangsbedingungen, sieht nun so aus:
Lösung im Zeitbereich - hier für I=4.
Animation in Time Domain - hier für I=4.
Matlab®
Main Script
Main - part IV (adapt to initial conditions)
:::%% animated shape ....tau=linspace(0,3,3*21);h=figure;axistightmanual%thisensuresthatgetframe()returnsaconsistentsizefileName=strcat('feag-initial-value-solution-animation.gif');forstep=tauholdoff;forele=1:mathModel.NOExi=linspace(mathModel.l(ele)/L,mathModel.l(ele+1)/L,mathModel.samples);disp=Qp(2*ele-1:2*ele+2,1)'*(mathModel.d(:,:,ele)*phi);formode=length(mathModel.free):-1:1disp=disp-Qi(2*ele-1:2*ele+2,mode)'*(mathModel.d(:,:,ele)*phi)*cos(2*pi*omega(mode)/omega(length(omega))*step);endplot(xi,disp,'LineWidth',2);holdon;axis([01-0.12.1]);set(gca,'Ydir','reverse')xlabel('\xi\rightarrow');ylabel('w/w_r\rightarrow');endtitle('initial value solution');drawnow%Capturetheplotasanimageframe=getframe(h);im=frame2im(frame);[imind,cm]=rgb2ind(im,256);% Write to the GIF File ifstep==0imwrite(imind,cm,fileName,'gif','Loopcount',inf,'DelayTime',0);elseimwrite(imind,cm,fileName,'gif','WriteMode','append','DelayTime',0);endendholdoff;%% time domain ....tau=linspace(0,3,3*71);fileName='feag-initial-value-solution-W.gif';pick=3:2:mathModel.NOQ;plot(tau,Qp(pick)-Qi(pick,:)*cos(omega(1:8)*tau));set(gca,'Ydir','reverse')xlabel('\tau\rightarrow');ylabel('w/w_s\rightarrow');holdoff;%% E - N - D
Cookies helfen uns bei der Bereitstellung von numpedia. Durch die Nutzung von numpedia erklärst du dich damit einverstanden, dass wir Cookies speichern.