Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Práctica Calificada 02
Curso: Cálculo por Elementos Finitos
Sección: E
i
Índice de figuras
ii
Índice de cuadros
iii
Nomenclature
iv
R absoluto Reacción en el Apoyo calculada a partir de la Primera Condición del Equilibrio
R numérico Reacción en el Apoyo mediante el Método Numérico del Informe
t Espesor de la Placa Triangular
v
Capı́tulo 1
Dado la siguiente placa triangular, cuyo espesor es constante,calcular los esfuerzos en cada
uno de los elementos finitos; y la reacción en el apoyo.
PA = 20 kN
t = 150 mm
α = 11 × 10−6 (C ◦ )−1
∆ T = 110 C ◦
1
1.1. Actividades
De acuerdo a lo trabajado en el aula, escribir un código en MATLAB que pueda realizar las
siguientes funciones:
2. Usar el comando de bucle for para el ensamble de la Matriz de Rigidez Global; mediante
el criterio de los grados de libertad de las matrices locales.
3. Realizar una gráfica del error cometido por cada iteración del método al calcular el valor
de la reacción en el apoyo; con respecto al número de elementos en cada iteración.
2
Capı́tulo 2
El método de cálculo por elementos finitos que se emplea para la redacción de este código es
el mismo que se utiliza para la resolución del problema mencionado en la presentación número [1].
Dado que el código tiene como propósito ser ejecutado con la mayor facilidad posible, en el
inicio del código se redactan las siguientes instrucciones; mediante las cuales se eliminan las va-
riables almacenadas en el Espacio de Trabajo de MATLAB, se limpia el contenido de la Ventana
de Comandos, y se cierran todas las gráficas abiertas por MATLAB.
Las instrucciones también cambian el formato numérico de MATLAB al formato long, tal y
como se muestra a continuación:
clc;
close all;
format long;;
La siguiente sección del código está destinada a almacenar los datos de las condiciones iniciales
que da el problema en variables, empleando una notación lo más similar posible a la que se usó en
la redacción de este informe. En forma de comentarios, se lista junto a cada variable su respectivo
nombre, junto a las unidades del Sistema Internacional en las que se encuentran expresadas:
P = 20000; % En Newtons
t = 150; % En milı́metros
E = 300000; % En N/mm^2
Y = 78.45 / 1000000; % En N/mm^3
L = 1200; % Longitud. En milı́metros
B = 1500; % Base. En milı́metros
a = 11/1000000;
dT = 110; % Incremento temperatura. En °C.
En la tabla número 2.1 se muestra una comparación entre las variables presentes en la sección
del código y las variables presentes en el informe:
3
Cuadro 2.1: Tabla de Variables usadas en el Código y el Informe
Luego de eso, el código de MATLAB solicita al usuario el número de elementos con los cuales
ejecutar el método descrito en la fuente [1], y almacena este valor en una variable. Esta sección
del código define un vector vertical de elementos nulos como el vector que contendrá los valores
de las longitudes de las bases de los elementos rectangulares; de tal manera que este vector se
denomina “b”.
El código también define un vector, denominado “l”, en el que se almacenan las longitudes
de las alturas de los elementos rectangulares. Si el número de elementos es par, todas las alturas
tienen la misma longitud.
Por el contrario, si el número de elementos es impar, la estructura condicional if toma los valores
correspondientes a las alturas del elemento central y el elemento consecutivo a este elemento; y
los modifica de tal manera que la longitud del elemento central se reduce en un 50 %, mientras
que la longitud del elemento consecutivo aumenta en un 50 %.
Esta modificación de las alturas de los elementos tiene como propósito garantizar que el nodo
inferior del elemento central se encuentre en el punto medio de la altura de la placa triangular;
ya que en ese nodo actúa la fuerza externa. Esta sección del código se muestra a continuación:
fprintf(’ \n’);
n = input(’ Introduzca el número de elementos: ’); % Número de elementos
l = ones(n,1) .* L/n; % Longitudes de los elementos, en milı́metros
b = zeros(n,1); % Bases de los elementos, en milı́metros
if mod(n,2) == 1
l((n + 1)/2) = L/(2 .* n);
l((n + 3)/2) = (3 .* L)/(2 .* n);
end
Por otra parte, es posible trazar segmentos paralelos a la base del triángulo; de tal manera que
4
estos segmentos pasen cada uno por los nodos de los ementos ubicados en el interior de la placa
triangular. De esta manera, la placa triangular estará dividida en trapecios y en un triángulo
ubicado en la placa inferior de la placa; de tal manera que la altura de la figura número “i” mide
lo mismo que la altura del elemento número “i”.
En ese sentido, es posible formar triángulos semejantes uniendo el triángulo inferior con los
trapecios que se ubican por encima de su base; con lo cual se puede formar un número de
triángulos igual al número de elementos delimitados por el método.
Si se cuentan los triángulos desde arriba hacia abajo - tal y como lo hace el código de MATLAB
con los elementos delimitados -, se puede usar el Teorema de la Semejanza de Triángulos para
establecer la siguiente relación:
Xn
! n i−1
! i−1
!
Bi 1 1 X X 1 X
= lk = lk − lk = L− lk
B L k=i
L k=1 k=1
L k=1
i−1
!
B X
∀ 1 ≤ i ≤ n =⇒ Bi = L− lk (2.1)
L k=1
De acuerdo al método descrito en la fuente número [1], el elemento número “i” se encuentra
entre las bases de los triángulos número “i” y número “i + 1”; por lo que la medida de de la base
del elemento número “i” puede ser calculada de acuerdo al método mediante la fórmula número
2.2:
" i−1
! i−1+1
!#
Bi + Bi+1 1 B X B X
bi = = L− lk + L− lk
2 2 L k=1
L k=1
i−1 i
!
1 B X X
=⇒ bi = L− lk + L − lk
2 L k=1 k=1
i−1 i−1
!
B X X
=⇒ bi = 2L − lk − lk − li
2L k=1 k=1
" i−1
! #
B X
∀ 1 ≤ i ≤ n =⇒ bi = 2 L− lk − li (2.2)
2L k=1
Para que la fórmula número 2.2 sea congruente, el valor de la variable “l0 ” es un valor nulo.
El problema es que el vector que almacena los valores de las alturas de los elementos no puede
reconocer la presencia de un elemento número 0; por lo que es necesario hacer uso de una fórmula
independiente para calcular la medida de la base del elemento número 1.
Por este motivo, para calcular la medida de la base del elemento número 1, es necesario ha-
cer que el valor de la sumatoria en la fórmula número 2.2 sea nulo. La sección de código que
tiene la función de almacenar las medidas de las bases de los elementos en el vector nulo previa-
mente definido hace uso de un bucle “for” para esta tarea, usando una lı́nea de código adicional
antes del bucle para calcular la medida de la base del elemento número 1:
5
b(1) = (B/2) .* (1 + (L - l(1))/L);
s = L; % Variable auxiliar
for i = 2:n
b(i) = B .* (2 .* (s - l(i - 1)) - l(i))/(2 .* L);
s = s - l(i - 1);
end
El código tiene que calcular el valor de cada una de las áreas transversales de los elementos
en los que se particionó la placa triangular, luego debe de almacenar estos valores en un vector
columna; también debe calcular los pesos de cada uno de los elementos particionados, y almace-
nar estos valores en otro vector columna.
De acuerdo a la fuente número [1], los valores del área transversal y el peso de cada uno de
los elementos se pueden calcular haciendo uso de las fórmulas número 2.3 y número 2.4, respec-
tivamente:
Además de definir estos dos vectores columna, la sección de código mostrada también define
dos vectores columna nulos; los cuales se usan para almacenar los valores de las fuerzas que
actúan en los nodos delimitados por los elementos y los valores de las fuerzas térmicas que
actúan sobre estos nodos. Debido que un número “n” de elementos delimita un número ”n + 1”
de nodos, estos dos vectores columna tienen “n + 1” filas; como se muestra a continuación:
Para hallar el valor de los elementos del vector columna que almacena los valores de las
fuerzas térmicas que actúan sobre los nodos, primero se deben de calcular los valores de las
cargas equivalentes que genera la deformación térmica de cada uno de los elementos; para lo cual
se hace uso de la fórmula número 2.5, tal y como lo indica la fuente número [1]:
6
∀ 1 ≤ i ≤ n + 1 =⇒ Ti = (Ai−1 − Ai ) (E) (α) (∆ T ) (2.6)
Hay que tener en cuenta que, con la fórmula número 2.6 sucede el mismo inconveniente que
sucede en la fórmula número 2.2: el vector que almacena los valores de las áreas transversales no
tiene un valor para un elemento número 0, o para un elemento número “n + 1”; por lo que, para
calcular los valores número 1 y número “n + 1” del vector vertical, es necesario hacer que estos
dos valores sean nulos.
Por este motivo, en la sección del código que determina los valores de las fuerzas térmicas que
actúan sobre los nodos, se hace uso de un bucle for que aplica la fórmula número 2.6 para todos
los elementos del vector vertical; excepto para los elementos número 1 y número “n + 1” del vec-
tor, para los cuales se usan dos lı́neas de código fuera del bucle, como se muestra a continuación:
Para el caso del vector columna que contiene los valores de las fuerzas, se hace uso de un
proceso similar al que se hizo previamente. De acuerdo a lo que se menciona en la fuente número
[1], es posible realizar un cálculo preliminar para hallar el valor de la fuerza que actúa sobre cada
uno de los nodos; para lo cual se tiene que hacer uso de la fórmula número 2.7:
Wi−1 Wi Wi−1 + Wi
∀ 1 ≤ i ≤ n + 1 =⇒ Fi = + + Ti = + Ti (2.7)
2 2 2
Hay que tener en cuenta que la fórmula número 2.7 no aplica para hallar el valor de la fuerza
que actúa sobre el nodo número 1. Sin embargo, la expresión que permite hallar el valor de la
fuerza que actúa sobre el nodo número 1 es la fórmula número 2.8:
W1
F1 = + R numérico + T1 (2.8)
2
Debido que el valor de la reacción en el apoyo obtenido mediante el método numérico de
la fuente número [1] no es conocido, el valor de la fuerza que actúa sobre el nodo número 1 es
desconocido; y por ese motivo la sección de código encargada de asignar los valores a las fuerzas
que actúan sobre los nodos no calcula el valor de la fuerza en este nodo.
Por otra parte, para calcular el valor de la fuerza que actúa en el nodo número “n + 1”, se debe
tener en cuenta que el vector que almacena los pesos de los elementos no tiene un valor número
“n + 1”; por lo que, para que la fórmula número 2.7 sea consistente con el valor de la fuerza que
actúa en el nodo número “n+1”, el valor del peso del elemento número “n+1” tiene que ser nulo.
La sección del código encargada de calcular los valores de las fuerzas que actúan en los no-
dos hace uso de un bucle for para asignar los valores de estas fuerzas para cada uno de los nodos,
empezando a partir del nodo número 2; debido al motivo expuesto en el anterior párrafo, y tiene
una lı́nea de código adicional para calcular el valor de la fuerza que actúa en el nodo número
“n + 1”.
7
Esta sección de código también cuenta con una estructura condicional if que permite identi-
ficar la posición del nodo sobre el cual actúa la fuerza external, dependiendo de si el número
de elementos en los cuales fue particionada la placa triangular es par o impar; y que suma al
valor de la fuerza que actúa sobre ese nodo el valor de la fuerza externa, tal y como se muestra
a continuación:
for i = 2:n
F(i) = (W(i - 1) + W(i))/2 + T(i);
end
F(n + 1) = W(n)/2 + T(n + 1);
if mod(n,2) == 1
F((n + 3)/2) = F((n + 3)/2) + P;
else
F(n/2 + 1) = F(n/2 + 1) + P;
end
El método numérico empleado en este informe se sustenta en el hecho que la placa triangular
se deforma siguiendo un comportamiento elástico; por lo que es posible calcular la constante
elástica asociada a cada uno de los elementos en los que está particionada, para lo cual se puede
hacer uso de la fórmula número 2.9:
(E) (Ai )
∀ 1 ≤ i ≤ n =⇒ ki = (2.9)
li
De manera similar a la manera en la que se definieron los vectores columna que contienen los
valores de las áreas transversales y los pesos de los elementos que conforman la placa triangular,
se puede hacer uso de los operadores de producto matricial “.* ” y de división matricial “./ ”
para calcular los valores de las constantes elásticas de todos los elementos; y almacenarlas en un
vector columna.
La sección de código en la que se define el vector columna que contiene los valores de las cons-
tantes elásticas de los elementos que conforman a la placa triangular también define un vector
columna, de elementos nulos, que almacenará los valores de los desplazamientos de los nodos
de la placa triangular; y una matriz cuadarada de elementos nulos, la cual será la “Matriz de
Rigidez”.
La Matriz de Rigidez es definida en la fuente número [1] como una matriz cuadrada com-
puesta por submatrices cuadradas de orden 2 × 2, las cuales están asocidadas cada una a uno de
los elementos en los que se particiona la placa triangular. Estas matrices están dispuestas a lo
largo de la diagonal principal de la Matriz de Rigidez.
Mediante esta división de la Matriz de Rigidez en submatrices, es posible calcular los valores
de los elementos de la Matriz de Rigidez contenidos en su diagonal y cercanos a ella; tal y como
lo establece la fórmula número 2.10. El resto de los elementos de la Matriz de Rigidez son nulos.
K (i) (i) K (i) (i+1) ki−1 + ki − ki
∀ 1 ≤ i ≤ n =⇒ = (2.10)
K (i+1) (i) K (i+1) (i+1) − ki ki + ki+1
8
Debido que el vector columna que contiene a los valores de las constantes de elasticidad de
los elementos no contiene una constante número 0 o una constante número “n + 1”, para que la
fórmula número 2.10 sea concordante con el método numérico de la fuente número [1], los valores
de estos dos elementos en la fórmula deben de ser nulos.
Debido que, al denotar a la Matriz de Rigidez en el código de MATLAB, todos sus elemen-
tos son nulos, la sección de código que calcula los valores de los elementos de esta matriz no
necesita evaluar todos los elemetos de la matriz; sino solamente aquellos que pertenecen a la
diagonal de la matriz, o que son vecinos con los elementos de la diagonal de la matriz.
Para evaluar a estos elementos de la Matriz de Rigidez, la sección de código hace uso de un
bucle for que toma cada uno de los valores de las constantes de elasticidad de los elementos
que conforman la placa triangular; y los va sumando con respecto a las distintas submatrices de
orden 2 × 2; las cuales se encuentran alineadas a lo largo de la diagonal de la Matriz de Rigidez,
como se muestra a continuación:
for i = 1:n
K(i,i) = K(i,i) + k(i);
K(i,i + 1) = K(i,i + 1) - k(i);
K(i + 1,i) = K(i + 1,i) - k(i);
K(i + 1, i + 1) = K(i + 1, i + 1) + k(i);
end
1 ≤ j ≤ n+1
9
Se puede apreciar en la fórmula número 2.12 que, para todo valor del número “i”, cuando el
número “j” vale 1, el producto del argumento de la sumatoria es nulo; debido a que el desplaza-
miento del primer nodo de la placa triangular es nulo. Entonces, se pude reformular la expresión
número 2.12; tal y como se muestra:
X X
(K (i) (j) ) (Qj ) = (K (i) (j) ) (Qj ) = Fi
2 ≤ i ≤ n+1 2 ≤ i ≤ n+1
1 ≤ j ≤ n+1 2 ≤ j ≤ n+1
−1
Q2 K22 K23 0 N/mm ... 0 N/mm F2
Q3 K32 K33 K34 ... 0 N/mm F3
Q4 0 N/mm K43 K44 ... 0 N/mm F4
=
.. .. .. .. .. .. ..
. . . . . . .
Qn+1 0 N/mm 0 N/mm 0 N/mm . . . K (n+1) (n+1) Fn+1
(2.13)
Una vez calculado el valor numérico de todos los desplazamientos de los nodos de la placa
triangular mediante la fórmula número 2.13, la sección de código hace uso de la fórmula número
2.11 para determinar el valor de la fuerza que actúa en el nodo número 1; tal y como se muestra
a continuación:
Mediante una modificación de la fórmula número 2.8 se puede calcular el valor de la reacción
en el apoyo obtenido mediante el método numérico descrito en la fuente número [1]; tal y como
se muestra en la fórmula número 2.14:
W1
R numérico = F1 − − T1 (2.14)
2
En la fuente número [1] se proporciona una igualdad vectorial para calcular los valores de los
esfuerzos de tracción a los que se encuentran sometidos cada uno de los elementos en los que fue
particionada la placa triangular; de tal manera que esta fórmula serı́a la fórmula número 2.15:
E Qi
∀ 1 ≤ i ≤ n =⇒ ei = −1 1 − (E) (α) (∆ T ) (2.15)
li Qi+1
La sección de código encargada de definir el vector columna que contiene los valores de los
esfuerzos de tracción que afectan a los elementos que componen a la placa triangular denota un
10
vector columna cuyos elementos son iguales a la expresión “(E) (α) (∆ T )”, y luego hace uso de
un bucle for para aplicar la fórmula número 2.15 en todos los elementos de este vector; tal y
como se muestra a continuación:
for i = 1:n
e(i) = (E/l(i)) * [-1, 1] * Q(i : i + 1) - e(i);
end
Para calcular el error absoluto producido pro el código de MATLAB al calcular el valor de la
reacción en el apoyo, se hace uso de la fórmula número 1.1; para lo cual se debe tener en cuenta
que, según la primera condición del equilibrio, el valor de la reacción en el apoyo se calcula de
acuerdo a la fórmula número 2.16:
|e absoluto | |e absoluto |
e relativo = = (2.18)
R absoluto (γ) (B) (L) (t)
PA +
2
La sección de código de MATLAB define un vector columna de dos elementos, de tal manera
que uno de estos dos elementos es el error absoluto producido por el método numérico referido en
la fuente número [1]; mientras que el otro elemento es el error relativo generado pos este método
numérico, tal y como se muestra a continuación:
11
disp(’ ’)
disp(’ Vector Desplazamiento (mm): ’)
disp(’ *---------------------------------* ’)
disp(Q);
disp(’ Vector Esfuerzo (N/mm^2): ’)
disp(’ *---------------------------------* ’)
disp(e);
disp(’ Reacción en el Apoyo (N): ’)
disp(’*---------------------------------* ’)
disp(R);
disp(’ Error Absoluto del Modelo (N):’)
disp(’ *---------------------------------* ’)
disp(Err(1));
disp(’ Error Relativo del Modelo: ’)
disp(’ *---------------------------------* ’)
disp(Err(2));
clc;
close all;
format long;
P = 20000; % En Newtons
t = 150; % En milı́metros
E = 300000; % En N/mm^2
Y = 78.45 / 1000000; % En N/mm^3
L = 1200; % Longitud. En milı́metros
B = 1500; % Base. En milı́metros
a = 11/1000000;
dT = 110; % Incremento temperatura. En °C.
fprintf(’ \n’);
n = input(’ Introduzca el número de elementos: ’); % Número de elementos
l = ones(n,1) .* L/n; % Longitudes de los elementos, en milı́metros
b = zeros(n,1); % Bases de los elementos, en milı́metros
if mod(n,2) == 1
l((n + 1)/2) = L/(2 .* n);
l((n + 3)/2) = (3 .* L)/(2 .* n);
end
12
s = s - l(i - 1);
end
for i = 2:n
F(i) = (W(i - 1) + W(i))/2 + T(i);
end
F(n + 1) = W(n)/2 + T(n + 1);
if mod(n,2) == 1
F((n + 3)/2) = F((n + 3)/2) + P;
else
F(n/2 + 1) = F(n/2 + 1) + P;
end
for i = 1:n
K(i,i) = K(i,i) + k(i);
K(i,i + 1) = K(i,i + 1) - k(i);
K(i + 1,i) = K(i + 1,i) - k(i);
K(i + 1, i + 1) = K(i + 1, i + 1) + k(i);
end
for i = 1:n
e(i) = (E/l(i)) * [-1, 1] * Q(i : i + 1) - e(i);
end
disp(’ ’)
disp(’ Vector Desplazamiento (mm): ’)
disp(’ *---------------------------------* ’)
13
disp(Q);
disp(’ Vector Esfuerzo (N/mm^2): ’)
disp(’ *---------------------------------* ’)
disp(e);
disp(’ Reacción en el Apoyo (N): ’)
disp(’*---------------------------------* ’)
disp(R);
disp(’ Error Absoluto del Modelo (N):’)
disp(’ *---------------------------------* ’)
disp(Err(1));
disp(’ Error Relativo del Modelo: ’)
disp(’ *---------------------------------* ’)
disp(Err(2));
El código de MATLAB correspondiente a esta sección del informe comienza de manera similar
a como comienza el código descrito en la sección 2.1, redactando las instrucciones que permiten
borrar los contenidos de la ventana de comandos, el espacio de trabajo y cerrar todas las ventanas
abiertas; con el fin de ahorrar memoria, además de cambiar el formato de escritura de MATLAB
a un formato long.
clc;
close all;
format long;
La sección de código también contiene una definición de las mismas variables elementales
vistas en la tabla número 2.1, las cuales denotan los mismos conceptos y tienen los mismos valores
numéricos que en la sección número 2.1. Esta sección del código se muestra a continuación:
P = 20000; % En Newtons
t = 150; % En milı́metros
E = 300000; % En N/mm^2
Y = 78.45 / 1000000; % En N/mm^3
L = 1200; % Longitud. En milı́metros
B = 1500; % Base. En milı́metros
a = 11/1000000;
dT = 110; % Incremento temperatura. En °C.
El código de MATLAB referido en esta sección del informe solicita al usuario introducir a
través de la ventana de comandos el número de iteraciones del método numérico referido en la
fuente número [1] que se debe evaluar; de tal manera que este valor es almacenado en la variable
“N”, tal y como se muestra a continuación:
fprintf(’ \n’);
N = input(’ Introduzca el número de procesos: ’); % Número de procesos
Err = zeros(N,2); % Valores obtenidos de los errores
Es = zeros(N,4); % Matriz de esfuerzos notables, en N/mm^2
D = zeros(N,2); % Matriz de desplazamientos máximos de nodos, en milı́metros
R = zeros(N,1); % Matriz de valores de la Reacción, en Newton
14
Una diferencia entre el código de MATLAB de esta sección del informe y el código de la
sección número 2.1 es que algunas de las variables del código de la sección número 2.1 fueron
redefinidas como variables matriciales o vectoriales; tal y como se aprecia en el cuadro número
2.2:
Cuadro 2.2: Comparación de Variables del Código número 2.1 y el Código número 2.3
Variable del Código 2.1 Variable del Código 2.3 Interpretación de la Variable
Para la elaboración del código de MATLAB visto en esta sección, el código evaluado en la
sección número 2.1 fue colocado dentro de un bucle for, cuyo contador es la variable “n”; la
cual representa el número de elementos en los que es particionada la placa triangular en cada
iteración del método numérico.
Por ese motivo, el valor inicial del contador es igual a 2; mientras que su valor final es igual
a “N + 1”. Esto se debe a que el número de elementos en cada iteración del método numérico
empleado en este informe se incrementa de uno en uno, hasta completar el número de iteraciones
requerido. Por este motivo, la iteración número “i” del método numérico hace uso de “i + 1”
elementos; como se muestra a continuación:
for n = 2:N + 1
l = ones(n,1) .* L/n; % Longitudes de los elementos, en milı́metros
b = zeros(n,1); % Bases de los elementos, en milı́metros
if mod(n,2) == 1
l((n + 1)/2) = L/(2 .* n);
l((n + 3)/2) = (3 .* L)/(2 .* n);
end
15
for i = 2:n
b(i) = B .* (2 .* (s - l(i - 1)) - l(i))/(2 .* L);
s = s - l(i - 1);
end
for i = 2:n
F(i) = (W(i - 1) + W(i))/2 + T(i);
end
F(n + 1) = W(n)/2 + T(n + 1);
if mod(n,2) == 1
F((n + 3)/2) = F((n + 3)/2) + P;
else
F(n/2 + 1) = F(n/2 + 1) + P;
end
for i = 1:n
K(i,i) = K(i,i) + k(i);
K(i,i + 1) = K(i,i + 1) - k(i);
K(i + 1,i) = K(i + 1,i) - k(i);
K(i + 1, i + 1) = K(i + 1, i + 1) + k(i);
end
for i = 1:n
e(i) = (E/l(i)) * [-1, 1] * Q(i : i + 1) - e(i);
end
16
[D(n - 1,1), D(n - 1,2)] = max(Q);
end
Se puede notar que, en la sección de código mostrada, las variables presentes en el cuadro
número 2.2 han reemplazado a las correspondientes variables que se encuentran en el código
que se muestra en la sección número 2.1. En estas variables, el número de la fila en la que se
almacenan los datos correspondientes a la iteración número “n” del método numérico es igual a
“n − 1”; en base a la relación entre el número de iteración y el número de elementos.
También se puede notar que, en el final del bucle for hay una sección de código que no se
encuentra en el código evaluado en la sección número 2.1 del informe, en la cual se introducen
los datos en las matrices que contienen los valores de los esfuerzos máximo y mı́nimo de cada
iteración del método numérico; y los valores del máximo desplazamiento nodal en cada iteración.
En la matriz que almacena los valores de los esfuerzos, en la columna número 1 se almace-
nan los valores del máximo esfuerzo de cada iteración; y en la columna número 2 se almacenan
los valores del número del elemento que es afectado por este máximo esfuerzo en cada iteración.
En la columna número 3 se almacenan los valores del mı́nimo esfuerzo de cada iteración; y en
la columna número 4 se almacenan los valores del número del elemento que es afectado por este
mı́nimo esfuerzo en cada iteración.
De manera similar, en la matriz que almacena los valores de los máximos desplazamientos no-
dales, en la columna número uno se alacenan los valores del máximo desplazamiento nodal de
cada iteración del método numérico; mientras que en la columna número 2 se almacenan los
valores del número del nodo que tuvo este máximo desplazamiento en cada iteración, tal y como
se muestra a continuación:
En la sección de código fuera del bucle for se define una matriz de orden 6 × 7 la cual tiene
la función de almacenar los siguientes datos estadı́sticos sobre las variables que se muestran en
la tabla número 2.2:
v
u " N #
u 1 X
σx = t (xk − µx )2 (2.19)
N k=1
17
N
X !
1
µx = xk (2.20)
N k=1
σx
CVx = (2.21)
µx
V1 = zeros(1,7);
V1(1,1) = std(V2(:,i)); % Desviación estándar de los valores del vector
V1(1,2) = mean(V2(:,i)); % Media aritmética de los valores del vector
V1(1,3) = V1(1,1) / V1(1,2); % Coeficiente de Varianza de los valores del Vector
[V1(1,4),V1(1,5)] = max(abs(V2(:,i))); % Máximo valor absoluto del vector
V1(1,4) = V2(V1(1,5),i);
[V1(1,6),V1(1,7)] = min(abs(V2(:,i))); % Mı́nimo valor absoluto del vector
V1(1,6) = V2(V1(1,7),i);
end
18
2. Error relativo del método numérico
Hay que tener en cuenta que el código de MATLAB debe de escribir los resultados estadı́sti-
cos de las variables matriciales analizadas en la tabla número 2.2. Para ello, se hace uso de dos
funciones que tienen la capacidad de escribir datos.
La primera de estas funciones solicita al usuario escribir dos cadenas de texto - una de las
cuales depende de cuál es la variable que se va a analizar, y la otra que depende de las unidades
en las que se mide la variable -, y además de eso solicita al usuario introducir un vector fila; el cual
corresponde a una de las filas de la matriz de 6×7, dependiendo de qué variable se quiera analizar.
En base a estos datos introducidos, la función escribe en la ventana de comandos los siguientes
datos, en el siguiente orden:
19
La función que escribe la información solicitada corresponde a la sección de código de MATLAB
que se muestra a continuación la cual se usa para redactar la información de la matriz de esfuer-
zosa máximos y esfuerzos mı́nimos; además de la matriz de máximos desplazamientos nodales:
function Escribir1(T1,T2,V)
fprintf(’ \n’);
fprintf(’ Media %s expresada en %s = %f \n’,T1,T2,V(1,2));
fprintf(’ Coeficiente de varianza %s = %f \n’,T1,V(1,3));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El máximo valor %s expresado en %s es igual a %f. \n’,T1,T2,V(1,4));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V(1,5) + 1);
fprintf(’ *---------------------------------* \n’);
fprintf(’ El mı́nimo valor %s expresado en %s es igual a %f. \n’,T1,T2,V(1,6));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V(1,7) + 1);
fprintf(’ \n’);
end
La segunda diferencia es que la segunda función de escritura anota datos adicionales en la ven-
tana de comandos con respecto a la primera. La información que anota la segunda función en
total es la que se muestra a continuación en la siguiente lista:
5. El número de la posición del elemento - o del nodo - en el que se registró el valor máximo.
8. El número de la posición del elemento - o del nodo - en el que se registró el valor mı́nimo.
20
La función que escribe la información solicitada corresponde a la sección de código de MATLAB
que se muestra a continuación, la cual se usa para redactar la información de la matriz de esfuer-
zos máximos y esfuerzos mı́nimos; además de la matriz de máximos desplazamientos nodales:
function Escribir2(T1,T2,T3,V1,V2)
fprintf(’ \n’);
fprintf(’ Media %s expresada en %s = %f \n’,T1,T2,V1(1,2));
fprintf(’ Coeficiente de varianza %s = %f \n’,T1,V1(1,3));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El máximo valor %s expresado en %s es igual a %f. \n’,T1,T2,V1(1,4));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V1(1,5) + 1);
fprintf(’ Se encuentra en el %s número %d. \n’,T3,V2(V1(1,5),1));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El mı́nimo valor %s expresado en %s es igual a %f. \n’,T1,T2,V1(1,6));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V1(1,7) + 1);
fprintf(’ Se encuentra en el %s número %d. \n’,T3,V2(V1(1,7),1));
fprintf(’ \n’);
end
El código de MATLAB también debe de graficar los datos registrados en las variables ma-
triciales de la tabla número 2.2, para lo cual el código hace uso de dos funciones que generan
gráficos de coordenadas cartesianas.
La primera de estas dos funciones solicita como variables de entrada un vector columna, que
corresponde a una de las columnas de una de las matrices de la tabla número 2.2. También soli-
cita tres cadenas de texto, las cuales corresponden al tı́tulo del gráfico, el nombre de la variable
independiente - en el eje de las abscisas -, y el nombre de la variable dependiente - en el eje de
las ordenadas -.
Para realizar el gráfico, la función define un vector fila cuyo elemento inicial es el número 2,
de tal manera que los valores de los elementos de los valores del vector van aumentando de
uno en uno; hasta que el vector tiene tantos elementos como el vector columna introducido en
la variable, de tal manera que este vector generado por la función corresponderá a la variable
independiente de la gráfica, mientras que el vector columna será la variable dependiente.
La función que realiza el gráfico de coordenadas cartesianas en base a los datos mencionados
previamente serı́a la que se muestra a continuación:
function Graficar1(Y,T1,T2,T3)
21
end
La principal diferencia entre la segunda función que realiza gráficos y la primera función ya
mencionada, es que la segunda función realiza dos gráficos en coordenadas cartesianas, uno al
lado del otro. Además, la segunda función requiere de valores de entrada adicionales con respecto
a la primera.
Además de las tres cadenas de texto de la primera función - las cuales son aplicadas para uno de
los dos gráficos de coordenas cartesianas -, la segunda función solicita como variable de entra-
da una cadena de texto que corresponde al nombre de la variable independiente en el segundo
gráfico; junto con una cadena de texto que corresponde al nombre de la variable dependiente del
segundo gráfico, y una cadena de texto que corresponde al tı́tulo del segundo gráfico.
La segunda función también solicita la entrada de dos vectores columna en lugar de uno - de
tal manera que estos vectores son columnas de las matrices de la tabla número 2.2 -, con el fin
que estos vectores sean cada uno la variable dependiente de uno de los dos gráficos cartesianos
elaborados por la función.
Para generar los gráficos, la función define un vector fila usando el mismo procedimiento que la
primera función, y emplea este vector como variable independiente en los dos gráficos.
function Graficar2(Y1,Y2,T1,T2,T3,T4,T5)
nexttile
plot(X,Y1,’-o’,’MarkerIndices’,1:1:length(Y1));
grid on; % Cuadrı́cula
grid minor;
title (T2); % Tı́tulo del Gráfico
xlabel(T1);
ylabel(T3);
nexttile
plot(X,Y2,’-o’,’MarkerIndices’,1:1:length(Y2));
grid on; % Cuadrı́cula
grid minor;
title (T4); % Tı́tulo del Gráfico
xlabel(T1);
ylabel(T5);
end
Para que el usuario pueda seleccionar cual variable de las que están en la tabla número
2.2 desea evaluar, el código de MATLAB hace uso de una estrcutura condicional switch; en la
22
cual el contador representa a una de las variables que puede evaluar el código. Estas variables se
encuentran enumeradas en la siguiente lista, de tal manera que la posición en la lista corresponde
con el valor del contador asociado a cada variable:
La estructura condicional switch está anidada dentro de un bucle while, el cual continúa
solicitando al usuario introducir valores para el contador mientras que éstos valores correspondan
a uno de los seis valores numéricos que se muestran en la lista. En caso que ese no sea el caso, la
estructura condicional interrumpe el proceso ejecutado por el bucle; finalizando la ejecución del
código, tal y como se muestra en la imagen número 2.1:
23
Figura 2.1: Estructura Condicional switch anidada en un Bucle while
24
2.4. Código de MATLAB Completo que analiza las Itera-
ciones del Método Numérico
clc;
close all;
format long;
P = 20000; % En Newtons
t = 150; % En milı́metros
E = 300000; % En N/mm^2
Y = 78.45 / 1000000; % En N/mm^3
L = 1200; % Longitud. En milı́metros
B = 1500; % Base. En milı́metros
a = 11/1000000;
dT = 110; % Incremento temperatura. En °C.
fprintf(’ \n’);
N = input(’ Introduzca el número de procesos: ’); % Número de procesos
Err = zeros(N,2); % Valores obtenidos de los errores
Es = zeros(N,4); % Matriz de esfuerzos notables, en N/mm^2
D = zeros(N,2); % Matriz de desplazamientos máximos de nodos, en milı́metros
R = zeros(N,1); % Matriz de valores de la Reacción, en Newton
for n = 2:N + 1
l = ones(n,1) .* L/n; % Longitudes de los elementos, en milı́metros
b = zeros(n,1); % Bases de los elementos, en milı́metros
if mod(n,2) == 1
l((n + 1)/2) = L/(2 .* n);
l((n + 3)/2) = (3 .* L)/(2 .* n);
end
25
T(n + 1) = E .* A(n) .* a .* dT;
for i = 2:n
F(i) = (W(i - 1) + W(i))/2 + T(i);
end
F(n + 1) = W(n)/2 + T(n + 1);
if mod(n,2) == 1
F((n + 3)/2) = F((n + 3)/2) + P;
else
F(n/2 + 1) = F(n/2 + 1) + P;
end
for i = 1:n
K(i,i) = K(i,i) + k(i);
K(i,i + 1) = K(i,i + 1) - k(i);
K(i + 1,i) = K(i + 1,i) - k(i);
K(i + 1, i + 1) = K(i + 1, i + 1) + k(i);
end
for i = 1:n
e(i) = (E/l(i)) * [-1, 1] * Q(i : i + 1) - e(i);
end
fprintf(’ \n’);
26
j = input(’ Seleccione la opcion de análisis: ’);
V1 = zeros(1,7);
V1(1,1) = std(V2(:,i)); % Desviación estándar de los valores del vector
V1(1,2) = mean(V2(:,i)); % Media aritmética de los valores del vector
V1(1,3) = V1(1,1) / V1(1,2); % Coeficiente de Varianza de los valores del Vector
[V1(1,4),V1(1,5)] = max(abs(V2(:,i))); % Máximo valor absoluto del vector
V1(1,4) = V2(V1(1,5),i);
[V1(1,6),V1(1,7)] = min(abs(V2(:,i))); % Mı́nimo valor absoluto del vector
V1(1,6) = V2(V1(1,7),i);
end
function Escribir1(T1,T2,V)
fprintf(’ \n’);
fprintf(’ Media %s expresada en %s = %f \n’,T1,T2,V(1,2));
fprintf(’ Coeficiente de varianza %s = %f \n’,T1,V(1,3));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El máximo valor %s expresado en %s es igual a %f. \n’,T1,T2,V(1,4));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V(1,5) + 1);
fprintf(’ *---------------------------------* \n’);
fprintf(’ El mı́nimo valor %s expresado en %s es igual a %f. \n’,T1,T2,V(1,6));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V(1,7) + 1);
fprintf(’ \n’);
end
function Escribir2(T1,T2,T3,V1,V2)
fprintf(’ \n’);
fprintf(’ Media %s expresada en %s = %f \n’,T1,T2,V1(1,2));
fprintf(’ Coeficiente de varianza %s = %f \n’,T1,V1(1,3));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El máximo valor %s expresado en %s es igual a %f. \n’,T1,T2,V1(1,4));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V1(1,5) + 1);
fprintf(’ Se encuentra en el %s número %d. \n’,T3,V2(V1(1,5),1));
fprintf(’ *---------------------------------* \n’);
fprintf(’ El mı́nimo valor %s expresado en %s es igual a %f. \n’,T1,T2,V1(1,6));
fprintf(’ Corresponde al número de elementos igual a %d. \n’,V1(1,7) + 1);
fprintf(’ Se encuentra en el %s número %d. \n’,T3,V2(V1(1,7),1));
fprintf(’ \n’);
end
27
function Graficar1(Y,T1,T2,T3)
end
function Graficar2(Y1,Y2,T1,T2,T3,T4,T5)
nexttile
plot(X,Y1,’-o’,’MarkerIndices’,1:1:length(Y1));
grid on; % Cuadrı́cula
grid minor;
title (T2); % Tı́tulo del Gráfico
xlabel(T1);
ylabel(T3);
nexttile
plot(X,Y2,’-o’,’MarkerIndices’,1:1:length(Y2));
grid on; % Cuadrı́cula
grid minor;
title (T4); % Tı́tulo del Gráfico
xlabel(T1);
ylabel(T5);
end
28
Capı́tulo 3
Al ejecutar el código de MATLAB visto en la sección número 2.3 del informe, para una
partición de 500 elementos, se obtienen los siguientes resultados para cada una de las variables
evaluadas:
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.1:
29
Figura 3.1: Gráfica del Error Absoluto versus el Número de Elementos de la Partición
*---------------------------------*
El mı́nimo valor del error relativo expresado en es igual a 0.000000.
Corresponde al número de elementos igual a 2.
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.2:
30
Figura 3.2: Gráfica del Error Relativo versus el Número de Elementos de la Partición
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.3:
31
Figura 3.3: Gráficas del Esfuerzo Máximo y el Elemento afectado por el Esfuerzo Máximo
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.4:
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.6:
32
Figura 3.4: Gráficas del Esfuerzo Mı́nimo y el Elemento afectado por el Esfuerzo Mı́nimo
Por otra parte, el gráfico obtenido al ejecutar el código es el que corresponde a la imagen
número 3.8:
33
Figura 3.5: Resultado de la Ejecución del Código de MATLAB para un Contador igual a 5
Figura 3.6: Gráficas del Máximo Desplazamiento Nodal y el Nodo afectado por el Desplazamiento
Figura 3.7: Resultado de la Ejecución del Código de MATLAB para un Contador igual a 6
34
Figura 3.8: Gráficas de la Reacción en el Apoyo versus el Número de Elementos
35
3.2. Análisis de los Resultados del Código de MATLAB
Se puede apreciar, tanto por el valor del coeficiente de varianza del error absoluto del método
numérico empleado en este informe, como por la lectura del gráfico número 3.1; que a medida
que el número de elementos en los cuales se particiona la placa triangular se incrementa, el valor
numérico del error absoluto tiende a variar e incrementarse más.
Esta tendencia también se puede apreciar a la hora de analizar los valores de la resistencia
en el apoyo obtenidos a partir del método numérico empleado en este informe; tal y como se
aprecia en el gráfico número 3.8. Sin embargo, el mogtivo por el cual el coeficiente de varianza
de la resistencia en el apoyo es prácticamente igual a 0, es debido a que el valor promedio de
esta resistencia es muy grande.
Esto se puede corroborar si se tiene en cuenta que el error relativo producido por el método
numérico empleado en este informe tiene un valor muy cercano a cero para todas las iteraciones
realizadas por el código de MATLAB; tal y como se aprecia en el gráfico número 3.2, debido que
el valor de la reacción de apoyo obtenido a partir de la primera condición del equilibrio es muy
grande en comparación a los errores absolutos del método numérico.
Por el contrario, se puede apreciar que los valores del esfuerzo máximo de tracción que afecta a
los elementos de la placa triangular, el esfuerzo mı́nimo de tracción que afecta a estos elementos,
y el máximo desplazamiento de los nodos de la plaza triangular, convergen a un determinado
valor a medida que se incrementa el número de elementos empleados en el método numérico; tal
y como se aprecia en los gráficos número 3.3, número 3.4 y número 3.6.
También se puede apreciar que los coeficientes de variación de estas tres variables no son tan
grandes, sobre todo si se comparan con el coeficiente de variación del error absoluto, y si también
tenemos en cuenta que estas variables tienen valores pequeños. Estos coeficientes son pequeños
debido a que los valores de la media aritmética de estas variables son cercanos a los valores a
los que convergen para un número muy grande de elementos en los cuales se particiona la placa
triangular.
Al evaluar el gráfico número 3.3 se puede apreciar que el máximo esfuerzo de tracción tien-
de a darse en uno de los elementos cercanos al punto en el cual actúa la fuerza externa que estira
a la placa triangular; el cual serı́a el punto medio de la altura de la placa, o el nodo central.
En cambio, al evaluar el gráfico número 3.4 se puede apreciar que el mı́nimo esfuerzo de tracción
tiende a darse en el elemento ubicado en la punta de la placa triangular; lo cual puede deberse
a que ninguna fuerza externa actúia sobre este elemento, y este elmento es el que tiene menos
peso, y una menor sección transversal que pueda ser deformada por los efectos de la variación
de temperatura.
Al analizar el gráfico número 3.6, se puede apreciar que el elemento ubicado en la punta de
la placa triangular no solo experimenta el menor esfuerzo de tracción; sino que el nodo ubicado
en la punta de la placa triangular es el que experimenta un mayor desplazamiento, por lo cual
esta deformación disminuye el valor del esfuerzo que experimenta el elemento ubicado en la punta
de la placa triangular.
36
Bibliografı́a
[1] Miguel Ángel Ampuero Suárez. Mc516 – cálculo por elementos finitos – práctica. Universidad
Nacional de Ingenierı́a, Enlace: (https://campusvirtualfim.com/pluginfile.php/200/
course/section/876/SLIDES_TRACCION_SIMPLE_DEFORMACION_TERMICA.pdf):34–50, 2023.
[2] Verónica Borja Macı́as. Herramientas computacionales para la matemática. matlab: Análisis
de datos. Universidad Tecnológica de la Mixteca, Enlace: (https://www.utm.mx/~vero0304/
HCPM/33.Analisis-datos.pdf):02–10, 2012.
37