You are on page 1of 18

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE INGENIERÍA MECÁNICA

INFORME DE LABORATORIO N °1

CURSO: Calculo por Elementos Finitos MC516


SECCIÓN: “C”
APLICACIÓN: MATLAB y Calculo por Elementos Finitos
PROFESOR: Ing. Jorge Vera Ermitaño
ESTUDIANTES: Chávez Durán Marvin Jorge 20150204E

Lima 26 de Abril del 2018


PRIMERA PRACTICA DE MC 516 SECCION C

PROBLEMA 1.
1.- Utilizando el libro de referencia (Ferreira) describir la solución del caso mostrado con el
siguiente desarrollo:

A.- Describir el procedimiento según la teoría

B.- Elaborar el código Matlab

C.- Cada uno utilizara cargas diferentes según P = 10 + N, DONDE N es el último digito de su
código UNI y mandarlo a jvera1@uni.edu.pe
DIAGRAMA DE CUERPO LIBRE DEL PRIMER PROBLEMA

14 N

Figura 1. D.C.L. delos resortes y reacciones unidimensional

A.EXPLICACION DEL CALCULO MATEMATICO

Para ilustrar algunos de los conceptos básicos e introducir el primer código de MATLAB,
consideramos un problema, ilustrado en la figura 1 donde se define la barra central
tan rígido. Nuestro problema tiene tres elementos finitos y cuatro nodos. Tres nodos son
sujetado, siendo las condiciones de contorno definidas como u1 = u3 = u4 = 0. Con el fin de
resolver este problema, establecemos k = 1 para todos los resortes y la carga externa aplicada en
el nodo 2 es P = 14.
Podemos escribir, para cada elemento a su vez, la ecuación de equilibrio (local)
Spring 1:
Fig. 1 Problem 1: a spring problem
y luego obtener las ecuaciones de equilibrio global estáticas en la forma

Teniendo en cuenta las condiciones de contorno u1 = u3 = u4 = 0, podemos escribir

En esta etapa, podemos calcular las reacciones F1, F3, F4, solo después del cálculo
de los desplazamientos globales. Podemos eliminar líneas y columnas del sistema,
correspondiente a u1 = u3 = u4 = 0, y reduce el sistema global a una ecuación

(k1 + k2 + k3) u2 = P

Las reacciones pueden ser obtenidas por

-k1u2 = F1; -k2u2 = F3; -k3u2 = F4

Tenga en cuenta que la matriz de rigidez se obtuvo al "sumar" las contribuciones de


cada elemento en las líneas y columnas correctas correspondientes a cada elemento grados
de libertad. Por ejemplo, los grados de libertad del elemento 1 son 1 y 2,
y la matriz de rigidez 2 × 2 de este elemento se coloca en las líneas correspondientes
y columnas de la matriz de rigidez global.
Para el elemento 3,
los grados
(globales)
de libertad son 2 y 4 y la rigidez 2 × 2
matriz de este elemento se coloca en las líneas y columnas correspondientes de la
matriz de rigidez global.

Se introduce un primer problema de código MATLAB1.m para resolver el problema ilustrado en


figura 1 Muchos de los conceptos utilizados más adelante en elementos más complejos ya están
dado en este código. Establecemos k = 1 para todos los elementos y P = 14N.

Datos para el cálculo

Código UNI: 20150204E

P=14, k=1, u1=u3=u4=0

Codificación del programa

