Pag 15 PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 53

52

CAPITULO III : PROBLEMAS UNIDIMENSIONALES


UNIDIMENSIONALES

3.1 INTRODUCCIÓN

En el capítulo I se
se han desarrollado las bases teóricas
teóricas para desarrollar el método de los
elementos finitos. Ahora analizaremos los problemas unidimensionales, donde la
deformación unitaria, el esfuerzo, el desplazamiento y las cargas sólo dependen de la
coordenada  x. Es decir las relaciones matriciales vistos en el capítulo uno se convierten
ahora en sólo relaciones escalares, de tal forma que:
3.1
u = u(x)  =  (x)
(x)   =
 =  (x)
(x) T = T(x) f = f(x)

Las relaciones esfuerzo – 


esfuerzo –  deformación
 deformación unitaria y deformación unitaria – 
unitaria –  desplazamiento
 desplazamiento
son:
du 3.2
 = E  
    

dx

Para problemas unidimensionales, la diferencial de volumen dV  puede


 puede escribirse como

dV = Adx 3.3

La carga es de tres tipos: la fuerza de cuerpo f , la fuerza de tracción T  y


 y la carga puntual
 P i . Una fuerza de cuerpo es una fuerza que actúa sobre todo el volumen elemental del
cuerpo y tiene unidades de fuerza entre la unidad de volumen. El peso propio debido a la
gravedad es un ejemplo de fuerza de cuerpo. Una fuerza de tracción es una carga
distribuida que actúa sobre la superficie del cuerpo. La fuerza de tracción se define como
fuerza entre área unitaria. Para problemas unidimensionales se considera la fuerza de
tracción como fuerza sobre longitud unitaria;
unitaria; esto se logra haciendo que la fuerza de
tracción sea el producto de la fuerza por área unitaria por el perímetro de la sección
53

transversal. La resistencia por fricción, la resistencia viscosa y el cortante superficial son


ejemplos de fuerzas de tracción en problemas unidimensionales.  P i  es una fuerza que actúa
en un punto i y u i  es el desplazamiento  x de ese punto.

3.2 CONSTRUCCIÓN DEL MODELO DEL ELEMENTO FINITO

División del elemento


Considere la barra de la figura 3.1. El primer paso es modelar la barra como una flecha de
sección variable, consistente en un número discreto de elementos, cada uno con sección
transversal uniforme. Específicamente, modelamos la barra usando cuatro elementos
finitos. Un modo simple de hacer esto es dividir la barra en cuatro regiones como se
muestra en la figura 3.2a. Dentro de cada región se evalúa el área transversal promedio y
luego se usa para definir un elemento con sección transversal uniforme. El modelo
resultante con cuatro elementos y cinco nodos se muestra en la figura 3.2b . En el modelo
del elemento finito se conecta cada elemento a dos nodos. En adición a la sección
transversal, las fuerzas de tracción y de cuerpo también se tratan normalmente como
constantes dentro de cada elemento. Al aumentar el número de elementos se obtienen
mejores aproximaciones. Es conveniente definir un nodo en cada lugar en que se indique
una carga.

Esquema de numeración
Se ha mostrado cómo una barra de apariencia complicada puede modelarse usando un
número discreto de elementos, cada elemento con una geometría simple. La similaridad de
los diversos elementos es una razón por la que el método de los elementos finitos es muy
adecuado para ser tratado en una computadora. Para su fácil implantación debe adoptarse
un esquema ordenado de numeración que a continuación se detalla.
54

En un problema unidimensional los desplazamientos son sólo a lo largo del eje x, por lo que
cada nodo tiene un solo  grado de libertad (gdl); por tanto cada elemento finito tiene solo
dos grados de libertad ( dos nodos) . El modelo del elemento finito de cinco nodos en la
figura 3.2b tiene cinco grados de libertad. Los desplazamientos a lo largo de cada grado de
libertad se denotan por Q1 , Q2 ,, Q5 . De hecho, el vector columna Q = [ Q1 , Q2 ,, Q5 ] T 
se llama vector de desplazamiento global . El vector de carga global   se denota por F=
 F 1 , F 2 ,, F 5 

Q y F se muestran en la figura 3.3. La convención de signos
. Los vectores
usada es que un desplazamiento o carga tiene un valor positivo si actúa en la dirección + x.
En esta etapa no se ponen las condiciones de frontera.

Cada elemento tiene dos nodos; por tanto la información sobre la conectividad de los
elementos puede representarse convenientemente como se muestra en la figura 3.4. En la
figura se da la tabla de conectividad. En esta tabla los encabezados 1 y 2 se refieren a los
55

números locales de los nodos de un elemento, y los números nodales correspondientes


sobre el cuerpo se llaman números globales. La conectividad establece así la
correspondencia local – 
local –  global.
 global.

3.3 COORDENADAS Y FUNCIONES DE FORMA

Considere un elemento finito típico e en la figura 3.5a. En el esquema de numeración local,
el número del primer nodo será 1 y el del segundo nodo será 2. Se usa la notación x 1 =
coordenada x del nodo 1, x 2 = coordenada x del nodo 2. Definimos un sistema coordenado
2
natural o intrínseco , denotado por ξ =    1
 x x
1 3.4
 x   x
2 1

De aquí vemos que ξ = - 1 en el nodo 1 y ξ = 1 en el nodo 2. La longitud del elemento se


cubre cuando ξ cambia de -1 a 1. Se usa este sistema de coordenadas al definir funciones de
forma, que se usan al interpolar el campo de desplazamiento.

Ahora, el campo de desplazamiento desconocido dentro de un elemento será interpolado


 por una distribución lineal. Esta aproximación se vuelve cada vez más exacta
ex acta conforme se
consideran más elementos en el modelo. Para implementar esta interpolación lineal, se
introducirán funciones de forma lineales como

1    3.5
 N 1   
2
1   
3.6
 N 2   
2

Las funciones de forma  N 1  y N 2  se muestran en las figuras 3.7a y b, respectivamente.
Una vez definidas las funciones de forma, el campo de desplazamiento lineal dentro del
elemento puede escribirse en términos de los desplazamientos no dales q1  y q2  como
3.7a
u   N 1q1   N 2 q2
o, en notación matricial como

u = Nq 3.7b
56

donde
N =  N 1 , N 2  y q = q1 , q 2 T  3.8

En las ecuaciones anteriores a q se le llama vector de desplazamiento del elemento .


Puede verse que la transformación de x a ξ en la ecuación 3.4 puede escribirse en términos
de  N 1  y N 2  como
3.9
 x =  N 1 x1   N 2 x2

Comparando las ecuaciones 3.7a y 3.9, vemos que el desplazamiento u y la coordenada x


son interpoladas dentro del elemento usando las mismas funciones de forma  N 1  y N 2 . A
esto se le llama formulación isoparamétrica

En general, las funciones de forma deben satisfacer lo siguiente:


57

1. Sus primeras derivadas deben ser finitas dentro de un elemento.


2. Los desplazamientos deben ser continuos a través de la frontera del elemento.

Los movimientos de cuerpo rígido no deben generar ningún esfuerzo en el elemento.

La relación deformación unitaria – 


unitaria –  desplazamiento
 desplazamiento en la ecuación 3.2 es
du
  

dx
Al usar la regla de la cadena de la derivación, resulta

du d  
   3.10
d   dx

De la relación entre x y ξ en la ecuación 3.4, tenemos

d   2
 3.11
dx  x 2   x1

Además, como
1    1   
u   N 1q1   N 2 q2 = q1  q2
2 2
tenemos
du  q1  q2
 3.12
d   2

Entonces, la ecuación 3.10 nos da


1
  q  q2  3.13
1
 x 2   x1

La ecuación anterior se puede escribir así

 = Bq 3.14

donde la matriz B de (1*2), llamada matriz de deformación unitaria  –  desplazamiento


  desplazamiento del
elemento, está dada por
1 3.15
B =  1 1
 x2   x1

El esfuerzo, de la ley de Hooke, es


    E  Bq 3.16

Las expresiones u = Nq,  = Bq,  = E Bq relacionan desplazamiento, deformación unitaria
y esfuerzo, respectivamente , en términos de los valores nodales. Ahora con estas
58

