2016-01-05 1 views
2

J'essaie de m'initier aux méthodes des éléments finis.Programmation des éléments finis Méthode

Tout mon code est adapté à partir des pages de liens suivants 16-20 http://homepages.cae.wisc.edu/~suresh/ME964Website/M964Notes/Notes/introfem.pdf

Je suis la programmation ainsi que dans Matlab pour effectuer une analyse par éléments finis sur un seul élément de cube 8 noeuds. J'ai défini les xi, eta, axes locaux zeta (on peut penser à ce que x, y, z pour l'instant), donc j'obtenir les fonctions de forme suivantes:

%%shape functions 

zeta = 0:.01:1; 
eta = 0:.01:1; 
xi = 0:.01:1; 

N1 = 1/8*(1-xi).*(1-eta).*(1-zeta); 
N2 = 1/8*(1+xi).*(1-eta).*(1-zeta); 
N3 = 1/8*(1+xi).*(1+eta).*(1-zeta); 
N4 = 1/8*(1-xi).*(1+eta).*(1-zeta); 
N5 = 1/8*(1-xi).*(1-eta).*(1+zeta); 
N6 = 1/8*(1+xi).*(1-eta).*(1+zeta); 
N7 = 1/8*(1+xi).*(1+eta).*(1+zeta); 
N8 = 1/8*(1-xi).*(1+eta).*(1+zeta); 

La matrice [N] doit être organisé comme ceci selon le texte que je lis:

%N Matrix 
N= [N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8 0 0; 
    0 N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8 0; 
    0 0 N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8]; 

pour trouver la matrice [B] je dois utiliser la matrice [D] suivante:

%%Del Matrix for node i 
%[ d/dx 0  0 
% 0 d/dy 0 
% 0  0 d/dz  . . . 
% d/dy d/dx 0 
% 0 d/dz d/dy 
% d/dz 0 d/dx ] 

qui est un opérateur pour continuer [N]. Plus tard, comme le montre le texte, je ferai des calculs impliquant des intégrales de cette matrice [B] sur le volume de cet élément. Donc, ma question est, comment puis-je stocker ces fonctions de forme polynomiale dans une matrice, opérer sur eux avec différenciation, puis les intégrer numériquement. Je peux dire avec la façon dont je l'ai mis en place en ce moment, cela ne fonctionnera pas parce que j'ai défini les fonctions comme un vecteur sur un intervalle [0,1] puis en stockant ces vecteurs dans la matrice [N]. Ensuite, en utilisant diff() fonction de différencier de manière appropriée pour trouver la matrice [B]. Mais puisque les éléments de matrice de [B] sont maintenant des vecteurs sur un intervalle [0,1] je pense que cela va causer des problèmes. Comment feriez-vous les gars à propos de ces calculs décrits dans le manuel que j'ai posté ci-dessus?

Répondre

0

Résolu mon problème en utilisant des fonctions anonymes et en stockant les polynômes dans une matrice symbolique. exemple:

syms xi eta zeta 
N1= ... %type out in terms of xi eta and zeta 
. 
. 
. 
dN1dXi = diff(N1,xi) %symbolic differentiation with respect to xi 

peut également effectuer une intégration symbolique en cas de besoin:

intN1 = int(N1,xi,lowerLimit,upperLimit) %symbolic integration with respect to xi 

et lorsqu'il est prêt à remplacer des valeurs réelles pour évaluer les fonctions symboliques:

subs(N1,{xi,eta,zeta},{value1,value2,value3}) 
1

Vous devriez consulter la page 24 sur la façon de mapper du domaine paramétrique ([0,1] ^) au domaine physique.

0

Bien que je pense que vous pouvez faire comme vous l'avez dit, en utilisant symbolique. Je pense que le calcul symbolique dans Matlab prend beaucoup de temps.

J'irais chercher le dérivé N manuellement et le stockerais comme dN, et l'utiliserais si besoin.

Cordialement,

Allemand

+0

Eh oui, la façon de le faire est de stocker les valeurs de la fonction de base aux points de gauss dans l'élément ou d'un domaine « parent ».Et utilisez une matrice jacobienne pour l'intégration. –