Académique Documents
Professionnel Documents
Culture Documents
UNSTIM-ENSTP-1
Groupe N° 3
b=xn;
%condition aux limites
disp('******** Conditions initiales
******************************************************');
y0=input('Entrer la valeur de y(x0): \ny0=');
% Nombre de subdivision de l'intervalle [x0,xn] pour la MEF
disp('** Nombre de subdivision de l''intervalle [x0,xn] pour la MEF
**********************');
ne = input('Entrer le nombre d''éléments: \nne='); % Nombre d'élément
nn = input('Entrer le nombre de noeuds d''interpolation: \nnn='); %
Nombre de noeuds d'interpolation
% resolution du problème avec la fonction Ode1dO1
[X,Y]=Ode1dO1(alpha,beta,a,b,y0,ne,nn);
% X et Y sont des vecteurs représentant respectivement les noeuds de
% discrétisation et les approximations nodales.
% Affichage
fprintf(' \n Résultats : \n')
fprintf(' \n Noeuds de discretisation et Approximations nodales: \n\n
');
fprintf('n° \t \t \t \tx \t \t \t \t y(x) ');
for i=1:length(X)
if i < 10
fprintf(' \n %d \t \t \t \t%f \t \t \t %f ', i,X(i),Y(i));
else
fprintf(' \n %d \t \t \t%f \t \t \t %f ', i,X(i),Y(i));
end
end
fprintf('\n\n');
disp('***** Merci d''avoir utiliser notre programme
**************************************');
elseif d==2
disp('Equation différentielle d''ordre 2 de la forme
d^2u/dx^2+a(x)du/dx+b(x)u = c(x),');
disp('x appartenant à ]x0,xn] avec des conditions de Robin:');
disp('alpha1*u(x0)+beta1*u''(x0)=gama1');
disp('alpha2*u(xn)+beta2*u''(xn)=gama2 \n');
% Les fonctions a(x) et b(x)
disp('********* Fonctions d''entrées
*************************************************');
a = input('Entrer la fonction a(x): \na(x)=');
b = input('Entrer la fonction b(x): \nb(x)=');
c = input('Entrer la fonction c(x): \nc(x)=');
if x0==0
x0=1e-20;
end
% Nombre de subdivision de l'intervalle [x0,xn] pour la MEF
disp('** Nombre de subdivision de l''intervalle [x0,xn] pour la MEF
******************');
ne = input('Entrer le nombre d''éléments: \nne='); % Nombre
d'élément
nn = input('Entrer le nombre de noeuds d''interpolation: \nnn='); %
Nombre de noeuds d'interpolation
disp('***** Conditions initiales
*****************************************************');
y0=input('Entrer la valeur de y(x0): \ny0=');
alpha1=input('Entrer la valeur de alpha1: \nalpha1=');
beta1=input('Entrer la valeur de beta1: \nbeta1=');
gama1=input('Entrer la valeur de gama1: \ngama1=');
alpha2=input('Entrer la valeur de alpha2: \nalpha2=');
beta2=input('Entrer la valeur de beta2: \nbeta2=');
gama2=input ('Entrer la valeur de gama2: \ngama2=');
% resolution du problème avec la fonction Ode1dO1
[X,Y]=Ode1dO2(a,b,c,x0,xn,y0,ne,nn);
% X et Y sont des vecteurs représentant respectivement les noeuds de
% discrétisation et les approximations nodales.
% Affichage
fprintf(' \n Résultats : \n')
fprintf(' \n Noeuds de discretisation et Approximations nodales \n ');
fprintf('N° \t \t \t \t x \t \t \t \t y(x) ');
for i=1:length(X)
if i < 10
fprintf(' \n %d \t \t \t \t%f \t \t \t %f ', i,X(i), Y(i));
else
fprintf(' \n %d \t \t \t%f \t \t \t %f ', i,X(i),Y(i));
end
end
fprintf('\n\n');
disp('***** Merci d''avoir utiliser notre programme
**************************************');
else
disp('Non pris en compte, Merci de reprendre avec des équations diff
d''ordre 1 ou 2');
end
end
Fonction dLagMEF
function [y] = dLagMEF(X,t)
%=========================================================
% Dérivée première des fonctions de forme de type Jacobi
% Auteur: GBAGUIDI Thomas Brice
%=========================================================
N=length(X);
y1=zeros(N,1);
for i=1:N
y1(i,1)=0;
for j=1:N
if j<i
Xj=X;
Xj(j)=[];
xx=LagMEF(Xj,t);
y1(i,1)=y1(i,1)+xx(i-1)/(X(i)-X(j));
elseif j>i
Xj=X;
Xj(j)=[];
xx=LagMEF(Xj,t);
y1(i,1)=y1(i,1)+xx(i)/(X(i)-X(j));
end
end
end
y=y1';
end
Fonction integrale
Fonction LagMEF
function [ y ] = LagMEF( X,t )
%=========================================================
% Fonctions de forme de type Jacobi
% Auteur: GBAGUIDI Thomas Brice
%=========================================================
N=length(X);
y1=zeros(N,1);
for i=1:N
y1(i,1)=1;
for k=1:N
if k~=i
y1(i,1)=y1(i,1)*(t-X(k))/(X(i)-X(k));
end
end
end
y=y1';
end
Fonction Ode1dO1
function [X,y] = Ode1dO1(alpha,beta,a,b,y0,ne,nn)
%=======================================================================
===
% Programme pour la résolution des équations de
% la forme dy/dx+alpha(x)y+beta(x)=0 avec y(a)=y0
% par la méthode des éléments finis sur
% l'intervalle ]a,b]
% Fonctions de forme: polynôme d'interpolation de Lagrange
%=======================================================================
===
% Nombre de subdivision de l'intervalle [a,b] pour la MEF
n=20;
% Nombre de subdivision de l'intervalle [a,b] pour les intégrales
Nint=1000;
% Subdivision
X=linspace(a,b,n+1);
% La matrice Ke et le vecteur Fe
Ke=zeros(n+1,n+1); % Initialisation de Ke à 0
Fe=zeros(n+1,1); % Initialisation de Fe à 0
XX=zeros(nn+1,n-nn+1);
for i=1:n-nn+1
for jj=1:nn+1
XX(jj,i)=X(i+jj-1);
end
ke=@(t)(LagMEF(XX(:,i),t)'*(dLagMEF(XX(:,i),t)+alpha(t)*LagMEF(XX(:,i),t
)));
fe=@(t)(LagMEF(XX(:,i),t)'*beta(t));
intke=integrale(ke,XX(1,i),XX(nn+1,i),Nint);
intfe=integrale(fe,XX(1,i),XX(nn+1,i),Nint);
Ke(i:i+nn,i:i+nn)=Ke(i:i+nn,i:i+nn)+intke; % Assemblage de Ke
Fe(i:i+nn,1)=Fe(i:i+nn,1)+intfe; % Assemblage de Fe
end
Fonction Ode1dO2
function [x,y] = Ode1dO2(a,b,c,x0,xn,y0,ne,nn)
%=======================================================================
===
% Programme pour la résolution des problèmes aux limites
% de la forme d^2y/dx^2+a(x)dy/dx+b(x)y = c(x), x appartenant à ]x0,xn]
% avec des conditions de Robin:
% alpha1*y(x0)+beta1*y'(x0)=gama1
% alpha2*y(xn)+beta2*y'(xn)=gama2
% par la méthode des éléments finis sur
% Fonctions de forme: polynôme d'interpolation de Lagrange
%=======================================================================
===
%condition aux limites
al1=1;
be1=1;
ga1=1;
al2=1;
be2=2;
ga2=0;
n=(nn-1)*ne; %pas
h=(xn-x0)/n;
% Nombre de subdivision de l'intervalle [x0,xn] pour les intégrales
Nint=1000;
% Subdivision
x=linspace(x0,xn,n+1);
% La matrice Ke, Fe et XX
Ke=zeros(n+1,n+1);
Fe=zeros(n+1,1);
XX=zeros(nn,ne);
for i=1:ne
k1=(i-1)*(nn-1)+1;
k2=(i-1)*(nn-1)+nn;
for jj=1:nn
XX(jj,i)=x(k1+jj-1);
end
dNTdN=@(t)(dLagMEF(XX(:,i),t)'*dLagMEF(XX(:,i),t));
NTdN=@(t)(LagMEF(XX(:,i),t)'*dLagMEF(XX(:,i),t));
NTN=@(t)(LagMEF(XX(:,i),t)'*LagMEF(XX(:,i),t));
ke=@(t)(-dNTdN(t)+a(t)*NTdN(t)+b(t)*NTN(t));
fe=@(t)(LagMEF( XX(:,i),t )'* (c(t)));
intke=integrale(ke,XX(1,i),XX(nn,i),Nint);
intfe=integrale(fe,XX(1,i),XX(nn,i),Nint);
Ke(k1:k2,k1:k2)=Ke(k1:k2,k1:k2)+intke;
Fe(k1:k2,1)=Fe(k1:k2,1)+intfe;
end
K=Ke;
F=Fe;
test1=al1*h-be1;
test2=al2*h+be2;
if(test1==0)
y2=ga1*h/be1;
if(test2==0)
ynm1=-ga2*h/be2;
F=F-y2*Ke(:,2)-ynm1*Ke(:,n);
K(:,n-1)=[];
K(2,:)=[];
F(2)=[];
K(n-1,:)=[];
F(n-1)=[];
y=K\F;
y=[y(1);y2;y(2:n-2);ynm1;y(n-1)];
else
F=F-y2*Ke(:,2)-ga2*h/test2*Ke(:,n+1);
K(:,n)=K(:,n)+be2/test2*K(:,n+1);
K(:,2)=[];
K(:,n)=[];
K(2,:)=[];
F(2)=[];
K(n,:)=[];
F(n)=[];
y=K\F;
yn=(be2*y(end)+ga2*h)/test2;
y=[y(1);y2;y(2:n-1);yn];
end
else
if(test2==0)
ynm1=-ga2*h/be2;
F=F-ga1*h/test1*Ke(:,1)-ynm1*Ke(:,n);
K(:,2)=K(:,2)-be1/test1*K(:,1);
K(:,1)=[];
K(:,n-1)=[];
K(1,:)=[];
F(1)=[];
K(n-1,:)=[];
F(n-1)=[];
y=K\F;
y1=(-be1*y(1)+ga1*h)/test1;
y=[y1;y(1:n-2);ynm1;y(n-1)];
else
F=F-ga1*h/test1*Ke(:,1)-ga2*h/test2*Ke(:,n+1);
K(:,n)=K(:,n)+be2/test2*K(:,n+1);
K(:,2)=K(:,2)-be1/test1*K(:,1);
K(:,1)=[];
F(1)=[];
K(n,:)=[];
F(n)=[];
y=K\F;
y1=(-be1*y(1)+ga1*h)/test1;
yn=(be2*y(n-1)+ga2*h)/test2;
y=[y1;y(1:n-1);yn];
end
end
%x=X;
%y=u;%Solution MEF
% Solution analytique
eq=@(x1,y1)[y1(2); -a(x1).*y1(2)-b(x1).*y1(1)-c(x1)];
[x1,y1] = ode45(eq, x, [1; 2]);% Resolution de l'equation diff
plot(x,y,'r',x1,y1(:,1)); % Représentation graphique de la solution
legend('Solution MEF','Solution exacte');
legend('Solution MEF','Solution analytique');
grid on ;
end
Fonction RK4expSys
function [x,y]=RK4expSys(f,a,b,u,N)
%============================================================
% Cette fonction est un solveur de problème aux valeurs
% initiales de la forme: y’=f(x,y) avec les conditions
% initiales : y(a)=u.
%---------------------------
% o
% o y1'=f1(x,y1,y2,...,yn)
% o y2'=f2(x,y1,y2,...,yn)
% o .
% < .
% o .
% o .
% o yn'=fn(x,y1,y2,...,yn)
% o
%---------------------------
% Utilisation: [x,y]=RK4expSys(f,a,b,u,N)
%
% Description des arguments :
% f : fonction de x et y définissant les seconds membres
% du problème. Elle retourne un vecteur colonne de n composantes
% a : borne inférieure de l’intervalle de résolution
% b : borne supérieure de l’intervalle de résolution
% u : vecteur colonne définissant la condition y(a)=u
% n : nombre de subdivision n de l’intervalle [a,b]
%
% Sortie
% x : vecteur des abscisses de la solution du problème
% y : matrice des ordonnées de la solution du problème
% elle comporte un nombre de lignes égal au nombre
% d'équations: n et un nombre de colonnes égal au
% nombre de points: N+1
% Auteur: GBAGUIDI T. Brice
%===========================================================
%------Pas de subdivision
h=(b-a)/N ;
%------Récupération du nombre d'équations
n=size(u,1);
%------Création du vecteur x et initialisation de y1
x=linspace(a,b,N+1) ;
y1=zeros(n,N+1) ;
%------Conditions initiales
y1(:,1)=u ;
%------Boucle pour le calcul de y1 et y2
for n=1:N
K1=h*f(x(n),y1(:,n));
K2=h*f(x(n)+h/2,y1(:,n)+K1/2);
K3=h*f(x(n)+h/2,y1(:,n)+K2/2);
K4=h*f(x(n)+h,y1(:,n)+K3);
y1(:,n+1)=y1(:,n)+(K1+2*K2+2*K3+K4)/6 ;
end
y=y1 ;
end
Exercice 2
Ecriture d’un script pour le calcul des structures planes treillis
(déplacements nodaux, réactions aux appuis, tensions dans les
poutrelles, allongement) par les éléments finis (linéaires).
Le programme principal est le suivant :
clc;
clear all;
disp('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++');
disp('Ce progamme vous permet d''efectuer le calcul des structures
planes treillis (déplacements nodaux,');
disp('réactions aux appuis, tensions dans les poutrelles, allongement)
par les éléments finis (linéaires).');
disp('Il vous permet également de visualiser un exemple de determination
des paramètres cités plus haut');
disp('pour un élément barre comportant deux barres.');
disp('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++');fprintf('\n');
var=input('Tapez 1 pour effectuer le calcul d''une structure treillis de
votre choix ou 0 pour visualiser l''exemple.\nChoix:');fprintf('\n');
if var==1
trussfem('expl2barre');
else
trussfem('expl2barres');
end
AddDOFs
function B=AddDOFs(A,L)
%=======================================================================
===
%B=AddDOFs(A,L)
% ajout des DDL des noeuds encastré
%=======================================================================
===
L=sort(L);
b=length(L);
a=length(A);
B=ones(b+a,1);
for i=1:b
B(L(i),1)=0;
end
pos=1;
for i=1:b+a
if B(i,1)~=0
B(i,1)=A(pos);
pos=pos+1;
end
end
end
DelDOFs
function A=DelDOFs(A,L)
%=======================================================================
===
% A = DelDOFs(A,L)
% A : matrice globale après assemblage
% L : liste des degrés de liberté à éliminer
%=======================================================================
===
L=sort(L); % tri de la liste des DDL
n=length(L); % longueur de L
if (size(A,2)==1) % cas d’un vecteur
for i=n:-1:1 % parcourir L à partir du plus grand indice
A(L(i))=[]; % suppression de la composante associée au DDL
courant
end
else % cas d’un matrice
for i=n:-1:1
A(L(i),:)=[]; % suppression de la ligne L(i)
A(:,L(i))=[]; % suppression de la colonne
end
end
EltLen
expl2barre
expl2barres
Localise
function L = Localise(t)
%================================================
% L = Localise(t)
% t : table de connectivités de l'élément
% L : table de localisation
%================================================
nne = length(t);
for i= 1:nne
L([2*i-1 2*i]) = [2*t(i)-1 2*t(i)];
end
end
plotmesh_
truss2DKe
function ke = truss2DKe(XY,A,E)
%==========================================================
% ke = truss2dKe(XY,A,E)
% Calcul de la matrice elementaire pour un
% élément barre à deux noeuds (x1,y1) (x2,y2)
% A : section de la barre
% E : module d'élasticité du matériau
% XY: cordonnées des noeuds XY = [x1,y1; x2,y2]
%
%==========================================================
[c,s,L] = EltLen(XY); % longueur et orientation de l’élément
cc = c*c; % cos(angle)^2
cs = c*s; % cos(angle)*sin(angle)
ss = s*s; % sin(angle)^2
ke = (A*E/L) * [ cc cs -cc -cs % matrice élémentaire Ke
cs ss -cs -ss
-cc -cs cc cs
-cs -ss cs ss ];
end % fin de fonction
truss2dKM
truss2dMe
function Me = truss2dMe(XY,A,rho)
%==========================================================
% Me = truss2dMe(XY,A,rho)
% Calcul de la matrice masse elementaire Me pour un
% élément barre à deux noeuds (x1,y1) (x2,y2)
% A : section de l'élément
% rho : masse volumique de l'élément
% XY : cordonnées des noeuds XY = [x1,y1; x2,y2]
%==========================================================
L = EltLen(XY);
Me = 0.5*rho*A*L*eye(4);
end % fin de fonction
trussfem
TrussForces
Exercice 3
Exercice 4
Calculons
• Les déplacements nodaux,
• Les réactions aux appuis,
Δl
• L’allongement de chaque membrure en précisant la nature de la
l
sollicitation,
• La tension dans chaque membrure.
expl2barre4
function [t,p,nenc,EA,F]=expl2barre4
%connectivité des éléments
t=[ 1 5 % elemnt 1
2 5 % element 2
3 5 % ....
4 5
];
%coordonnee des Noeuds
p=[ 0 0 0 % coordon?e Noeud 1
1.25 3 0 % coordon?e Noeud 2
3.5 2 0 % .......
4 1 0
2 1.5 3
];
%Noeud d'encastrement ou deplacement nulle
nenc=[ 1;2;3 %noeud 1
4;5;6 %noeud 2
7;8;9
10;11;12
];
% charge de chaque Barre
EA=[1 1 1 1 ]*5e8 ; %vecteur contenant lemodule de young de chaque
barre(10 barres au totale de module 4e9 chacune dans notre cas)
% charge de la structure
F=[ 0;0;0 %noeud non chargee
0;0;0 %noeud non chargee
0;0;0 %.....
0;0;0
20000;-20000;30000 %noeud chargé suivant les trois directions(sens
oposé à Y)
];
end
Nombre de barres : 4
Nombre de noeuds : 5
Figure de la structure