deducciones lo reemplazaremos en la expresión de la energía potencial de la barra para


 poder hallar la matriz de rigidez y la de carga.

3.4 EL ENFOQUE DE LA ENERGÍA POTENCIAL

La expresión general para la energía potencial dada en el capítulo 1 es

1
 u Tdx  u  P 
3.17
   Adx  u T  fAdx 
 fAdx 
T  T 
      Adx i i
2  L  L  L
i
Como el continuo ha sido discretizado en elementos finitos, la expresión para П es entonces

1
  Adx    u
     Adx
T  T 
 fAdx 
 fAdx   u Tdx  Q P  T 
i i
3.18a
e 2 e
e
e
e
e
i

El último término supone que las cargas puntuales  P i   están aplicadas en los nodos. Esta
suposición hace la presente deducción más simple con respecto a la notación y también es
una práctica común en el modelado. La ecuación anterior, 3.18a, puede escribirse como

  U e   u

 fAdx 
 fAdx   u Tdx  Q P  T 
i i
3.18b
e e
e e e i

1
       Adx

donde U e
2
es la energía de deformación unitaria del elemento.

Matriz de rigidez del elemento


Considerando el término de energía
1
3.19
U e 
2
  T    Adx

sustituyendo     E  Bq y  = Bq en la expresión anterior, resulta

3.20a
o
3.20b

En el modelo del elemento finito, el área de la sección transversal del elemento e, denotada
 por  Ae  es constante. Además, B es una matriz constante. La transformación
transformación de x a ξ en la
ecuación 3.4 nos da
 x2   x1 3.21a
dx  d  
2

3.21b
59

e
dx  d  
2

donde  1     1  y  e  es la longitud del elemento,  e


  x
2
 x
1
.
La energía de deformación unitaria U e del elemento se escribe ahora como

3.22

donde  E e  es el módulo de Young del elemento e. Notando que  d    2 , y sustituyendo el
1
valor de B dado por la ecuación 3.15, obtenemos

3.23

que conduce a
3.24

La ecuación anterior es de la forma

3.25

donde la matriz de rigidez del elemento está dado por

3.26

Ej emplo 3.1.Considere la barra en la figura P3.1. El área transversal es de 1.2in² y el


módulo de Young E = 30Mpsi. Si q 0.02in y q2  0.025
1
025in, determine(a mano):
a.  El desplazamiento en el punto P.
b.  La deformación unitaria   y
 y el esfuerzo  .
c.  La matriz de rigidez del elemento.
d.  La energía de deformación unitaria en el elemento.
60

SOLUCIÓN:
a.  De la figura hallamos ξ.
2 2
ξ=     1  =
 x x
1
20  
15  1  0.25
 x
2
  x 1
23  15
 Hallamos las funciones de forma:
1    1  0.25
 N 1      0.375
375
2 2
1    1  0.25
 N 2      0.625
625
2 2
 El desplazamiento en P se calcula con:

u P    N 1q1   N 2 q2  0.375


375 * 0.02  0.625 025  0.023125in.  Respuesta.
625 * 0.025

b.  La deformación unitaria  se calcula con la siguiente expresión:

1 1
  q1  q2   (0.02
   0.025
025)  0.000625
 x 2   x1 23  15

 El esfuerzo   se calcula con :  =E 


 =30e6*0.000625 = 18750psi.

c.  La matriz de rigidez del elemento es:

1.2 * 30e6  1  1  1  1
  1   4.5e 6  1 1   Respuesta.
23  15  1   

d.  La energía de deformación unitaria se calcula con:


c on:

1  1  1  0.02 
 0.02 0.025
025  4.5e6    025  56.25in*lb. Respuesta.
2  1 1  0.025 

Términos de fuerza

Consideremos primero el término de fuerza de cuerpo del elemento que aparece en la


energía potencial total. Sustituyendo u   N 1q1   N 2 q2 , tenemos

3.27
u 
 fAdx   Ae  f    N 1q1   N 2 q2 dx

 fAdx
e e
61

La ecuación anterior puede escribirse como

 Ae  f   N  dx 
eu  fAdx  q  Ae  f   e N  dx
1
T  T  3.28
 e  2

Las integrales de las funciones de forma anteriores pueden evaluarse fácilmente haciendo la
sustitución dx ( e / 2)d   . Entonces,

e 1 1    e

e
 N 1 dx 
2

1 2
d   
2 3.29
e 1 1    e
  N  dx  2 
e
2
1 2
d   
2

El término de fuerza de cuerpo en la ecuación 3.28 se reduce a

3.30a

que es de la forma
3.30b

El lado derecho de la ecuación anterior es de la forma: Desplazamiento x Fuerza .


Así, el vector de fuerza de cuerpo del elemento, se identifica como

3.31

Consideremos a hora el término de la fuerza de tracción del elemento que aparece en la


energía potencial total. Tenemos,

 u Tdx    N  q  N  q Tdx 3.32



1 1 2 2
e e

Como la fuerza de tracción T  es


 es constante dentro del elemento, tenemos
62

3.33

Ya hemos obtenido las integrales de las funciones de forma. Por tanto la ecuación 3.33 es
de la forma

donde el vector de fuerza de tracción del elemento está dado por


3.35

En esta etapa, se han obtenido ya las matrices del elemento , y . Después de tomar en
cuenta la conectividad de los elementos, la energía potencial total se puede escribirse así,

3.36

donde K  es
  es la matriz de rigidez global, F es el vector de carga global y Q es el vector de
desplazamiento global.

3.5 ENSAMBLE DE LA MATRIZ DE RIGIDEZ GLOBAL Y DEL VECTOR


CARGA

 Notamos antes que la energía potencial total escrita en la forma

 puede escribirse en la forma

tomando en cuenta la conectividad del elemento. Este paso implica ensamblar K  y F a


 partir de las matrices de rigidez y fuerza del elemento.
En consecuencia , al sumar las energías de deformación unitaria del elemento, los
elementos de se colocan en los lugares apropiados de la matriz global K , con base en la
conectividad del elemento; los elementos que se traslapan simplemente se suman. Podemos
denotar este ensamble en forma simbólica como

3.37
63

De manera muy parecida, el vector de carga global F se ensambla a partir de los vectores de
de
fuerza y de los vectores de carga puntual de los elementos, como

3.38

3.6 PROPIEDADES DE K

Ahora deduciremos algunas propiedades importantes, de la matriz de rigidez tratado


anteriormente.
1. La dimensión de la matriz de rigidez global K   es (N x N) , donde N es el
número de nodos. Esto se obtiene del hecho de que cada nodo sólo tiene un
grado de libertad.
2. K  es
 es simétrica.
3. K es una matriz en banda. Es decir todos los elementos fuera de la banda son
cero.

3.7 ECUACIONES DEL ELEMENTO FINITO; MANEJO DE LAS CONDICIONES


DE FRONTERA

Tipos de condiciones de frontera

Al usar un esquema de discretización para modelar el continuo, obtuvimos una expresión


 para la energía potencial total en el cuerpo dada por

donde K  es
  es la matriz de rigidez estructural, F es el vector de carga global y Q es el vector
de desplazamiento global. Como se vio antes, K  y F se ensamblan a partir de las matrices
de rigidez y fuerza de los elementos, respectivamente. Para poder hallar los
desplazamientos nodales, esfuerzos en los elementos y fuerzas en los soportes, tenemos que
usar las ecuaciones de equilibrio. Esto lo podemos deducir del teorema de la energía
 potencial mínima : De todos los desplazamientos posibles que satisfacen las condiciones de de
 frontera de un sistema estructural, aquellos que corresponden a configuraciones de
equilibrio hacen que la energía potencial total adquiera un valor mínimo. Pon tanto, las
ecuaciones de equilibrio pueden obtenerse minimizando  con respecto a Q, teniendo en
cuenta que  previamente se halla sometido a las condiciones
con diciones de frontera de la estructura.
Las condiciones de frontera son usualmente del tipo

Q p1  a1 , Q p 2  a2 ,, Q pr   ar  3.39