USAMOS UN SCRIPT
% MATLAB codes for Finite Element Analysis
% problem1.m
% antonio ferreira 2008
% clear memory
clear all
% elementNodes: connections at elements
elementNodes=[1 2;2 3;2 4];
% numberElements: number of Elements
numberElements=size(elementNodes,1);
% numberNodes: number of nodes
numberNodes=4;
% for structure:
% displacements: displacement vector
% force : force vector
% stiffness: stiffness matrix
displacements=zeros(numberNodes,1);
force=zeros(numberNodes,1);
stiffness=zeros(numberNodes);
% applied load at node 2
force(2)=14.0;
% computation of the system stiffness matrix
for e=1:numberElements;
% elementDof: element degrees of freedom (Dof)
elementDof=elementNodes(e,:) ;
stiffness(elementDof,elementDof)=...
stiffness(elementDof,elementDof)+[1 -1;-1 1];
end
% boundary conditions and solution
% prescribed dofs
prescribedDof=[1;3;4];
% free Dof : activeDof
activeDof=setdiff([1:numberNodes]',[prescribedDof]);
% solution
displacements=stiffness(activeDof,activeDof)\force(activeDof);
% positioning all displacements
displacements1=zeros(numberNodes,1);
displacements1(activeDof)=displacements;
% output displacements/reactions
outputDisplacementsReactions(displacements1,stiffness,...
numberNodes,prescribedDof)

COMPILACION APLICANDO UN FUNCTION


function outputDisplacementsReactions...
(displacements,stiffness,GDof,prescribedDof)
% output of displacements and reactions in
% tabular form
% GDof: total number of degrees of freedom of
% the problem
% displacements
disp('Displacements')
%displacements=displacements1;
jj=1:GDof; format
[jj' displacements]
% reactions
F=stiffness*displacements;
reactions=F(prescribedDof);
disp('reactions')
[prescribedDof reactions]

Compilando el algoritmo de Matlab se obtiene los siguientes resultados:


 Utilized un SCRIPT para la codification

 Necesariamente añadir un Function para la compilacion.


RESULTADOS:

>> problem1
Displacements

ans =

1.0000 0
2.0000 4.6667
3.0000 0
4.0000 0

reactions

ans =

1.0000 -4.6667
3.0000 -4.6667
4.0000 -4.6667
 EXPLICACION DEL CODIGO GENERADO.

Discutimos algunos de los pasos de programación. El espacio de trabajo es eliminado por


limpiar todo
En elementNodes de la matriz definimos las conexiones (nodos izquierdo y derecho) en cada
elemento,
elementNodes = [1 2; 2 3; 2 4];
En la primera línea de esta matriz colocamos 1 y 2 correspondientes a los nodos 1 y 2,
y proceder a las otras líneas de una manera similar. Al usar la función MATLAB
tamaño, que devuelve el número de líneas y columnas de una matriz rectangular,
puede detectar el número de elementos mediante la inspección del número de líneas de la matriz
elementNodes.
% numberElements: número de elementos
numberElements = size (elementNodes, 1);
Tenga en cuenta que en este problema, la cantidad de nodos es 4,
% numberNodes: número de nodos
numberNodes = 4;
En este problema, el número de nodos es el mismo que el número de grados de
libertad (que no es el caso en muchos otros ejemplos). Porque la rigidez
la matriz es el resultado de un proceso de ensamblaje, que implica la suma de las contribuciones,
es importante inicializarlo Además, es una buena práctica de programación hacerlo en
MATLAB, para aumentar la velocidad de los bucles for.
Usando los ceros de la función MATLAB, inicializamos el desplazamiento del vector de
desplazamiento global,
la fuerza del vector de fuerza global y la rigidez de la matriz de rigidez global,
respectivamente.
% para la estructura:
% de desplazamientos: vector de desplazamiento
% de fuerza: vector de fuerza
% de rigidez: matriz de rigidez
desplazamientos = ceros (numberNodes, 1);
force = ceros (numberNodes, 1);
rigidez = ceros (numberNodes);
Ahora colocamos la fuerza aplicada en el grado de libertad correspondiente:
% de carga aplicada en el nodo 2
fuerza (2) = 10.0;
Calculamos ahora la matriz de rigidez para cada elemento a su vez y luego montamos
en la matriz de rigidez global.
% de cálculo de la matriz de rigidez del sistema
para e = 1: numberElements;
% elementDof: grados de libertad del elemento (Dof)
elementDof = elementNodes (e, :);
rigidez (elementDof, elementDof) = ...
rigidez (elementoDof, elementoDof) + [1 -1; -1 1];
fin
En la primera línea del ciclo, inspeccionamos los grados de libertad en cada elemento,
en un elemento vectorialDof. Por ejemplo, para el elemento 1, elementDof = [1,2], para
elemento 2, elementDof = [2 3] y así sucesivamente.
% elementDof: grados de libertad del elemento (Dof)
elementDof = elementNodes (e, :);
Luego indicamos que la matriz de rigidez para cada elemento es constante y luego
realizar el proceso de ensamblaje "extendiendo" esta matriz de 2 × 2 en el correspondiente
líneas y columnas definidas por elementDof,
rigidez (elementDof, elementDof) = ...
rigidez (elementoDof, elementoDof) + [1 -1; -1 1];
La rigidez de la línea (elementoDof, elementoDof) + [1 -1; -1 1]; del código puede ser
interpretado como
rigidez ([1 2], [1 2]) = rigidez ([1 2], [1 2]) + [1 -1; -1 1];
para el elemento 1,
rigidez ([2 3], [2 3]) = rigidez ([2 3], [2 3]) + [1 -1; -1 1];
para el elemento 2, y
rigidez ([2 4], [2 4]) = rigidez ([2 4], [2 4]) + [1 -1; -1 1];
para el elemento 3. Este tipo de codificación permite un montaje rápido y compacto.
Este sistema global de ecuaciones no puede resolverse en esta etapa. Necesitamos que
imponer condiciones de frontera esenciales antes de resolver el sistema Ka = f. Las líneas
y columnas de los grados de libertad prescritos, así como las líneas de la fuerza
el vector será eliminado en esta etapa.

Primero definimos el vector prescritoDof, correspondiente a los grados prescritos de libertad. Luego
definimos un vector que contiene todos los grados activos de libertad, estableciendo la diferencia
entre todos los grados de libertad y la prescrita unos. La función de MATLAB setdiff permite esta
operación. % de condiciones de contorno y solución % de dofs prescritos prescribedDof = [1; 3; 4];
% Dof libre: activeDof activeDof = setdiff ([1: numberNodes] ', [prescribedDof]); % de solución
desplazamientos = rigidez (activeDof, activeDof) \ force (activeDof); Tenga en cuenta que la solución
se realiza solo con las líneas y columnas activas, por usando una máscara. desplazamientos = rigidez
(activeDof, activeDof) \ force (activeDof); Porque de hecho estamos calculando la solución para los
grados activos de libertad solamente, podemos colocar esta solución en un vector displacements1 que
contiene también el valores prescritos (cero). % de posicionamiento de todos los desplazamientos
displacements1 = ceros (numberNodes, 1); desplazamientos1 (activeDof) = desplazamientos; El
vector displaments1 es entonces un vector de cuatro posiciones con todos los desplazamientos. Luego
llamamos a la función outputDisplacementsReactions.m, a los desplazamientos de salida y
reacciones, como la funtion prescrita.

Las reacciones se calculan evaluando el vector de fuerza total como F = K.U. Porque
solo necesitamos reacciones (fuerzas a grados de libertad prescritos), entonces usamos
% de reacciones
F = rigidez * desplazamientos;
reacciones = F (prescritoDof);
Al ejecutar este código obtenemos información detallada sobre matrices o resultados,
dependiendo de las necesidades del usuario, por ejemplo, desplazamientos y reacciones:
PROBLEMA 2
Solucione el problema de barra ilustrado en la figura 2, en cuyo módulo de elasticidad es
E=30x106, y el área de la sección transversal es A=2,
Código uní: 20150204E.

Carga :(3000+04) N=3004N

3004 N

Figura 2 Barra unidimensional

SOLUCIÓN:
Dibujando el D.C.L. de la barra, donde se observa las reacciones y desplazamientos de
los nudos.

3004 N

Figura 2. D.C.L. de la barra unidimensional


Se implementa un script en Matlab para determinar las reacciones y desplazamientos de
los nudos.
% problema2.m
clear all
% E: módulo de elasticidad
% A: área de la sección transversal
% L: longitud de la barra
E = 30e6; A=2; EA=E*A; L = 90;
% generación de coordenadas y las conectividades
% numberElements: Número de elementos
numberElements=3;
% generación de coordenadas espaciadas
nodeCoordinates=linspace(0,L,numberElements+1);
xx=nodeCoordinates;

% numberNodes: Número de nodos


numberNodes=size(nodeCoordinates,2);
% elementNodes: Conexiones en los elementos
ii=1:numberElements;
elementNodes(:,1)=ii;
elementNodes(:,2)=ii+1;
% Para la estructura:
% displacements: Vector de desplazamiento
% force: Vector fuerza
% stiffness: Matriz de rigidez
displacements=zeros(numberNodes,1);
force=zeros(numberNodes,1);
stiffness=zeros(numberNodes,numberNodes);
% Carga aplicada en el nodo 2
force(2)=3004;
% Cálculo de la matriz de rigidez del sistema
for e=1:numberElements;
% elementDof: Grados de libertad
elementDof=elementNodes(e,:);
nn=length(elementDof);
length_element=nodeCoordinates(elementDof(2))-
nodeCoordinates(elementDof(1));
detJacobian=length_element/2;
invJacobian=1/detJacobian;
% Punto central (xi=0; W=2)
[shape,naturalDerivatives]=shapeFunctionL2(0.0);
Xderivatives=naturalDerivatives*invJacobian;
% Matriz B
B=zeros(1,nn); B(1:nn) = Xderivatives(:);
stiffness(elementDof,elementDof)=stiffness(elementDof,elementDof)+B'*B*2*
detJacobian*EA;
end
% Condiciones límite
fixedDof=find(xx==min(nodeCoordinates(:))| xx==max(nodeCoordinates(:)));
prescribedDof=[fixedDof];
activeDof=setdiff([1:numberNodes],[prescribedDof]);
% Solución
GDof=numberNodes;
displacements=solution(GDof,prescribedDof,stiffness,force);
% Reacciones y desplazamientos
outputDisplacementsReactions(displacements,stiffness,numberNodes,prescrib
edDof)

Con la ayuda de 3 funciones para que determinar los desplazamientos y reacciones.


function [shape,naturalDerivatives]=shapeFunctionL2(xi)
% shape: Función de forma y derivados para elementos L2
% naturalDerivatives: Derivados w.r.t. xi
% xi: Coordenadas naturales
shape=([1-xi,1+xi]/2);
naturalDerivatives=[-1;1]/2;
end

function displacements=solution(GDof,prescribedDof,stiffness,force)
% Función para encontrar solución en términos de desplazamientos globales
activeDof=setdiff([1:GDof],[prescribedDof]);
U=stiffness(activeDof,activeDof)\force(activeDof);
displacements=zeros(GDof,1);
displacements(activeDof)=U;

function
outputDisplacementsReactions(displacements,stiffness,GDof,prescribedDof)
% Salida de las reacciones
% GDof: Número de grados de libertad del problema
% Se muestran los desplazamientos
disp('Displacements')
jj=1:GDof; format
[jj' displacements]
% Se muestran las reacciones
F=stiffness*displacements;
reactions=F(prescribedDof);
disp('reactions')
[prescribedDof' reactions]

Compilando el algoritmo de Matlab se obtiene los siguientes resultados:


Ejecución para el SCRIPT

Apoyos necesarios en los Functions.

 outputDisplacementsReactions(displacements,stiffness,GDof,prescribe
dDof)

 function [shape,naturalDerivatives]=shapeFunctionL2(xi)
 function displacements=solution(GDof,prescribedDof,stiffness,force)
 Solución final para mi paso de P=3004N

Se observa lo siguiente:
>> problem2
Displacements

ans =

1.0000 0
2.0000 0.0010
3.0000 0.0005
4.0000 0

reactions

ans =

1.0e+03 *

0.0010 -2.0027
0.0040 -1.0013