Es decir, los desplazamientos a lo largo de los grados de libertad  p1 ,  p2 ,,  p r  se
especifican como iguales a a1 , a2 ,, ar  , respectivamente. En otras palabras, hay un
64

número r de soportes en la estructura; con cada nodo de soporte está asociado un


desplazamiento específico.

Hay restricciones de multipunto del tipo


3.40
  1Q p1    2 Q p 2   0

donde   1 ,  2 0  son constantes conocidas. Estos tipos de frontera se usan para modelar
y

soportes inclinados con rodillo, conexiones rígidas o ajustes por contracción.

Debe enfatizarse que una especificación impropia de las condiciones de frontera puede
conducir a resultados erróneos. Las condiciones de frontera eliminan la posibilidad que la
estructura se mueva como cuerpo rígido. Las condiciones de frontera deben modelar el
sistema físico con exactitud. En este apartado se verán dos enfoques para el manejo de las
condiciones de frontera: el enfoque de la eliminación y el enfoque de la penalización.

Enfoque de eliminación
Para ilustrar la idea básica, consideremos la sola condición de frontera Q1 a1 . Las 

ecuaciones de equilibrio se obtienen minimizando  con respecto a Q, sometida a la


condición de frontera Q1 a1 . Para una estructura con N grados de libertad, tenemos

Q = Q1 , Q2 ,, Q N  T 


F =  F 1 , F 2 ,, F  N  T 

La matriz de rigidez global es de la forma

 K  11
 K 12   K 1 N  
 K   K 22   K 2 N 

K=  21
 3.41
  
 
 K   N 1
 K  N 2   K  NN  

 Note que K  es una matriz simétrica. La energía potencial puede


escribirse de forma explícita como
 Q1 K 11Q1  Q1 K 12Q2    Q1 K 1 N Q N   
 
  Q  K  Q  Q  K  Q    Q  K  Q 
  12  2 21 1 2 22 2 2 2 N   N 
  Q1 F 1  Q2 F 2    Q N  F  N   3.42

 
  Q  K  Q  Q  K  Q    Q  K  Q 
   N   N 1 1  N   N 2 2  N   NN   N  

Si sustituimos ahora la condición de frontera Q1  a1 en la expresión para П, obtenemos


65

 a  K  a  a  K  Q    a  K   N Q N   


 1 11 1 1 12 2
 1 1

  Q  K  a  Q  K  Q    Q  K  Q 


  1 2 21 1 2 22
 N   N  2
 a  F   Q  F     Q N  F  N  
2 2

 
2 1 1 2 2 3.43
 
  Q  K  a  Q  K  Q    Q  K  Q 
   N   N  1
 N   N  1  N   NN   N  
2 2

q ue el desplazamiento Q1 ha sido eliminado  de la expresión anterior para la energía


 Note que
 potencial. En consecuencia, el requisito de que П adquiera un valor mínimo, implica
implica que


0 i  2,3, , N  3.44
Qi

De las ecuaciones 3.43 y 3.44 obtenemos entonces,

 K 22Q2   K 23Q3
   K 2 N Q N    F 2  K 21a1

 K 32Q2   K 33Q3     K 3 N Q N    F 3  K 31a1 3.45




 K  N 2 Q2   K  N 3Q3     K  NN Q N    F  N   K  N 1a1

Las ecuaciones del elemento finito anteriores se puede escribirse matricialmente así,

 K 22  K 23   K 2 N    Q2    F 2   K 21a1 


 K  
     F    K  a 
 32  K 33  K 3 N  Q3
    3 31 1
 3.46
       
    
 K  N 2  K  N 3   K  NN   Q N    F  N    K  N 1a1 

Ahora observamos que la matriz de rigidez de ( N-1 N-1 x N-1) anterior se obtiene simplemente
 borrando o eliminando la primera fila y columna (en vista de que Q1 a1 ) de la matriz de 

rigidez original de ( N


 N x N ).
). La ecuación 3.63 puede escribirse como
3.47
KQ = F

Donde K   es una matriz de rigidez reducida que se obtiene eliminando la fila y columna
correspondiente al grado de libertad o “soporte” especificado. Las ecuaciones 3.47 pueden
resolverse para el vector de desplazamiento Q usando la eliminación de Gauss. Note que la
matriz reducida K   es no singular, siempre que las condiciones de frontera se hallan
especificado apropiadamente; por otra parte, la matriz K   original es una matriz singular.
Una vez determinada Q, el esfuerzo en los elementos puede evaluarse usando la ecuación
3.16 :    E  Bq, donde q  para cada elemento se extrae de Q usando información sobre la

conectividad del elemento.


66

Una vez obtenidos los esfuerzos en los elementos es necesario calcular la fuerza de
reacción  R1 en el soporte. Esta fuerza de reacción puede obtenerse de la ecuación del
elemento finito (o ecuación de equilibrio) para el nodo 1: 3.48
 K 11Q1   K 12Q2     K 1 N Q N    F 1   R1
  R1   K 11Q1   K 12Q2     K 1 N Q N    F 1 3.49

 Note que los elementos  K 11 , K 12 ,, K 1 N    usados antes, que forman la primera fila de K ,
deben ser almacenados en forma separada. Esto se debe a que K   de la ecuación 3.47 se
obtiene borrando esta fila y columna de la K  original.
 original.

Ej emplo 3.2. Considere la barra en la figura P3.3 cargada como se muestra. Determine
los desplazamientos nodales, los esfuerzos en los elementos y las reacciones en los
 soportes. Resuelva este problema a mano usando el método de eliminación para manejar
las condiciones de frontera. Verifique sus resultados usando el programa Unidimensional.

SOLUCIÓN: Se consideran tres elementos con 4 grados de libertad.

1) Calculamos las matrices de rigidez de cada uno de los elementos:

1 2

 1  1  333333. 3  333333 . 3 1
 
250
250 * 200000
k    1 1     
1

150
150    333333 . 3 333333. 3  2

2 3

 1  1  333333. 3  333333. 3 2
 
250
250 * 200000
k    1 1     
2

150
150    333333. 3 333333 . 3  3

3 4
67

 1  1  266666. 6  266666. 6 3
 
400
400 * 200000
k    1 1     
3

300
300    266666. 6 266666. 6  4

2) Se ensambla las tres matrices anteriores para hallar la matriz de rigidez global de la
estructura, considerando la conectividad de los elementos que también se ha indicado.
1 2 3 4

  
1
 333333 . 3  333333 .3 0

0

 2
K   333333 . 3 666666 . 6  333333 . 3 0

 0  333333 . 3 600000  266666 . 6 3
 
  266666 . 6 266666 . 6  4
 0 0

3) Calculamos la columna vector de las fuerzas globales de la estructura. En este


 problema sólo la carga puntual aplicado en el nodo 2 contribuye
co ntribuye con la carga global.
 Por tanto:
 0 1
300000  2
F  
 0 3
 
 0 4

4)  Formamos el sistema KQ = F.  En el enfoque de eliminación se eliminan las filas y


columnas de las condiciones de frontera. Por tanto el sistema queda como

  

666666 . 6  333333 . 3 Q2  300000 
    
Q   0 
 333333 . 3 600000    3  
donde se han eliminado las correspondientes filas y columnas de los grados de libertad
1 y 4 de las tres matrices K, Q y F.
 Resolviendo dicho sistema tenemos:
Q2   0.62307692 
Q   0.346153846 
 3  

5)  Los esfuerzos en los elementos se


s e calculan con:
1
B =  1 1
 x2  x1
El esfuerzo, de la ley de Hooke, es
    E  Bq
68

200000  0 
 1   1 1 
150
150 0.62307692 
 1  830
830 .769
769 N  / mm²

200000  0.62307692 
 2   1 1 
150
150 0.346153846 
 2  369
369 .231
231 N  / mm²

200000 0.346153846 
 3   1 1 
150
150  0 
 3  230
230 .769
769 N  / mm²

 K 11Q1   K 12Q2
   K   N Q N    F    R
 1 1 1
6)  Las reacciones se calculan de acuerdo a
  R   K  Q   K  Q     K   N Q N    F 
1 11 1 12 2 1 1

 0 
 
333333 . 3 
 0.62307692
 R1 
  333333 . 3 0 0     207692 .3N .
 0 .346153846 
 
 0 
 0 
 
  
  0.62307692 
 R4  0 0  266666 . 6 266666 . 6   92307 .7 N .
  0.346153846 
 
 0 

 Esta es la salida del problema


pro blema anterior con el Programa
Prog rama Unidimensional desarrollado
 por el tesista; se usa el enfoque de penalización:
69

Enfoque de la penalización

Este segundo enfoque para tratar las condiciones de frontera, es fácil de implementar en
una computadora y retiene su simplicidad aún cuando se consideran condiciones de frontera
generales.

Condiciones de frontera con desplazamiento especificado. Considere la condición de


frontera
Q1  a1
donde a
1
 es un desplazamiento específico a lo largo del grado de libertad 1 del soporte.

Para modelar el soporte se usa un resorte con gran rigidez


rigidez C. La magnitud de C se
analizará posteriormente. En este caso se desplaza en un extremo del resorte una cantidad
a1 , como se muestra en la figura 3.10. El desplazamiento Q1   a lo largo del grado de
libertad 1 será aproximadamente igual a a
1
, debido a la relativa resistencia ofrecida por la
estructura. En consecuencia , la extensión neta del resorte es igual a ( Q1  a1 ). La energía
de deformación unitaria en el resorte es igual a

3.50
C Q1 a1 
1 2
U  s 
2

70

Esta energía de deformación contribuye a la energía potencial total. Como resultado,

3.51

La minimización de puede llevarse a cabo haciendo  M  / Qi  0, i  1,2,, N  . Las


ecuaciones del elemento finito se pueden escribirse así,

( K 11  C )  K 12   K 1 N    Q1   F 1  Ca1 


  K   K 22 
     F  
 K 2 N  Q2
 21     2  3.52
       
    
  K  N 1  K  N 2   K  NN   Q N     F  N  

Anteriormente vimos que las únicas modificaciones para tratar Q1  a1   son: que debe
agregarse un gran número C al primer elemento diagonal de K  y   y que C a1  se agrega a  F 1 .
La fuerza de reacción en el nodo 1 es igual a la fuerza ejercida por el resorte sobre la
estructura. Como la extensión neta del resorte es ( Q1 a1 ) y la rigidez del resorte es C, la

fuerza de reacción está dada por


 R1 C Q1 a1 
  
3.53

Selección de C.  Desarrollemos la primera de estas ecuaciones en la ecuación 3.52,


tenemos,

 K 11  C Q1  K 12Q2    K 1 N Q N    F 1  Ca1 3.54a

Al dividir entre C , obtenemos


71

  K     K   K   F 


  1Q 
11
1
Q     N  Q N  
12
2
a 1 1
1
3.54b
  C    C  C  C 

De la ecuación anterior, vemos que si se escoge C suficientemente grande, entonces


Q1 a1 . De manera específica, vemos que si C   es grande en comparación con los

coeficientes de rigidez  K 11 , K 12 ,, K 1 N  , entonces Q1  a1 . Note que  F 1   es una carga
aplicada en el soporte (si existe) y que  F 1 /C  es
  es generalmente de pequeña magnitud.
Un simple esquema sugiere por sí mismo la elección de la magnitud de C :

4
C = máx  K ij  10

1 i   N  3.55
1  j   N 

La selección de 10 4  se ha encontrado satisfactoria en la mayor parte de los cálculos.

Restricciones de multipunto

En problemas donde, por ejemplo, deben modelarse soportes inclinados con rodillos o
conexiones rígidas, las condiciones de frontera toman la forma

  1Q p1    2 Q p 2   0

donde   1 ,  2 y  0  son constantes conocidas. A tales condiciones de frontera se les llama
restricciones de multipunto. El enfoque de penalización se aplicará a este tipo de condición
de frontera.
Considere la expresión de la energía potencial total modificada a ser minimizada

3.56

donde C  es un número grande. Como C es grande , adquiere un valor mínimo sólo


cuando es muy pequeña, es decir, cuando   1Q p1    2 Q p 2   0 ,
como se desea. Haciendo  M  / Qi  0, i  1,2,, N   se obtienen las matrices de rigidez
y fuerza modificadas.
Estas modificaciones están dadas por

 K  P   P   K  P 1 P 2    K  P   P   C    2


 K  P 1 P 2 C       3.57
 K 
1 1

  K 
1 1 1

1 2

   P   P   C       K  P   P   C 


2
  P   P 
2 1
 K  P 2 P 2 2 1 1 2 2
   
2 2

y
72

 F  P 1   F  P 1  C   0  1  3.58


 F     F   C       
  P 2    P 2 0 2

Si consideramos las ecuaciones de equilibrio  M  / Q P 1  y  M  / Q P 2 , y las reordenamos
en la forma

 K  p   j Q  j  F  p


1 1
  R p1  y  K  p   j Q  j  F  p
2 2
 Rp2
  j   j

obtenemos las fuerzas de reacción  R p1  y R p 2   que son las componentes de reacción a lo
largo de los grados de libertad  p1  y p2 , respectivamente , como

 3.59a
 R p1  
Q p1
 C    Q
1
2 1  p1    2 Q p 2   0 
2

y

 R p1  
Q p 2
 C    Q
1
2 1  p1    2Q p 2   0 2 
3.59b

Después de simplificar, las ecuaciones 3.84 toman la forma

 R p1 C   1   1Q p1    2 Q p 2


    0  3.60a
y
 R p 2   C   2   1Q p1    2 Q p 2   0  3.60b

Vemos que el enfoque de penalización nos permite manejar las restricciones de multipunto
y es nuevamente fácil implementarlo en un programa de computadora.

Ej emplo 3.3. Se aplica una carga axial P = 385 kN al bloque compuesto mostrado en la
 figura P3.5. Determine el esfuerzo en cada material.
73

SOLUCIÓN:
 En este problema consideramos 2 elementos con dos condiciones de frontera y dos
restricciones de multipunto y 5 grados de libertad , así:

5
2 4

1 3
Condiciones de Frontera:
Q1  0

Q3  0

 Restricciones de multipunto:
Q2  Q5  0

Q4  Q5  0
Con la corrida del programa obtenemos los siguientes esfuerzos:
  
1
  85.55898 N  / mm²

  
2
  128
128 .32991 N  / mm²
74

Ej emplo 3.4 Considere la barra en la figura P3.6 Determine los desplazamientos nodales,
los esfuerzos en los elementos y las reacciones en los soportes.

SOLUCIÓN:

1. Se considera 4 elementos, 1 condición de frontera y 5 grados de libertad.


 La condición de frontera se expresa en que el nodo 1 es fijo, es decir:

Q1  0
 Resolviendo el problema con el programa tenemos:
75

Se nota que el desplazamiento en el nodo 5 es de 6.000125mm, por lo que volvemos


ha resolver el problema considerando una condición de frontera más.

2.  Las condiciones de frontera en este nuevo problema


pr oblema son:
Q1  0

Q5  3.5mm
76

 Las reacciones en los soportes


sopo rtes son:
 R1  672722 .21 N 

 R2  227277 .79 N 


 Los esfuerzos, desplazamientos, se muestran en la salida del programa.
77

Ej emplo 3.5.  La viga rígida en la figura P3.9 estaba a nivel antes de aplicarse la carga.
 Encuentre el esfuerzo en cada miembro vertical

SOLUCIÓN: Se consideran 2 elementos, 2 condiciones de frontera, 2 restricciones de


multipunto y 5 grados de libertad.

Condiciones de frontera:
Q1  0

Q3  0
 Restricciones de multipunto:
36
15
Q2  Q5  0
36
27
Q4  Q5  0

 De la salida del programa tenemos:


 1  15318 .69 psi

 2  9191 .69 psi


78

3.8 FUNCIONES DE FORMA CUADRÁTICA

Hasta ahora, el campo de desplazamiento ha sido considerado por funciones de forma lineal
dentro de cada elemento. Sin embargo, en algunos problemas, el uso de una interpolación
cuadrática conduce a resultados bastante más exactos. En esta sección se presentarán las
funciones de forma
forma cuadrática y la correspondiente
correspondiente matriz de rigidez del elemento y se
deducirán los vectores de carga.

Consideremos un elemento típico cuadrático de tres nodos, como el mostrado en la figura


3.11a. En el esquema local de numeración, el nodo izquierdo se designará como 1, el nodo
derecho como 2 y el punto medio como 3. El nodo 3 se ha introducido con el fin de pasar
un ajuste cuadrático y se llama nodo interno. Se usa la notación  xi  x   coordenada del 


nodo i, i  = 1, 2, 3. Además q = q1, q2 , q3  , donde q1, q2 , q3  son los desplazamientos de los
nodos 1, 2 y 3, respectivamente. El sistema coordenado  x es “mapeado” en un sistema
coordenado ξ, que se obtiene con la transformación

2  x   x
3
 3.61
  

 x   x
2 1
79

De la ecuación 3.86 vemos que ξ = -1, 0 y +1 en los nodos 1, 3 y 2.


Ahora se introducirán, en coordenadas ξ, las funciones de forma cuadrática
cuadrática  N 1, N 2  y N 3

 N 1     1   


1 3.62a
2

 N      1   


1
como 2 2 3.62b
 N     1   1   
3
3.62c

La función de forma  N 1   es igual a la unidad en el nodo 1 y cero en los nodos 2 y 3.


Similarmente,  N 2  es igual a la unidad en el nodo 2 e igual a cero en los otros dos nodos;
 N 3  es igual a la unidad en el nodo 3 e igual a cero en los nodos 1 y 2. Las funciones de
forma  N 1, N 2  y N 3  están graficadas en la figura 3.12. Las expresiones para esas funciones
de forma pueden escribirse por inspección.

Ahora el campo de desplazamiento dentro del elemento se escribe en términos de los


desplazamientos nodales como
3.63a
u   N 1q1   N 2 q2  N 3 q3
o
3.63b
u = Nq


donde N = [  N 1 , N 2 , N 3 ] es un vector de (1 *3) de funciones de forma y q = q1 , q2 , q3  un
vector columna de (3*1) de desplazamiento del elemento. En el nodo 1 vemos que
 N 1 1,  N 2
 N 3
 0 y por consiguiente , u q1 . De igual manera, u  q2  en el nodo 2 y
 
80

u  q3  en el nodo 3. Entonces, u en la ecuación 3.89a es una interpolación cuadrática que
 pasa por q1 , q2 , q3 .

La deformación unitaria  ahora está dada por


du
 = (relación deformación unitaria – 
unitaria –  desplazamiento)
 desplazamiento)
dx
du d  
= (regla de la cadena)
d   dx
2 du
= (usando la ecuación 3.61) 3.64
 x 2   x 1
d  

2  dN 1 dN 2 dN 3 


= , , q (usando la ecuación 3.63)
 x 2   x1  d   d   d   

Usando las ecuaciones 3.62, tenemos

 1  2  1  2 
2  3.65
    , ,2  q
 x  x  2 2
2 1

que es de la forma
3.66
 = Bq

donde B está dada por

2  1  2  1  2   3.67


B    , ,2 
 x
2  x1  2 2 

Usando la ley de Hooke, podemos escribir el esfuerzo como

 = E Bq
Bq 3.68

 Note que las  N i  son funciones de f orma


orma cuadrática, B en la ecuación 3.67 es lineal en ξ.
 Esto significa que la deformación unitaria y el esfuerzo pueden variar linealmente dentro
del elemento.

Ahora tenemos expresiones para u,  y   en las ecuaciones 3.63b, 3.66 y 3.68,


respectivamente. También tenemos que dx = (  e / 2)d    de la ecuación 3.61.

 Nuevamente, en el modelo del elemento finito considerado aquí, se supondrá que el área
transversal  Ae , la fuerza de cuerpo  f   y la fuerza de tracción T , son constantes dentro del
81

elemento. Al sustituir u, ,  y dx  de las expresiones anteriores en la expresión para la


energía potencial, obtenemos

1
       Adx    u
T  T 
 fAdx 
 fAdx   u Tdx  Q  P 

i i
e 2 e
e
e
e
e
i

3.69

Comparando la ecuación anterior con la forma general

resulta
3.70a

que, al sustituir por B en la ecuación 3.67, da

3.70b

El vector de fuerza de cuerpo del elemento está dado por

3.71a

que, al sustituir por N en las ecuaciones 362, da

3.71b

similarmente, el vector de fuerza de tracción del elemento está dado por

3.72a
que conduce a
82

3.72b

La energía potencial total es nuevamente de la forma , donde la matriz


K de rigidez estructural y el vector F de carga nodal son ensamblados a partir de las
matrices de rigidez y de los vectores de carga de los elementos, respectivamente.

3.9 EFECTOS POR CAMBIO DE TEMPERATURA

Se considerará aquí los esfuerzos producidos por cambio de temperatura en un material


elástico isotrópico lineal. Si se conoce la distribución del cambio de temperatura ΔT(x),
entonces la deformación unitaria debido a este cambio de temperatura puede tratarse como
una deformación unitaria lineal  0 , dada como

0 = T 3.73

donde  es el coeficiente de dilatación térmica. La ley de esfuerzo – 


esfuerzo  –  deformación
  deformación unitaria
en presencia de  0 se muestra en la figura3.14. De esta figura, vemos que la relación
esfuerzo – 
esfuerzo –  deformación
 deformación unitaria está dada por

 = E ( -  0 ) 3.74

La energía de deformación unitaria por unidad de volumen, u 0 , es igual al área sombreada


de la figura 3.14 y está dada por

1 3.75
u
0

2
   ( -  0 )
83

Usando la ecuación 3.74, encontramos que la ecuación 3.75 da

u 
1
( -  0 ) T  E  ( -  0 ) 3.76a
0 2

La energía de deformación unitaria total U  en


  en la estructura se obtiene integrando u 0 sobre
el volumen de la estructura:
3.76b

Para una estructura modelada usando elementos lineales unidimensionales, la ecuación


anterior toma la forma

3.76c

 Notando que  = Bq, obtenemos

3.76d

Examinando la expresión de la energía de deformación unitaria anterior, vemos que el


 primer término del segundo miembro de la ecuación da la matriz de rigidez de un elemento
que se obtuvo en la ecuación 3.4; el último término es una constante y al derivar la energía
 potencial total con respecto a Q, para hallar las ecuaciones de equilibrio, desaparece. El
segundo término da el vector de carga  deseado del elemento , ocasionado por el cambio
e

de temperatura:

3.77a
e
=

1
La ecuación anterior puede simplificarse sustituyendo B= 
 1    y notando que
1
 x2   x1
0 = T, entonces
e
=
3.77b

En la expresión anterior  es el cambio de temperatura promedio dentro del elemento. El


vector de carga por temperatura en la ecuación 3.77b puede ensamblarse junto con la fuerza
de cuerpo, la fuerza de tracción y los vectores de carga puntual para dar el vector de carga
global F para la estructura. Este ensamblaje puede denotarse por
84

3.78

Después de resolver las ecuaciones del elemento finito KQ = F para los desplazamientos
Q, el esfuerzo en cada elemento puede obtenerse con la ecuación 3.74 como

 = E (Bq -  ) 3.79

Ejemplo 3.6.  La estructura en la figura P3.18 está sometida a un incremento de


temperatura   =
  = 80°C. Determine los desplazamientos, los esfuerzos y las reacciones en
los soportes.

SOLUCIÓN: Se consideran 3 elementos, 4 grados de libertad y 2 condiciones de frontera.


Condiciones de frontera:

Q1  0

Q4  0
85

3.10 PROGRAMAS DE COMPUTADORA

Se dan los códigos del proyecto “UnaDimension.bpr” , la salida en pantalla es tal como se
ha visto anteriormente al resolver los ejercicios. Note la inclusión de la clase TMatriz
desarrollada en el anterior capítulo.

/**************************************
* UnaDimension.h Versión 1.0 *
* D.R. © Adolfo Linares Flores 2003 *
* El Método de los Elementos Finitos *
* Todos los Derechos Reservados *
***************************************/
//---------------------------------------------------------------------------
#ifndef UnaDimensionH
#define UnaDimensionH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
86

#include <Menus.hpp>
#include <ToolWin.hpp>
#include <DBGrids.hpp>
#include <Grids.hpp>
#include <Db.hpp>
#include <iostream.h>
#include <assert.h>
#include "TMatriz.h"

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
 __published: // IDE-managed Components
TLabel *Label1;
TEdit *Edit1;
TButton *Button1;
TMainMenu *MainMenu1;
TMenuItem *Archivo1;
TMenuItem *Imprimir1;
TMenuItem *N1;
TMenuItem *Salir1;
TMenuItem *Editar1;
TMenuItem *Copiar1;
TMenuItem *Cortar1;
TMenuItem *Pegar1;
TDBGrid *DBGrid1;
TButton *Button2;
TLabel *Label2;
TDataSource *DataSource1;
TLabel *Label3;
TLabel *Label4;
TEdit *Edit2;
TLabel *Label5;
TEdit *Edit3;
TLabel *Label6;
TDBGrid *DBGrid2;
TLabel *Label7;
TDBGrid *DBGrid3;
TDataSource *DataSource2;
TDataSource *DataSource3;
TMenuItem *Acerca;
TMenuItem *AcercaDelMEF;
TLabel *Label8;
TEdit *Edit4;
TLabel *Label9;
TLabel *Label10;
TEdit *Edit5;
87

TEdit *Edit6;
TDBGrid *DBGrid4;
TDBGrid *DBGrid5;
TLabel *Label11;
TLabel *Label12;
TDataSource *DataSource4;
TDataSource *DataSource5;
TLabel *Label13;
TDBGrid *DBGrid6;
TDataSource *DataSource6;
TLabel *Label14;
TLabel *Label15;
TDBGrid *DBGrid7;
TDBGrid *DBGrid8;
TDataSource *DataSource7;
TDataSource *DataSource8;
TButton *Button3;
TDBGrid *DBGrid9;
TLabel *Label16;
TDataSource *DataSource9;
TButton *Button4;
TButton *Button5;
TLabel *Label17;
TLabel *Label18;
TDataSource *DataSource10;
TDBGrid *DBGrid10;
TMenuItem *VistaPrevia1;
void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Salir1Click(TObject *Sender);

void __fastcall AcercaDelMEFClick(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);


void __fastcall Button5Click(TObject *Sender);
void __fastcall Imprimir1Click(TObject *Sender);
void __fastcall FormActivate(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button6Click(TObject *Sender);


void __fastcall Button7Click(TObject *Sender);
88

void __fastcall VistaPrevia1Click(TObject *Sender);


 private: // User declarations
int n; //número de elementos
int ng; //número de grados de libertad
int ncf; //número de condiciones de frontera
int nrmp; //número de restricciones de multipunto
double C; //constante para la penalización
TTable *tabla, *tabla2, *tabla3, *tabla4, *tabla5, *Respuesta;
TTable *rigidez, *fuerza, *funo;
TMatriz *B;
TMatriz *q;
TMatriz *N;
TMatriz *K;
TMatriz *f;
TMatriz *T;
TMatriz *P;
TMatriz *gl;
TMatriz ST;
TMatriz F;
TMatriz *delTem;
TMatriz *fn;
 public: // User declarations
 __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

/**************************************
* UnaDimension.cpp Versión 1.0 *
* D.R. © Adolfo Linares Flores 2003 *
* El Método de los Elementos Finitos *
* Todos los Derechos Reservados *
***************************************/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UnaDimension.h"
#include "TMatriz.h"
#include "AcercaDel.h"
#include "ResultadosUnidimensional.h"
#include "Informe.h"
89

USEUNIT("TMatriz.cpp");

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)


{
//Si no es un dígito o la tecla de borrado
if((Key < '0' || Key > '9') && Key Ke y != 8)
Key = 0; // no admitir la pulsación
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)


{
n = Edit1->Text.ToInt();
if(n > 0) Edit1->ReadOnly = true;
else {
do {
MessageBox(Handle, "Ingrese un entero positivo", "Mensaje", MB_OK);
} while(n < 0);
}

//Crea el Alias para la base de datos de


d e las propiedades de los elementos
/* const char* dir = "c:\\Elementos Finitos\\UnaDimension";
CreateDirectory(dir,0);
try {
Session->AddStandardAlias("Base de Datos Unidimensional", dir, "DBASE");
Session->SaveConfigFile();
}
catch(...) {
MessageBox(Handle, "Error de Creación del Alias de la Base de Datos", "Mensaje",
0);
return ;
} */

ncf = Edit5->Text.ToInt();
nrmp = Edit6->Text.ToInt();
90

//Cambia el cursor al estilo de reloj de arena


Screen->Cursor = crHourGlass;

//Ahora crea la tabla

try {
tabla = new TTable(this);
tabla->DatabaseName = "Base de Datos Unidimensional";
tabla->TableName = "materiales.dbf";
tabla->Active = false;

//Borra todos los campos de la tabla


tabla->FieldDefs->Clear();

//Agrega las definiciones para los campos


tabla->FieldDefs->Add("Area", ftFloat, 0, true);
tabla->FieldDefs->Add("Longitud", ftFloat, 0, true);
tabla->FieldDefs->Add("Módulo E", ftFloat, 0,true);
tabla->FieldDefs->Add("Delta Temp", ftFloat, 0, true);
tabla->FieldDefs->Add("Alfa", ftFloat, 0, true);

//Crea la tabla
tabla->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla;
return ;
}
//Ahora crea la tabla

try {
tabla2 = new TTable(this);
tabla2->DatabaseName = "Base de Datos Unidimensional";
tabla2->TableName = "cargasPuntuales.dbf";
tabla2->Active = false;

//Borra todos los campos de la tabla


tabla2->FieldDefs->Clear();

//Agrega las definiciones para los campos


tabla2->FieldDefs->Add("Cargas Puntuales", ftFloat, 0, true);

//Crea la tabla
tabla2->CreateTable();
}
91

catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de las Cargas Puntuales",
"Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla2;
return ;
}
//Ahora crea la tabla

try {
tabla3 = new TTable(this);
tabla3->DatabaseName = "Base de Datos Unidimensional";
tabla3->TableName = "conectividad.dbf";
tabla3->Active = false;

//Borra todos los campos de la tabla


tabla3->FieldDefs->Clear();

//Agrega las definiciones para los campos


tabla3->FieldDefs->Add("Nodo 1", ftSmallint, 0, true);
tabla3->FieldDefs->Add("Nodo 2", ftSmallint, 0, true);

//Crea la tabla
tabla3->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Conectividad", "Mensaje",
0);
Screen->Cursor = crDefault;
delete tabla3;
return ;
}

if(ncf) {
//Ahora crea la tabla

try {
tabla4 = new TTable(this);
tabla4->DatabaseName = "Base de Datos Unidimensional";
tabla4->TableName = "CondicionesDeFrontera.dbf";
tabla4->Active = false;

//Borra todos los campos de la tabla


tabla4->FieldDefs->Clear();

//Agrega las definiciones para los campos


tabla4->FieldDefs->Add("Nodo", ftSmallint, 0, true);
92

tabla4->FieldDefs->Add("Desplazamiento", ftFloat, 0, true);

//Crea la tabla
tabla4->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Condiciones de
frontera", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla4;
return ;
}

if(nrmp) {
//Ahora crea la tabla

try {
tabla5 = new TTable(this);
tabla5->DatabaseName = "Base de Datos Unidimensional";
tabla5->TableName = "RestriccionesMP.dbf";
tabla5->Active = false;

//Borra todos los campos de la tabla


tabla5->FieldDefs->Clear();

//Agrega las definiciones para los campos


tabla5->FieldDefs->Add("Beta1", ftFloat, 0, true);
tabla5->FieldDefs->Add("nodoQi", ftSmallint, 0, true);
tabla5->FieldDefs->Add("Beta2", ftFloat, 0, true);
tabla5->FieldDefs->Add("nodoQj", ftSmallint, 0, true);
tabla5->FieldDefs->Add("Beta3", ftFloat, 0, true);

//Crea la tabla
tabla5->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla5;
return ;
}

}
93

//Todo está concluido. Informar al usuario.

Screen->Cursor = crDefault;
//Desactiva el botón del ingreso de datos de los elementos finitos
Button1->Enabled = false;
MessageBox(Handle, "Las tablas han sido creadas satisfactoriamente", "Mensaje", 0);

//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource1->DataSet = tabla;
DBGrid1->DataSource = DataSource1;

DataSource2->DataSet = tabla2;
DBGrid2->DataSource = DataSource2;

DataSource3->DataSet = tabla3;
DBGrid3->DataSource = DataSource3;

if(ncf) {
DataSource4->DataSet = tabla4;
DBGrid4->DataSource = DataSource4;
}

if(nrmp) {
DataSource5->DataSet = tabla5;
DBGrid5->DataSource = DataSource5;
}

//Muestra la malla con su título


Label2->Visible = true;
Label3->Visible = true;
Edit2->Visible = true;
Label4->Visible = true;
Edit3->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Edit4->Visible = true;
if(ncf) Label11->Visible = true;
if(nrmp) Label12->Visible = true;

DBGrid1->Visible = true;
DBGrid2->Visible = true;
94

DBGrid3->Visible = true;
if(ncf) DBGrid4->Visible = true;
if(nrmp)DBGrid5->Visible = true;

//Abre la tabla
tabla->Active = true;
tabla2->Active = true;
tabla3->Active = true;
if(ncf) tabla4->Active = true;
if(nrmp)tabla5->Active = true;

//Coloca la tabla en modo de edición


tabla->Edit();
tabla2->Edit();
tabla3->Edit();
if(ncf) tabla4->Edit();
if(nrmp)tabla5->Edit();

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{
tabla->Active = true;
tabla2->Active = true;
tabla3->Active = true;

const int nn = Edit1->Text.ToInt();


B = new TMatriz[nn];
for(int i = 0; i<nn; i++)
B[i] = TMatriz(1,2);
tabla->First();
for(int i = 0; i<nn; i++) {
B[i].elementos[0][0] = -1.0/tabla->FieldByName("Longitud")->Value;
B[i].elementos[0][1] = 1.0/tabla->FieldByName("Longitud")->Value;
tabla->Next();
}

delTem = new TMatriz[n];


for(int i = 0; i<n; i++)
delTem[i] = TMatriz(2,1);

fn = new TMatriz[n];
for(int i = 0; i<n; i++)
fn[i] = TMatriz(2,1);
95

tabla->First();
for(int i = 0; i<nn; i++) {
delTem[i].elementos[0][0] = -(tabla->FieldByName("Módulo E")->Value)*(tabla-
>FieldByName("Area")->Value)*(tabla->FieldByName("Delta Temp")->Value)*(tabla-
>FieldByName("Alfa")->Value);
delTem[i].elementos[1][0] = -delTem[i].elementos[0][0];
tabla->Next();
}

q = new TMatriz[nn];
for(int i = 0; i<nn; i++)
q[i] = TMatriz(2,1);

 N = new TMatriz[nn];
for(int i = 0; i<nn; i++)
 N[i] = TMatriz(1,2);

K = new TMatriz[nn];
for(int i = 0; i<nn; i++)
K[i] = TMatriz(2,2);
tabla->First();
for(int i = 0; i<nn; i++) {
K[i].elementos[0][0] = (tabla->FieldByName("Area")->Value)*(tabla-
>FieldByName("Módulo E")->Value)/tabla->FieldByName("Longitud")->Value;
K[i].elementos[0][1] = -K[i].elementos[0][0];
K[i].elementos[1][0] = K[i].elementos[0][1];
K[i].elementos[1][1] = K[i].elementos[0][0];
tabla->Next();
}
tabla->First();
f = new TMatriz[nn];
for(int i = 0; i<nn; i++)
f[i] = TMatriz(2,1);
double ff = Edit2->Text.ToDouble();
for(int i = 0; i<nn; i++) {
f[i].elementos[0][0] = ff*(tabla->FieldByName("Area")->Value)*(tabla-
>FieldByName("Longitud")->Value)/2.0;
f[i].elementos[1][0] = f[i].elementos[0][0];
tabla->Next();
}
tabla->First();
T = new TMatriz[nn];
for(int i = 0; i<nn; i++)
T[i] = TMatriz(2,1);
double tt = Edit3->Text.ToDouble();
for(int i = 0; i<nn; i++) {
96

T[i].elementos[0][0] = tt*(tabla->FieldByName("Longitud")->Value)/2.0;
T[i].elementos[1][0] = T[i].elementos[0][0];
tabla->Next();
}
ng = Edit4->Text.ToInt();

P = new TMatriz(ng,1);

tabla2->First();
for(int i = 0; i<ng; i++) {
P->elementos[i][0] = tabla2->FieldByName("Cargas Puntuales")->Value;
tabla2->Next();
}

tabla3->First();
gl = new TMatriz[nn];
for(int i = 0; i<nn; i++)
gl[i] = TMatriz(2,1);
for(int i = 0; i<nn; i++) {
gl[i].elementos[0][0] = tabla3->FieldByName("Nodo 1")->Value;
gl[i].elementos[1][0] = tabla3->FieldByName("Nodo 2")->Value;
tabla3->Next();
}

TMatriz ST(ng,ng);

for(int i = 0; i<n; i++)


for(int j = 0; j<2; j++)
for(int k = 0; k<2; k++) {
int a = gl[i].elementos[j][0];
int b = gl[i].elementos[k][0];
ST.elementos[a-1][b-1] += K[i].elementos[j][k];
}

TMatriz F(ng,1);
for(int i = 0; i<n;i++)
for(int j = 0; j<2; j++) {
int a = gl[i].elementos[j][0];
g l[i].elementos[j][0];
F.elementos[a-1][0] +=
f[i].elementos[j][0]+T[i].elementos[j][0]+delTem[i].elementos[j][0];
}

F = F+(*P);

if(ncf) {
tabla4->Active = true;
tabla4->First();
97

C = 0;
for(int i = 0; i < ng; i++) {
if(C < ST.elementos[i][i])
C = ST.elementos[i][i];
}
C *= 10000;
//Modificación por los desplazamientos de las condiciones de frontera
for(int i = 0; i < ncf; i++) {
int k = tabla4->FieldByName("Nodo")->Value;
double u = tabla4->FieldByName("Desplazamiento")->Value;
ST.elementos[k-1][k-1] += C;
F.elementos[k-1][0] += C*u;
tabla4->Next();
}
}

//Modificación por las restricciones de multipunto


if(nrmp) {tabla5->Active = true;
tabla5->First();
}
for(int i = 0; i < nrmp; i++) {
double b1 = tabla5->FieldByName("Beta1")->Value;
int k = tabla5->FieldByName("nodoQi")->Value;
double b2 = tabla5->FieldByName("Beta2")->Value;
int m = tabla5->FieldByName("nodoQj")->Value;
ST.elementos[k-1][k-1] += C*b1*b1;
ST.elementos[k-1][m-1] += C*b1*b2;
ST.elementos[m-1][k-1] += C*b1*b2;
ST.elementos[m-1][m-1] += C*b2*b2;
tabla5->Next();
}

try {
rigidez = new TTable(this);
rigidez->DatabaseName = "Base de Datos Unidimensional";
rigidez->TableName = "rigido.dbf";
DataSource7->DataSet = rigidez;
DBGrid7->DataSource = DataSource7;

rigidez->Active = false;

//Borra todos los campos de la tabla


rigidez->FieldDefs->Clear();

//Agrega las definiciones para los campos


String cad;
for(int j = 0; j<ng; j++){
98

cad = "K_0_"+IntToStr(j);
rigidez->FieldDefs->Add(cad, ftFloat, 0, true);
}
//Crea la tabla
rigidez->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de rigidez", "Mensaje", 0);
Screen->Cursor = crDefault;
delete rigidez;
return ;
}

try {
fuerza = new TTable(this);
fuerza->DatabaseName = "Base de Datos Unidimensional";
fuerza->TableName = "force.dbf";
DataSource8->DataSet = fuerza;
DBGrid8->DataSource = DataSource8;

fuerza->Active = false;

//Borra todos los campos de la tabla


fuerza->FieldDefs->Clear();

//Agrega las definiciones para los campos

fuerza->FieldDefs->Add("Fuerzas", ftFloat, 0, true);

//Crea la tabla
fuerza->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de fuerzas", "Mensaje", 0);
Screen->Cursor = crDefault;
delete fuerza;
return ;
}
rigidez->Active = true;
fuerza->Active = true;

rigidez->Edit();
fuerza->Edit();
Label14->Visible = true;
Label15->Visible = true;
DBGrid7->Visible = true;
DBGrid8->Visible = true;
99

for(int i = 0; i<ng; i++){


fuerza->Append();
fuerza->FieldByName("Fuerzas")->Value = F.elementos[i][0];
fuerza->Next();
}
for(int i = 0; i<ng; i++){ rigidez->Append();
for(int j = 0; j<ng; j++){
String cad = "K_0_" +IntToStr(j);

rigidez->FieldByName(cad)->Value = ST.elementos[i][j];
}
rigidez->Next();
}

//Resolución del sistema de ecuaciones


double cc;
for(int k = 0; k<ng-1; k++){
for(int i = k + 1; i<ng; i++) {
cc = ST.elementos[i][k]/ST.elementos[k][k];
S T.elementos[i][k]/ST.elementos[k][k];
for(int j = k+1; j<ng; j++){
ST.elementos[i][j] = ST.elementos[i][j]-cc*ST.elementos[k][j];
}
F.elementos[i][0] = F.elementos[i][0] - cc*F.elementos[k][0];
}
}

F.elementos[ng-1][0] = F.elementos[ng-1][0]/ST.elementos[ng-1][ng-1];
for(int i = ng-2; i>=0; i--) {
cc = 1.0/ST.elementos[i][i];
F.elementos[i][0] = cc*F.elementos[i][0];
for(int k = i + 1 ; k<ng; k++){
F.elementos[i][0] =F.elementos[i][0]- cc*ST.elementos[i][k]*F.elementos[k][0];
}
}

for(int i = 0; i<n; i++) {


int k = gl[i].elementos[0][0];
int m = gl[i].elementos[1][0];
q[i].elementos[0][0] =F.elementos[k-1][0];
q[i].elementos[1][0] =F.elementos[m-1][0];
}

try {
Respuesta = new TTable(this);
100

Respuesta->DatabaseName = "Base de Datos Unidimensional";


Respuesta->TableName = "respuesta.dbf";
DataSource6->DataSet = Respuesta;
DBGrid6->DataSource = DataSource6;

Respuesta->Active = false;

//Borra todos los campos de la tabla


Respuesta->FieldDefs->Clear();

//Agrega las definiciones para los campos


Respuesta->FieldDefs->Add("Nodo", ftSmallint, 0, true);
Respuesta->FieldDefs->Add("Desplazam", ftFloat, 0, true);

//Crea la tabla
Respuesta->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Respuestas", "Mensaje", 0);
Screen->Cursor = crDefault;
delete Respuesta;
return ;
}

Screen->Cursor = crDefault;
MessageBox(Handle, "Las tabla de respuesta ha sido creada satisfactoriamente",
"Mensaje", 0);
Label13->Visible = true;
DBGrid6->Visible = true;

Respuesta->Active = true;

Respuesta->Edit();

for(int i = 0; i <ng; i++) {


Respuesta->Append();
Respuesta->FieldByName("Nodo")->Value = i+1;
Respuesta->FieldByName("Desplazam")->Value = F.elementos[i][0];
Respuesta->Next();
}
Button2->Enabled = false;

}
//---------------------------------------------------------------------------
101

void __fastcall TForm1::Salir1Click(TObject *Sender)


{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AcercaDelMEFClick(TObject *Sender)


{
AcercaDe->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)


{
TTable * esfuerzo;
try {
esfuerzo = new TTable(this);
esfuerzo->DatabaseName = "Base de Datos Unidimensional";
esfuerzo->TableName = "esfuerzo.dbf";
esfuerzo->Active = false;

//Borra todos los campos de la tabla


esfuerzo->FieldDefs->Clear();

//Agrega las definiciones para los campos


esfuerzo->FieldDefs->Add("Elemento", ftSmallint, 0, true);
esfuerzo->FieldDefs->Add("Esfuerzo", ftFloat, 0, true);

//Crea la tabla
esfuerzo->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete esfuerzo;
return ;
}

MessageBox(Handle, "Las tablade los esfuerzos ha sido creada satisfactoriamente",


"Mensaje", 0);
102

//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource9->DataSet = esfuerzo;
DBGrid9->DataSource = DataSource9;

Label16->Visible = true;
DBGrid9->Visible = true;

esfuerzo->Active = true;
esfuerzo->Edit();
tabla->First();
for(int i = 0; i<n; i++){
esfuerzo->Append();
TMatriz prod(1,1);
 prod = B[i]*q[i];
double esf = (tabla->FieldByName("Módulo E")->Value)*(prod.elementos[0][0]-
(tabla->FieldByName("Delta Temp")->Value)*(tabla->FieldByName("Alfa")->Value));
esfuerzo->FieldByName("Elemento")->Value = i+1;
esfuerzo->FieldByName("Esfuerzo")->Value = esf;
esfuerzo->Next();
tabla->Next();
}
Button3->Enabled = false;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)


{
AnsiString cad, cad2;
cad2 = InputBox("Desplazamiento", "Ingrese el número del elemento", "");
int num = cad2.ToInt();
cad = InputBox("Desplazamiento", "Ingrese la posición con respecto del elemento","");
double x =cad.ToDouble();
double e;
tabla->First();
for(int i= 0; i<num-1; i++)
tabla->Next();
e = 2.0*x/(tabla->FieldByName("Longitud")->Value) -1.0;
 N[num-1].elementos[0][0] = (1.0 - e)/2.0;
 N[num-1].elementos[0][1] = (1.0 + e)/2.0;
TMatriz prod(1,1);
 prod = N[num-1]*q[num-1];
ShowMessage(AnsiString(prod.elementos[0][0]));

}
//---------------------------------------------------------------------------
103

void __fastcall TForm1::Imprimir1Click(TObject *Sender)


{
QuickReport1->Print();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)


{
AnsiString cad;
cad = InputBox("Elementos Finitos", "Ingrese el nombre del P roblema","");
Label17->Caption = cad;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)


{
for(int i = 0; i < n; i++)
fn[i] = K[i]*q[i];
try {
funo = new TTable(this);
funo->DatabaseName = "Base de Datos Unidimensional";
funo->TableName = "fuerzaNodo.dbf";
funo->Active = false;

//Borra todos los campos de la tabla


funo->FieldDefs->Clear();

//Agrega las definiciones para los campos


funo->FieldDefs->Add("Elemento", ftSmallint, 0, true);
funo->FieldDefs->Add("Fuerza1", ftFloat, 0, true);
funo->FieldDefs->Add("Fuerza2", ftFloat, 0, true);

//Crea la tabla
funo->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete funo;
return ;
}

MessageBox(Handle, "Las tabla de las Fuerzas en los nodos ha sido creada


satisfactoriamente", "Mensaje", 0);
104

//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource10->DataSet = funo;
DBGrid10->DataSource = DataSource10;

Label18->Visible = true;
DBGrid10->Visible = true;

funo->Active = true;
funo->Edit();
for(int i = 0; i<n; i++){
funo->Append();
funo->FieldByName("Elemento")->Value = i+1;
funo->FieldByName("Fuerza1")->Value = fn[i].elementos[0][0];
funo->FieldByName("Fuerza2")->Value = fn[i].elementos[1][0];
funo->Next();
}
Button4->Enabled = false;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::VistaPrevia1Click(TObject *Sender)


{
QuickReport1->Preview();
}
//---------------------------------------------------------------------------

También podría gustarte