Académique Documents
Professionnel Documents
Culture Documents
Pocedee de Calcul
Pocedee de Calcul
ANNE 1999/2000
RAPPORT FINAL
PFE LMS ESP 1
Prsent par :
Alexis MEUNIER
Professeurs responsables :
M. BARRACO
M. HERNNDEZ FRAS
M. PETUYA ARCOCHA
ANNEE : 1999-2000
GROUPE : LMS
NOMBRE DE PAGES :
16 + 72
FORTRAN
COEFFICIENTS DINFLUENCE
DERIVATION NUMERIQUE
CUBIC SPLINES
LIBRE
DATE :
Signature :
1. REMERCIEMENTS
PFE 2000
MEUNIER
Page 3
2. SOMMAIRE
1. REMERCIEMENTS ............................................................................... 3
2. SOMMAIRE ........................................................................................... 4
3. INTRODUCTION ................................................................................... 5
4. CONTEXTE ............................................................................................ 6
4.1. Paris ...............................................................................................................6
4.2. Bilbao ............................................................................................................ 6
PFE 2000
MEUNIER
Page 4
3. INTRODUCTION
Ce Projet de Fin dEtudes a t ralis dans le cadre des changes entre l Ecole
Nationale Suprieure dArts et Mtiers (ENSAM) et lEcole Suprieure dIngnieurs de
Bilbao (ETSII e IT)
Connaissances ncessaires :
Thorie de la mcanique,
Mthode des coefficients dinfluence,
Mthodes de drivation numrique,
Programmation avec FORTRAN Powerstation de Microsoft,
Affichage graphique sur ordinateurs.
PFE 2000
MEUNIER
Page 5
4. CONTEXTE
4.1. Paris
Pendant le premier semestre, le projet a progress assez lentement puisquune
journe par semaine lui tait consacr. Il tait difficile de se familiariser avec le Fortran
car lENSAM ne possde pas le logiciel en question. Par consquent, mon travail
Paris a t essentiellement thorique : recherche et consultation de livres et revues
scientifiques sur le langage Fortran et sur la mthode des coefficients dinfluence.
4.2. Bilbao
Pour commencer, je me suis familiaris avec le langage Fortran en utilisant le
programme FORTRAN Powerstation de Microsoft, et en particulier avec la
programmation graphique.
Ensuite, jai commenc utiliser et tudier le programme existant pour
comprendre comment il fonctionnait et savoir comment inclure ma partie lintrieure.
Aprs, jai cherch diffrentes mthodes dinterpolation linaire et de drivation
numrique et jai choisi celles qui me semblaient les plus appropries mon cas avec
lopinion de professeurs des dpartements dingnierie mcanique et de mathmatiques.
Pour finir, jai commenc programmer ma partie et linclure dans le
programme principal.
FORTRAN :
Le programme t dvelopp sur Fortran Powerstation de Microsoft qui offre
la possibilit dcrire des programmes qui permettent de faire de laffichage graphique.
De ce point de vue, ce langage est plus efficace que dautres (comme le C++ par
exemple).
PFE 2000
MEUNIER
Page 6
Programme principal :
Le programme principal a t dvelopp par des tudiants de lEcole Suprieure
dIngnieurs de Bilbao. Il permet de simuler des mcanismes plans un degr de
libert.
Il existe une premire partie pour dessiner le systme. On peut crer un nouveau
systme (avec le clavier ou la souris) et le sauvegarder pour le conserver et louvrir plus
tard. Pour crer un nouveau modle, il faut crer des points et les unir avec des lments
(barres) et insrer des liaisons (rotules, rotules fixes, glissires...).
Aprs, il faut revenir au menu initial o on peut intervenir sur le systme par
diffrentes options.
Le menu editar permet dajuster le dessin, de zoomer ou de revenir la
positon antrieure.
Le menu problemas de posiciones permet de donner une position initiale,
directe, inverse ou de donner des positions successives (par incrment). On peut aussi
rpter le mouvement ou linterrompre.
Le menu trayectorias permet de voir ou deffacer les trajectoires.
Le menu herramientas permet de choisir ou de montrer la chemin, de dplacer
un nud et de montrer les erreurs.
Les deux autres menus correspondent aux deux parties de calcul de vitesses et
acclrations avec la mthode MEF et la mthode des coefficients dinfluence (ma
partie).
Ma partie du programme :
Pour utiliser mon menu (anlisis), lutilisateur doit crer ou ouvrir un systme
un degr de libert. Aprs, il faut utiliser le menu posiciones sucesivas et donner un
incrment pour langle dentre pour que la barre dentre bouge.
Alors, on peut choisir ltude de la vitesse ou de lacclration dans le menu
Anlisis
Les deux parties de mon programme, cest--dire le calcul des vitesses et des
acclrations sont semblables. Cest pourquoi il sera seulement dtaille la partie sur les
vitesses par la suite.
Les mthodes, structures et fonctionnements sont dtaills plus loin.
PFE 2000
MEUNIER
Page 7
d
dt d
Ainsi on peut dterminer le terme :
d
dt
qui nest autre que la vitesse de la barre tudie.
PFE 2000
MEUNIER
Page 8
6. Drive numrique
f 'i =
Points mdians (i = 3 i = n-2) :
f i + 2 + 8 f i + 1 8 f i 1 + f i 2
12h
f 'i =
Derniers points (i = n-1, n) :
f 'i =
11 f i 18 f i 1 + 9 f i 2 2 f i 3
6h
f i + 3 + 4 f i + 2 5 f i +1 + 2 f i
h2
f i + 2 + 16 f i +1 30 f i + 16 f i 1 f i 2
12h 2
PFE 2000
MEUNIER
2 f i 5 f i 1 + 4 f i 2 f i 3
h2
Page 9
Etape 3
Etape 4
Etape 5
Etape 6
Etape 7
ARRET.
PFE 2000
MEUNIER
Page 10
Voici le processus de calcul simplifi des vitesses tel quil est effectu par le
programme (le listing est prsent en annexe).
1. Identification de la barre analyser.
2. Calcul de langle de la barre dentre chaque position.
3. Calcul des angles extrmes de la barre dentre.
4. Calcul de langle de la barre tudie chaque position.
5. Rangement par ordre croissant des angles de la barre tudie en fonction des angles
de la barre dentre (ncessaire pour le bon fonctionnement du programme).
6. Calcul des coefficients dinfluence des vitesses avec lutilisation des formules de
drivation numrique.
7. Introduction de la loi dentre (vitesse ou acclration constante) laide de boites de
dialogue.
8. Calcul des vitesses laide des donnes prcdentes.
9. Calcul des vitesses mini et maxi de la barre tudie.
10. Interpolation avec les cubic splines.
11. Dfinition des caractristiques de la fentre daffichage.
12. Dfinition des caractristiques du graphique.
13. Tracer de la courbe.
PFE 2000
MEUNIER
Page 11
3. Slectionner :
Project Workspace
OK
ouverture dune fentre
6. Slectionner :
/ Insert / Files into Project...
ouverture dune fentre
8. Slectionner :
/ Build / Build nombre.exe
9. Slectionner :
/ Build / Execute nombre.exe
PFE 2000
MEUNIER
Page 12
6. Lancer lanalyse :
Slctionner / Anlisis / velocidades
ou / Anlisis / aceleraciones
9. Donnes :
Introduire le module de la vitesse (ou de lacclration) de la barre dentre.
Celui-ci doit tre positif puisque le sens du mouvement a dj t dfinit lors de
lintroduction de lincrment.
OK
PFE 2000
MEUNIER
Page 13
10. Graphique :
Il souvre une fentre dans laquelle est affich le graphique de la vitesse (ou
acclration) de la barre tudie en fonction de langle de la barre dentre.
Les informations sont les suivantes :
Deux axes :
Laxe des abscisses reprsente les angles de la barre dentre (valeurs croissantes
de la gauche vers la droite) pour une vitesse (ou acclration) nulle.
Laxe des ordonnes reprsente la vitesses(ou lacclration) de la barre tudie
et est trac pour langle minimum de la barre dentre.
Quatre valeurs :
Angle minimum de la barre dentre,
Angle maximum de la barre dentre,
Vitesse ou acclration minimum,
Vitesse ou acclration maximum,
La courbe des vitesses (ou acclrations) en fonction des angles de la
barre dentre.
PFE 2000
MEUNIER
Page 14
Position
Angle
barre entre
Vitesse
(coef influ)
Vitesse
(MEF)
1
2
3
4
5
6
7
8
9
10
32,49
33,49
34,49
35,49
36,49
37,49
38,49
39,49
40,49
41,49
-0,889553563
-0,932346076
-0,968775755
-1,003841169
-1,036586840
-1,067430397
-1,096464126
-1,123400773
-1,150205335
-1,175149838
-0,890645021
-0,931197825
-0,968803242
-1,003840914
-1,036589589
-1,067356852
-1,096358699
-1,123851416
-1,150015803
-1,175025163
Il est noter que les valeurs donnes pour la mthode des coefficients
dinfluence sont celles avant interpolation (sans quoi il naurait pas t possible davoir
des valeurs correspondant au mmes angles).
On peut sapercevoir que pour un systme un degr de libert (celui tant assez
simple), les deux mthodes donnent des rsultats assez similaires.
Par consquent, il faudra choisir une mthode plutt que lautre en fonction du
dveloppement futur du programme et aprs avoir test des cas particuliers avec les
deux mthodes afin de conserver celle qui fonctionne le mieux.
PFE 2000
MEUNIER
Page 15
11. LIMITES
PFE 2000
MEUNIER
Page 16
12. CONCLUSION
De plus, les professeurs et les lves de lcole ont toujours t trs disponibles
quand javais besoin de leur aide. Je tiens les en remercier, et grce eux, mon sjour
Bilbao fut dun grand plaisir.
PFE 2000
MEUNIER
Page 17
Procedimiento de clculo de
velocidades y aceleraciones
en mecanismos planos
Alumno :
Profesores :
Alexis MEUNIER
PFE 2000
MEUNIER
Page 18
Procedimiento de clculo de
velocidades y aceleraciones
en mecanismos planos
Alumno :
Profesores :
Alexis MEUNIER
PFE 2000
MEUNIER
Page 19
1. AGRADECIMIENTOS
PFE 2000
MEUNIER
Pgina 3
2. INDICE
1. AGRADECIMIENTO ............................................................................. 3
2. INDICE ................................................................................................... 4
3. INTRODUCCIN ................................................................................... 6
4. CONTEXTO ........................................................................................... 8
4.1. Pars .............................................................................................................. 8
4.2. Bilbao ............................................................................................................ 8
PFE 2000
MEUNIER
Pgina 4
PFE 2000
MEUNIER
Pgina 5
3. INTRODUCCIN
Este proyecto de fin de carrera fue realizado con arreglo a los intercambios entre
la Escuela Nacional Superior de Ingenieros ENSAM y la Escuela Superior de
Ingenieros de Bilbao (ETSII e IT).
El tema es el siguiente :
Procedimiento de clculo de velocidades y aceleraciones en mecanismos
planos de un grado de libertad con el mtodo de los coeficientes de influencia.
PFE 2000
MEUNIER
Pgina 6
Conocimientos necesarios :
Teora de mecanismos,
Mtodo de los coeficientes de influencia,
Mtodos de derivacin numrica,
Programacin en FORTRAN Powerstation de Microsoft,
Grficos con computadoras.
PFE 2000
MEUNIER
Pgina 7
4. CONTEXTO
4.1. Pars
Durante el primer semestre, el proyecto progreso lentamente ya que tena un da
cada semana para adelantarlo. Fue muy difcil familiarizarme con el FORTRAN porque
la ENSAM no tena este tipo de programa. Por consiguiente, mi trabajo en Pars fue
esencialmente un trabajo de investigacin y de estudio bibliogrfico. Consult libros
sobre la programacin en lenguaje FORTRAN y consult libros y revistas cientficas
sobre el mtodo de los coeficientes de influencia.
4.2. Bilbao
Al principio, me familiaric con el lenguaje FORTRAN, utilizando el programa
FORTRAN Powerstation de Microsoft, especialmente con la programacin grfica.
Despus, empec utilizar el programa existente para entender como funcionaba y
saber como incluir mi parte en este.
Luego, busqu mtodos de interpolacin linear y mtodos de derivacin
numrica y elige la ms apropiada con mi caso con la opinin de algunos profesores de
los departamentos de ingeniera mecnica y de matemtica.
Al fin, empec programar mi parte e incluirlo en el programa principal.
FORTRAN :
El programa fue programado con Fortran Powerstation de Microsoft que ofrece
la posibilidad de escribir programas que permiten hacer visualizacin grfica.
De este punto de vista, este lenguaje es ms eficiente que otros (como el C++
por ejemplo).
PFE 2000
MEUNIER
Pgina 8
Programa principal :
El programa principal fue desarrollado por algunos alumnos de la Escuela
Superior de Ingenieros de Bilbao. Permite simular mecanismos planos de un grado de
libertad con pares de rotacin y prismticos.
Hay una primera parte para dibujar sistemas. Se puede crear un nuevo sistema
(con ratn o teclado) y salvarlo para conservarlo y abrirlo despus. Para crear un nuevo
modelo, hay que crear puntos, unirlos con elementos (barras, ternario, cuaternario,
deslizadera) y poner uniones (rotulas, rotulas fijas).
Despus, se vuelve al men principal donde se puede intervenir sobre el sistema
con diferentes opciones.
El men editar permite ajustar, hacer un zoom o volver en la posicin anterior.
El men problemas de posiciones permite dar una posicin inicial, directo,
inverso o dar posiciones sucesivas. Tambin se puede repetir el movimiento o detenerlo.
El men trayectorias permite ver o borrar trayectorias.
El men herramientas permite elegir o mostrar el camino, mover un nudo y
mostrar errores.
Los dos otros mens corresponden a los dos partes de clculo de velocidades y
aceleraciones con el mtodo MEF y con el mtodo de los coeficientes de influencia (mi
parte).
PFE 2000
MEUNIER
Pgina 9
5. Diferenciacin numrica
Se construye una hoja corrugada para techado, usando una mquina que
comprime una hoja plana de aluminio, y la transforma en una hoja cuya seccin
transversal tiene la forma de onda de la funcin seno.
Se necesita hoja corrugada de 4 pies de largo cuyas ondas tienen una altura de 1
plg. desde la lnea central, y cada onda tiene aproximadamente un periodo de 2 plg. El
problema de calcular la longitud de la primera hoja plana consiste en determinar la
longitud de la onda dada por f(x) = sen x de x = 0 a x = 48 plg. Por el clculo sabemos
que esta longitud es
L=
48
48
df ( x )
2
1+
dx = 0 1 + (cos x ) dx,
dx
de modo que el problema consistir en evaluar esta integral. Aunque la funcin seno es
una de las ms comunes en las matemticas, el clculo de su longitud da origen a una
integral elptica de segunda clase, la cual no puede evaluarse con mtodos normales.
Una de las razones de que aproximemos un conjunto arbitrario de datos mediante
polinomios algebraicos es que, dada una funcin continua cualquiera que est definida
en un intervalo cerrado, existir un polinomio suficientemente cercano a la funcin en
todos los puntos del intervalo. Por lo dems, las derivadas de los polinomios se obtienen
y se evalan fcilmente. Por ello, no debera sorprendernos que la mayora de los
procedimientos para aproximar integrales y derivadas usen polinomios que aproximan
la funcin.
La derivada de la funcin f en x0 es
f ' ( x0 ) =
PFE 2000
MEUNIER
lim f ( x0 + h ) f ( x0 )
h0
h
Pgina 10
Para aproximar este nmero, supongamos primero que x0 (a, b), donde f
C [a, b], y que x1 = x0 + h para alguna h 0 que es lo bastante pequea para asegurarnos
de que x1 [a, b]. Construimos el primer polinomio de Lagrange P0,1(x) para f
determinada por x0 y x1 con su trmino de error:
2
f ( x0 ) = P0,1 ( x ) +
=
( x x0 )( x x1 )
f ' ' ( ( x )).
2!
f ( x0 )( x x0 h ) f ( x0 + h )( x x0 )
+
h
h
+
( x x0 )( x x0 h )
f ' ' ( ( x ))
2
f ' ( x) =
f ( x0 + h ) f ( x0 )
( x x0 )( x x0 h )
f ' ' ( ( x ))
+ Dx
h
2
f ( x0 + h ) f ( x0 ) 2( x x0 ) h
+
f ' ' ( ( x ))
h
2
+
( x x0 )( x x0 h )
Dx ( f ' ' ( ( x ))),
2
de modo que
f ' ( x)
f ( x0 + h ) f ( x0 )
.
h
Un problema que presenta esta frmula cuando aproximamos f(x) para los
valores arbitrarios de x radica en que carecemos de informacin sobre Dxf((x)) = f
((x)).(x), por lo cual no podemos estimar el error de truncamiento. Pero cuando x es
x0 el coeficiente de Dxf((x)) ser cero y la frmula se simplifica como sigue
(1)
f ' ( x) =
f ( x0 + h ) f ( x0 ) h
f ' ' ( ).
h
2
PFE 2000
MEUNIER
Pgina 11
f(1.8+h)
0.1
0.01
0.001
f (1.8 + h ) f (1.8)
h
0.64185389
0.59332685
0.58834207
|h |
2(1.8) 2
0.5406722
0.5540180
0.5554013
0.0154321
0.0015432
0.0001543
Puesto que f(x) = 1/x, el valor exacto de f(1.8) es 0.555 y las cotas de error son
adecuados.
Para obtener frmulas de aproximacin a la derivada ms generales, supongamos
que {x0, x1,...,xn} son (n + 1) nmeros distintos en algn intervalo I y que f Cn+1(I).
n
f ( x ) = f ( xk ) Lk ( x ) +
k =0
( x x0 )...( x xn ) ( n +1)
f
( ( x ))
( n + 1)!
PFE 2000
MEUNIER
Pgina 12
( x x0 )...( x xn )
Dx f ( n +1) ( ( x )) .
( n + 1)!
f ' ( x j ) = f ( xk ) Lk ' ( x j ) +
(2)
k =0
f ( n +1) ( ( x j )) n
( x j xk ).
(n + 1)! k = 0
k j
( x x1 )( x x2 )
, tenemos
( x0 x1 )( x0 x2 )
L' 0 ( x ) =
2 x x1 x2
.
( x0 x1 )( x0 x2 )
De manera anloga,
L'1 ( x ) =
2 x x0 x2y
( x1 x0 )( x1 x2 )
L' 2 ( x ) =
2 x x0 x1
.
( x2 x0 )( x2 x1 )
( x0 x1 )( x0 x2 )
( x1 x0 )( x1 x2 )
2
2 x j x0 x1 1 ( 3)
+ f ( x2 )
+
f
(
)
j ( x j xk ),
6
(
x
x
)(
x
x
)
k =0
0
2
1
2
k j
PFE 2000
MEUNIER
Pgina 13
Las tres frmulas de la ecuacin (3) son de gran utilidad si los nodos son
equidistantes, es decir, cuando
x1 = x0 + h y x2 = x0 + 2h, para alguna h0.
En el resto de esta seccin supondremos que el espaciamiento de los nodos es el mismo.
Al utilizar la ecuacin (3) con xj = x0, x1 = x0 + h y con x2= x0 + 2h
obtendremos
2
1 3
1
h ( 3)
f ' ( x0 ) = f ( x0 ) + 2 f ( x1 ) f ( x2 ) +
f ( 0 ).
h 2
2
3
2
1 1
1
h ( 3)
f
(
x
)
+
f
(
x
)
f (1 ),
0
2
h 2
2
6
y para xj = x2,
f ' ( x2 ) =
2
1 1
3
h ( 3)
f
(
x
)
2
f
(
x
)
+
f
(
x
)
+
f ( 2 ).
0
1
2
h 2
2
3
2
1 3
1
h ( 3)
f
(
x
)
+
2
f
(
x
+
h
)
f
(
x
+
2
h
)
+
0
0
0
3 f ( 0 ),
h 2
2
f ' ( x0 + h ) =
f ' ( x0 + 2h ) =
2
1 1
1
h ( 3)
f
(
x
)
+
f
(
x
+
2
h
)
0
0
6 f (1 ), y
h 2
2
2
1 1
3
h ( 3)
f
(
x
)
2
f
(
x
+
h
)
+
f
(
x
+
2
h
)
+
0
0
0
3 f ( 2 ).
h 2
2
PFE 2000
MEUNIER
Pgina 14
f ' ( x0 ) =
2
1
[ 3 f ( x0 ) + 4 f ( x0 + h) f ( x0 + 2h)] + h f ( 3) (0 ),
2h
3
f ' ( x0 ) =
f ' ( x0 ) =
2
1
[ f ( x0 h) + f ( x0 + h )] h f ( 3) (1 ), y
2h
6
2
1
[ f ( x0 2h) 4 f ( x0 h ) + 3 f ( x0 )] + h f (3) ( 2 )
2h
3
Finalmente ntese que, como podemos obtener la ltima ecuacin a partir de la primera
con slo reemplazar h con -h, en realidad tenemos slo dos frmulas:
(4)
f ' ( x0 ) =
2
1
[ 3 f ( x0 ) + 4 f ( x0 + h) f ( x0 + 2h)] + h f ( 3) (0 ),
2h
3
f ' ( x0 ) =
2
1
[ f ( x0 + h) f ( x0 h)] h f ( 3) (1 ),
2h
6
PFE 2000
MEUNIER
Pgina 15
f ' ( x0 ) =
4
1
[ f ( x0 2h) 8 f ( x0 + h ) + 8 f ( x0 + h) f ( x0 + 2h)] + h f (5) ( ).
12h
30
Otra frmula de cinco puntos de gran utilidad, sobre todo en lo relacionado con
la interpolacin de splines cbicos, es la siguiente:
f ' ( x0 ) =
1
[ 25 f ( x0 ) + 48 f ( x0 + h) 36 f ( x0 + 2h) + 16 f ( x0 + 3h) 3 f ( x0 + 4h)]
12h
h 4 ( 5)
+
f ( )
5
(7)
2 f i + 3 9 f i + 2 + 18 f i +1 11 f i
6h
Medio :
f 'i =
f i + 2 + 8 f i + 1 8 f i 1 + f i 2
12h
Fin :
f 'i =
PFE 2000
MEUNIER
11 f i 18 f i 1 + 9 f i 2 2 f i 3
6h
Pgina 16
f i + 3 + 4 f i + 2 5 f i +1 + 2 f i
h2
Medio :
f ' 'i =
f i + 2 + 16 f i +1 30 f i + 16 f i 1 f i 2
12h 2
Fin :
f ' 'i =
PFE 2000
MEUNIER
2 f i 5 f i 1 + 4 f i 2 f i 3
h2
Pgina 17
Pgina 18
posible.
Vamos a estudiar la aproximacin por medio de polinomios fragmentarios que
no requieren informacin sobre la derivada, salvo, quiz, en los extremos del intervalo
donde se aproxima la funcin.
El tipo ms simple de funcin de polinomio fragmentario diferenciable en un
intervalo entero [x0, xn] es la funcin obtenida al ajustar un polinomio cuadrtico entre
cada par consecutivo de nodos. Esto se hace construyendo una cuadrtica en [x0, x1] que
concuerde con la funcin en xo y en x1 otra cuadrtica en [x1, x2] que concuerde con la
funcin en x1 y en x2 y as sucesivamente. Un polinomio cuadrtico general tiene tres
constantes arbitrarias el trmino constante, el coeficiente de x y el coeficiente de x2
y nicamente se requieren dos condiciones para ajustar los datos en los extremos de
cada intervalo, por ello, existe una flexibilidad que permite seleccionar la cuadrtica de
modo que la interpolante tenga una derivada continua en [x0, xn]. El problema de este
procedimiento se presenta cuando hay que especificar las condiciones referentes a la
derivada de la interpolante en los extremos x0 y xn. No hay constantes suficientes para
cerciorarse de que se satisfagan las condiciones.
La aproximacin polinmica fragmentaria ms comn utiliza polinomios entre
cada par consecutivo de nodos y recibe el nombre de interpolacin de splines cbicos.
Un polinomio cbico general contiene cuatro constantes; as pues, el procedimiento del
trazador cbico ofrece suficiente flexibilidad para garantizar que el interpolante no slo
sea continuamente diferenciable en el intervalo, sino que adems tenga una segunda
derivada continua en el intervalo. Sin embargo, en la construccin del trazador cbico
no se supone que las derivadas del interpolante concuerdan con las de la funcin, ni
siquiera en los nodos.
Dada una funcin f definida en [a, b] y un conjunto de nodos a = x0 < x1 < ... xn =
b un interpolante de trazador cbico S para f es una funcin que cumple con las
condiciones siguientes:
a. S(x) es un polinomio cbico, denotado Sj(x), en el subintervalo [x1, xj+1] para
cada j = 0, 1,..., n-1;
b. S(xj) = f(xj) para cada j = 0, 1,..., n;
c. Sj+1(xj+1) = Sj(xj+1) para cada j = 0, 1,..., n - 2;
d. Sj+1(xj+1) = Sj(xj+1) para cada j = 0, 1,..., n - 2;
c. Sj+1(xj+1) = Sj(xj+1) para cada j = 0, 1,..., n - 2;
f. Se satisface uno de los siguientes conjuntos de condiciones de frontera
S(x0) = S(xn) = 0 (frontera libre o natural)
S(x0) = S(x0) = 0 y S(xn) = f(xn) (frontera sujeta).
Aunque los splines cbicos se definen con otras condicione s de frontera, las
condiciones anteriores son suficientes en este caso. Cuando se presentan las condiciones
de frontera libre, el trazador recibe el nombre de trazador natural, y su grfica se
aproxima a la forma que adoptara una varilla larga y flexible si la hiciramos pasar por
los puntos de datos {(xo,f(xo)),(x1,f(x1)),...,(xn,f(xn))}.
PFE 2000
MEUNIER
Pgina 19
PFE 2000
MEUNIER
Pgina 20
(2)
para cada j = 0, l,..., n-1.
Al definir cn = S(xn)/2 y al aplicar la condicin (e), se obtiene otra relacin entre los
coeficientes de S,. En este caso,
(3)
cj+1 = cj + 3djhj
bj =
1
(a j +1 a j ) h j (2c j + c j+1 )
hj
3
1
(a j a j 1 ) h j1 (2c j1 + c j )
h j 1
3
PFE 2000
MEUNIER
h j 1c j 1 + 2(h j 1 + h j )c j + h j c j +1 =
3
(a j +1 a j ) 3 (a j + a j 1 ),
hj
h j 1
Pgina 21
para cada j = 1, 2,..., n - 1. Este sistema contiene slo {c j }j =0 como incgnitas, ya que
n
valores de f en stos.
Ntese que una vez que se conocen los valores de {c j }j =0 , encontrar el resto de las
n
n 1
Demostracin :
En este caso, las condiciones de frontera significan que cn = S(xn)/2 = 0 y que
0 = S(x0) = 2c0 + 6d0(xo -x0);
as que c0 = 0.
Las dos ecuaciones c0 = 0 y cn = 0 junto con las ecuaciones de (7) producen un sistema
lineal descrito por la ecuacin vectorial Ax = b, donde A es la matriz de (n + 1) por
(n+1)
Pgina 22
SALIDA
j =
3
(ai +1 ai ) 3 (ai + ai +1 )
hj
hi 1
Paso 3 Tome l0 = 1; (Pasos 3,4,5, y parte del paso 6 resuelven un sistema lineal
tridiagonal
utilizando el mtodo descrito en el algoritmo 6.7.)
= 0;
zo = 0.
Paso4 Para i = 1, 2,..., n-l
Tome li = 2(xi+1 xi-1) h i-1- i-1;
i = hi / li;
zi = (i - hi-1zi-1) / li.
PFE 2000
MEUNIER
Pgina 23
Paso5 Tome ln = 1;
zn = 0;
cn = 0.
Paso6 Para j = n-1, n-2,..., 0
Tome cj = zj jcj+1;
bj = (aj+1 - aj) / hj hj (cj+1 2cj) / 3;
di = (cj+1 - cj) / (3hj).
Paso 7 SALIDA (aj, bj, cj, dj, para j = 0, 1,..., n-1);
PARE.
Teorema
Si f est definida en a = x0 <x1 < ... <xn = b, y si es diferenciable en a y en b, entonces f
tendr un interpolante de trazador sujeto nico en los nodos x0, x1l,..., xn, es decir, un
interpolante de trazador que cumple las condiciones de frontera S(a) = f(a) y S(b) =
f(b).
Demostracin
Al aplicar el hecho de que S(a) = f(x0) = b0, podemos ver que la ecuacin (3.21) con j
= 0 implica que
f ' (a ) =
a1 a0 h0
( 2c0 + c1 )
h0
3
En consecuencia,
2h0c0 + h0c1 +
3
(a1 a0 ) 3 f ' (a )
h0
De manera semejante,
F(b) = bn = bn-1 + hn-1 ( cn-1 + cn),
de modo que la ecuacin (6) con j = n - 1 implica que
f ' (b) =
PFE 2000
MEUNIER
an an 1 hn 1
(2cn 1 + cn ) + hn 1 (cn 1 + cn )
hn 1
3
a an 1 hn 1
= n
( cn 1 + 2cn ),
hn 1
3
Pgina 24
y que
hn 1cn 1 + 2hn 1cn = 3 f ' (b)
3
hn 1
( a1 an 1 ).
3
(a1 a0 ) 3 f ' ( a )
h0
y
hn 1cn 1 + 2hn 1cn = 3 f ' (b)
3
( an an 1 )
hn 1
PFE 2000
MEUNIER
Pgina 25
EJEMPLO
La figura muestra a un joven pato en pleno vuelo. Para aproximar el perfil de la parte
superior del pato, seleccionamos algunos puntos a lo largo de la curva por donde
queremos que pase la curva de aproximacin.
0.9 1.3
1.9
2.1
2.6
3.0
3.9
4.4
F(x)
1.3 1.5
1.85 2.1
2.6
2.7
2.4
4.7
5.0
6.0
7.0
2.25 2.3
8.0
9.2
0.9
0.7
0.6
0.5
0.4
Al utilizar el algoritmo para generar el trazador cbico libre con estos datos, se
obtienen los coeficientes que aparecen en la tabla. Esta curva de trazador es casi
idntica al perfil, como se observa en la figura siguiente.
PFE 2000
MEUNIER
Pgina 26
0.25
j
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PFE 2000
MEUNIER
xj
aj
bj
cj
dj
0.9
1.3
1.9
2.1
2.6
3.0
3.9
4.4
4.7
5.0
6.0
7.0
8.0
9.2
10.5
11.3
11.6
12.0
12.6
13.0
13.3
1.3
1.5
1.85
2.1
2.6
2.7
2.4
2.15
2.05
2.1
2.25
2.3
2.25
1.95
1.4
0.9
0.7
0.6
0.5
0.4
0.25
5.40
0.42
1.09
1.29
0.59
-0.02
-0.50
-0.48
-0.07
0.26
0.08
0.01
-0.14
-0.34
-0.53
-0.73
-0.49
-0.14
-0.18
-0.39
0.00
-0.30
1.41
-0.37
-1.04
-0.50
-0.03
0.08
1.27
-0.16
-0.03
-0.04
-0.11
-0.05
-0.10
-0.15
0.94
-0.06
0.00
-0.54
-0.25
0.95
-2.96
-0.45
0.45
0.17
0.08
1.31
-1.58
0.04
0.00
-0.02
0.02
-0.01
-0.02
1.21
-0.84
0.04
-0.45
0.60
Pgina 27
En esta parte, voy a explicar la estructura del programa que permite calcular las
velocidades.
PFE 2000
MEUNIER
Pgina 28
PFE 2000
MEUNIER
Pgina 29
PFE 2000
MEUNIER
Pgina 30
PFE 2000
MEUNIER
Pgina 31
El programa llama ventanas creadas con la funcin dialog box donde saca valores
introducidas por el usuario y que sern utilizadas luego. Aqu siguen estas ventanas.
PFE 2000
MEUNIER
Pgina 32
PFE 2000
MEUNIER
Pgina 33
d
dt d
Se calcula :
d
dt
As, se puede deducir :
d
dt
Ahora, tenemos la velocidad de la barra estudiada.
if (movt.eq.1) then
do i=1,control(1)
t(i)=abs(sqrt(2*(ang_ent(i)-ang_ent(1))/var_ent))
end do
if (entradas(num_entradas)%incremento.lt.0) then
do i=1,control(1)
tempo3(i)=t(control(1)+1-i)
end do
do i=1,control(1)
t(i)=tempo3(i)
end do
end if
do i=1,control(1)
vit(i)=vel_barra(i)*var_ent*t(i)
if (entradas(num_entradas)%incremento.lt.0) then
vit(i)=-vit(i)
end if
end do
else
do i=1,control(1)
vit(i)=vel_barra(i)*var_ent
if (entradas(num_entradas)%incremento.lt.0) then
vit(i)=-vit(i)
end if
end do
end if
PFE 2000
MEUNIER
Pgina 34
PFE 2000
MEUNIER
Pgina 35
PFE 2000
MEUNIER
Pgina 36
if (vmax.lt.0.AND.vmin.lt.0) then
vmax=0
end if
PFE 2000
MEUNIER
Pgina 37
PFE 2000
MEUNIER
Pgina 38
3. Seleccionar :
Project Workspace
OK,
Se abre una ventana,
PFE 2000
MEUNIER
Pgina 39
6. Seleccionar :
/ Insert / Files into Project...
Se abre una ventana,
8. Seleccionar :
/ Build / Build nombre.exe
9. Seleccionar :
/ Build / Execute nombre.exe
PFE 2000
MEUNIER
Pgina 40
PFE 2000
MEUNIER
Pgina 41
PFE 2000
MEUNIER
Pgina 42
6. Empezar el anlisis :
Seleccionar / Anlisis / velocidades,
o / Anlisis / aceleraciones.
PFE 2000
MEUNIER
Pgina 43
9. Datos :
Aqu se introduce el mdulo de la velocidad o de la aceleracin de la barra de
entrada.
PFE 2000
MEUNIER
Pgina 44
Hay que saber que este mdulo es siempre positivo porque el sentido fue dado
elogiando el incremento positivo o negativo al principio (/ Problemas de Posicin /
Posiciones sucesivas). Si el usuario introduce un valor negativo, slo ser considerado
el mdulo.
OK.
10. Grfico :
Se abre una ventana con el grfico de la velocidad o de la aceleracin de la barra
estudiada en funcin del ngulo de la barra de entrada.
Las informaciones son las siguientes :
Dos ejes :
El eje de las abscisas representa los ngulos de la barra de entrada (valores
crecientes de la izquierda hasta la derecha).
Este eje esta trazado para una velocidad o aceleracin nula.
El eje de las ordenadas representa la velocidad o la aceleracin de la barra
estudiada.
Este eje esta situado para el ngulo mnimo de la barra de entrada.
PFE 2000
MEUNIER
Pgina 45
Cuatro valores :
Angulo de la barra de entrada mnimo,
Angulo de la barra de entrada mximo,
Velocidad o aceleracin mnima,
Velocidad o aceleracin mxima.
PFE 2000
MEUNIER
Pgina 46
Pgina 47
Angulo
barra entrada
Velocidad
(coef influ)
Velocidad
(MEF)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
32,49
33,49
34,49
35,49
36,49
37,49
38,49
39,49
40,49
41,49
42,49
43,49
44,49
45,49
46,49
47,49
48,49
49,49
50,49
51,49
52,49
53,49
54,49
55,49
56,49
-0,889553563
-0,932346076
-0,968775755
-1,003841169
-1,036586840
-1,067430397
-1,096464126
-1,123400773
-1,150205335
-1,175149838
-1,198670661
-1,222566504
-1,244989737
-1,266439509
-1,288162857
-1,309927476
-1,330852173
-1,351351006
-1,372522005
-1,394276383
-1,415451302
-1,436662486
-1,459296377
-1,482287075
-1,506049670
-0,890645021
-0,931197825
-0,968803242
-1,003840914
-1,036589589
-1,067356852
-1,096358699
-1,123851416
-1,150015803
-1,175025163
-1,199071751
-1,222292533
-1,244820667
-1,266812415
-1,288377325
-1,309635399
-1,330696349
-1,351687759
-1,372710569
-1,393877514
-1,415299467
-1,437105220
-1,459410833
-1,482349939
-1,506066458
PFE 2000
MEUNIER
Pgina 48
10. LIMITACIONES
Para utilizar bien el programa y mejorarlo en el futuro, hay que conocer los
lmites.
Este programa permite analizar sistemas en mecanismos planos de un grado de
libertad constituidos de barras, rotulas, rotulas fijas, deslizaderas... Se puede dibujarlos
con ratn o teclado. Se puede tambin modificarlos.
El programa permite analizar una barra cada vez que esta ejecutado.
Ahora, las condiciones iniciales deben ser : velocidad o aceleracin constante.
PFE 2000
MEUNIER
Pgina 49
11. CONCLUSIN
Para mi, este proyecto fue muy interesante. Me permit aprender un lenguaje
informtico, hacer un trabajo en grupo (ya que muchos alumnos trabajaban en diferentes
partes del programa) y pasar el obstculo del idioma.
PFE 2000
MEUNIER
Pgina 50
12. BIBLIOGRAFA
Aqu siguen referencias de libros y revistas para familiarizarse con varios temas
o ahondarlos.
Fortran :
Programmer en Fortran 90
Claude Delannoy
Eyrolles
Manual del usuario (ayuda) del programa Fortran Powerstation de Microsoft
PFE 2000
MEUNIER
Pgina 51
PFE 2000
MEUNIER
Pgina 52
13. ANEXOS
PFE 2000
MEUNIER
Pgina 53
!*********************************************************************
*************!
!
Diagrama de las velocidades
!
!
Metodo de los coeficientes de influencia
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
Subrutina vitesses
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine vitesses(bar_diag)
use tipos
use msimsl
use msflib
use influencia
type(element) elemento
type(wxycoord) punto1,punto2
real*8 xa,ya,xb,yb,ang
real*8, allocatable::tempo1(:),tempo2(:),tempo3(:),t(:)
integer(4)
h,bar_diag,num_posicion,i,ordenbarra,ierror,num_nudos,num_apoyos,num_p
arp,apoyos(200)
logical acabar
allocate(vel_barra(control(1)),ang_ent(control(1)),ang_barra(con
trol(1)),tempo1(control(1)),tempo2(control(1)),tempo3(control(1)),t(co
ntrol(1)),vit(control(1)),stat=ierror)
if(ierror.ne.0)then
deallocate(vel_barra,ang_ent,ang_barra,tempo1,tempo2,tempo3,t,vi
t,stat=ierror)
allocate
(vel_barra(control(1)),ang_ent(control(1)),tempo1(control(1)),tempo2(c
ontrol(1)),tempo3(control(1)),ang_barra(control(1)),t(control(1)),vit(
control(1)),stat=ierror)
end if
!
!
!
!
!
call
transformacion(num_barras,num_nudos,num_apoyos,num_parp,nudos,barras,a
poyos)
!
!
!
!
!
bar_diag=0
do i=1,num_barras
if
((nudos(barras(i,1),1).eq.punto1%wx).and.(nudos(barras(i,1),2).eq.punt
o1%wy)) then
if
((nudos(barras(i,2),1).eq.punto2%wx).and.(nudos(barras(i,2),2).eq.punt
o2%wy)) then
bar_diag=i
end if
end if
end do
do j=1,num_barras
if
((nudos(barras(j,1),1).eq.punto2%wx).and.(nudos(barras(j,1),2).eq.punt
o2%wy)) then
if
((nudos(barras(j,2),1).eq.punto1%wx).and.(nudos(barras(j,2),2).eq.punt
o1%wy)) then
bar_diag=j
end if
end if
end do
!
!
!
!
!
bar_ent=entradas(1)%barra
!
!
!
posicin
!
do num_posicion=1,control(1)
xa=pto_coord(barras(bar_ent,1))%x(num_posicion)
ya=pto_coord(barras(bar_ent,1))%y(num_posicion)
xb=pto_coord(barras(bar_ent,2))%x(num_posicion)
yb=pto_coord(barras(bar_ent,2))%y(num_posicion)
call calcular_angulo(xa,ya,xb,yb,ang)
!
!
!
!
!
ang_maxi=ang_ent(1)
ang_mini=ang_ent(1)
do i=1,control(1)
if (ang_ent(i).gt.ang_maxi) then
ang_maxi=ang_ent(i)
end if
if (ang_ent(i).lt.ang_mini) then
ang_mini=ang_ent(i)
end if
end do
!
!
!
posicin
!
do num_posicion=1,control(1)
xa=pto_coord(barras(bar_diag,1))%x(num_posicion)
ya=pto_coord(barras(bar_diag,1))%y(num_posicion)
xb=pto_coord(barras(bar_diag,2))%x(num_posicion)
yb=pto_coord(barras(bar_diag,2))%y(num_posicion)
call calcular_angulo2(xa,ya,xb,yb,ang)
ang_barra(num_posicion)=ang
end do
!
!
!
!
!
if (entradas(num_entradas)%incremento.LT.0)
do i=1,control(1)
tempo1(i)=ang_ent(control(1)+1-i)
then
tempo2(i)=ang_barra(control(1)+1-i)
end do
do i=1,control(1)
ang_ent(i)=tempo1(i)
ang_barra(i)=tempo2(i)
end do
end if
!
!
!
Clculo de los coeficientes de influencia de las
velocidades
!
!
!
h=0
do i=2,control(1)-1
if (ang_ent(i+1)-ang_ent(i).GT.(ang_ent(i)-ang_ent(i-1))*1.2
.OR. (ang_ent(i+1)-ang_ent(i))*1.2.LT.ang_ent(i)-ang_ent(i-1)) then
h=1
end if
end do
if (h.EQ.0) then
do num_posicion=1,2
call fctini(num_posicion)
end do
do num_posicion=control(1)-1,control(1)
call fctfin(num_posicion)
end do
do num_posicion=3,control(1)-2
call fctmed(num_posicion)
end do
else
do num_posicion=1,2
call fctini(num_posicion)
end do
do num_posicion=3,h-2
call fctmed(num_posicion)
end do
do num_posicion=h-1,h
call fctfin(num_posicion)
end do
call fctini(h+1)
do num_posicion=h+2,control(1)-2
call fctmed(num_posicion)
end do
do num_posicion=control(1)-1,control(1)
call fctfin(num_posicion)
end do
end if
!
!
!
!
!
call ley_entrada(movt,var_ent)
!
!
!
!
!
if (movt.eq.1) then
do i=1,control(1)
t(i)=abs(sqrt(2*(ang_ent(i)-ang_ent(1))/var_ent))
end do
if (entradas(num_entradas)%incremento.lt.0) then
do i=1,control(1)
tempo3(i)=t(control(1)+1-i)
end do
do i=1,control(1)
t(i)=tempo3(i)
end do
end if
do i=1,control(1)
vit(i)=vel_barra(i)*var_ent*t(i)
if (entradas(num_entradas)%incremento.lt.0) then
vit(i)=-vit(i)
end if
end do
else
do i=1,control(1)
vit(i)=vel_barra(i)*var_ent
if (entradas(num_entradas)%incremento.lt.0) then
vit(i)=-vit(i)
end if
end do
end if
!
!
!
!
!
vmax=vit(1)
vmin=vit(1)
do i=1,control(1)
if (vit(i).gt.vmax) then
vmax=vit(i)
end if
if (vit(i).lt.vmin) then
vmin=vit(i)
end if
end do
!
!
!
!
!
call interpolacion()
!*********************************************************************
*************!
!*********************************************************************
*************!
!
SUBRUTINA PARA DIBUJAR EL DIAGRAMA DE VELOCIDADES
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine diag_vit()
use tipos
use msimsl
use msflib
use influencia
type(windowconfig) config15,configfw
type(qwinfo)winfo15,winfofw
type(wxycoord) wxy
logical status,estado
Real*8 wx1,wy1,wx2,wy2
integer(4) i,bar_diag,result
real*8 :: cero=0
!
!
!
!
!
call vitesses(bar_diag)
!
!
!
grfico
!
estado=GETWSIZEQQ(QWIN$FRAMEWINDOW,QWIN$SIZEMAX,winfofw)
status=GETWINDOWCONFIG(configfw)
10
ella
Open(Unit=15,File='User',Title='diagrama de velocidades')
config15.numxpixels=(configfw.numxpixels*0.7)
config15.numypixels=(configfw.numypixels*0.7)
ifun=focusqq(15)
!la traigo delante y pinto en
status=SETWINDOWCONFIG(config15)
If(.NOT.status) Goto 10
winfo15.x=0
winfo15.y=0
estado=SETWSIZEQQ(15,winfo15)
!
!
!
!
!
if (vmax.gt.0.AND.vmin.gt.0) then
vmin=0
end if
if (vmax.lt.0.AND.vmin.lt.0) then
vmax=0
end if
wx1=ang_mini-.1*(ang_maxi-ang_mini)
wy1=vmax+.3*abs(vmax-vmin)
wx2=ang_maxi+.25*(ang_maxi-ang_mini)
wy2=vmin-.2*abs(vmax-vmin)
ifun=focusqq(15)
status=SETWINDOW(.TRUE.,(wx1),(wy1),(wx2),(wy2))
!
!
!
!
!
dibuja=SETCOLORRGB(#ffffff)
call moveto_w(ang_mini,cero,wxy )
ifun=lineto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),.03*abs(vmaxvmin))
call moveto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero,wxy)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),-.03*abs(vmaxvmin))
call moveto_w(ang_mini,vmin,wxy)
ifun=lineto_w(ang_mini,vmax+.1*abs(vmax-vmin))
ifun=lineto_w(ang_mini-.015*(ang_maxiang_mini),vmax+.05*abs(vmax-vmin))
call moveto_w(ang_mini,vmax+.1*abs(vmax-vmin),wxy)
ifun=lineto_w(ang_mini+.015*(ang_maxiang_mini),vmax+.05*abs(vmax-vmin))
!
!
!
!
!
call escribir
!
!
!
Trazado de la curva
!
!
!
ifun=setcolor(10)
call moveto_w(ptx(1),pty(1),wxy)
if (control(1).gt.1) then
do i=2,nb_pts
result=lineto_w(ptx(i),pty(i))
call moveto_w(ptx(i),pty(i),wxy)
end do
end if
call espera()
!*********************************************************************
*************!
!*********************************************************************
*************!
!
subroutina escribir
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
subroutine escribir
use influencia
use tipos
use msflib
type (wxycoord) wxwy
integer(2) numfonts,fontnum
integer(4) res
character (25) y1,y2,x1,x2
ifun=focusqq(15)
res=setactiveqq(15)
numfonts=initializefonts()
fontnum=setfont('t''Arial''h14w8')
ifun=setcolor(15)
call moveto_w(ang_mini-.06*(ang_maxiang_mini),vmax+.18*abs(vmax-vmin),wxwy)
call outgtext('Velocidad')
call moveto_w(ang_maxi+.065*(ang_maxiang_mini),.11*abs(vmax-vmin),wxwy)
call outgtext('angulo')
call moveto_w(ang_maxi+.07*(ang_maxiang_mini),.04*abs(vmax-vmin),wxwy)
call outgtext('barra')
call moveto_w(ang_maxi+.06*(ang_maxi-ang_mini),.03*abs(vmax-vmin),wxwy)
call outgtext('entrada')
call moveto_w (ang_mini-.09*(ang_maxiang_mini),vmax+.03*abs(vmax-vmin),wxwy)
write (y1,'(f7.2)')vmax
call outgtext (y1)
call moveto_w (ang_mini-.09*(ang_maxiang_mini),vmin+.03*abs(vmax-vmin),wxwy)
write (y2,'(f7.2)')vmin
call outgtext (y2)
call moveto_w (ang_mini-.04*(ang_maxi-ang_mini),.04*abs(vmax-vmin),wxwy)
write (x1,'(f7.2)')ang_mini
call outgtext (x1)
call moveto_w (ang_maxi-.04*(ang_maxi-ang_mini),.04*abs(vmax-vmin),wxwy)
write (x2,'(f7.2)')ang_maxi
call outgtext (x2)
!*********************************************************************
*************!
!*********************************************************************
*************!
!
Interpolacin con el mtodo de los trazadores
cbicos
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine interpolacion ()
use
use
use
use
tipos
msimsl
msflib
influencia
integer(4) i,n,j,s,ierror
real*8, dimension (1:control(1)) :: l, z, x, c, h , nu, alpha, a, b, d
allocate(ptx(nb_pts),pty(nb_pts),stat=ierror)
if(ierror.ne.0)then
deallocate(ptx,pty)
allocate (ptx(nb_pts),pty(nb_pts),stat=ierror)
end if
n=control(1)
do i=1, n
x(i) = ang_ent(i)
a(i) = vit(i)
end do
do i=1, n-1
h(i) = x(i+1) - x(i)
end do
do i=2, n-1
alpha(i) = 3 / h(i) * (a(i+1) - a(i)) - 3 / h(i-1) * (a(i) a(i-1))
end do
l(1) = 1
nu(1) = 0
z(1) = 0
do i=2, n-1
l(i) = 2 * (x(i+1) - x(i-1)) - h(i-1) * nu(i-1)
nu(i) =
h(i) / l(i)
z(i) = (alpha(i) - h(i-1) * z(i-1)) / l(i)
end do
l(n) = 1
z(n) = 0
c(n) = 0
do j=n-1, 1, -1
c(j) = z(j) - nu(j) * c(j+1)
b(j) = (a(j+1) - a(j)) / h(j) - h(j) * (c(j+1) + 2 * c(j)) / 3
d(j) = (c(j+1) - c(j)) / (3 * h(j))
end do
!
!
con j=1,...,n-1
do i=1,nb_pts-1
ptx(i)=ang_mini+(ang_maxi-ang_mini)*(i-1)/(nb_pts-1)
s=1
do j=2,control(1)-1
if (ptx(i).gt.ang_ent(j).and.ptx(i).le.ang_ent(j+1)) then
s=j
end if
end do
pty(i)=a(s)+b(s)*(ptx(i)-x(s))+c(s)*(ptx(i)x(s))**2+d(s)*(ptx(i)-x(s))**3
end do
s=control(1)-1
ptx(nb_pts)=ang_maxi
pty(nb_pts)=a(s)+b(s)*(ptx(i)-x(s))+c(s)*(ptx(i)x(s))**2+d(s)*(ptx(i)-x(s))**3
!*********************************************************************
*************!
!*********************************************************************
*************!
!
functiones de diferencias numrica
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
!
!
!
!
subroutine fctini(num_posicion)
use influencia
real*8 h
h=ang_ent(num_posicion+1)-ang_ent(num_posicion)
vel_barra(num_posicion)=(2*ang_barra(num_posicion+3)9*ang_barra(num_posicion+2)+18*ang_barra(num_posicion+1)11*ang_barra(num_posicion))/(6*h)
end subroutine fctini
!
!
subroutine fctfin(num_posicion)
use influencia
real*8 h
h=ang_ent(num_posicion)-ang_ent(num_posicion-1)
vel_barra(num_posicion)=(11*ang_barra(num_posicion)18*ang_barra(num_posicion-1)+9*ang_barra(num_posicion-2)2*ang_barra(num_posicion-3))/(6*h)
end subroutine fctfin
!
!
subroutine fctmed(num_posicion)
use influencia
real*8 h
h=(ang_ent(num_posicion+2)-ang_ent(num_posicion-2))/4
vel_barra(num_posicion)=(ang_barra(num_posicion+2)+8*ang_barra(num_posicion+1)8*ang_barra(num_posicion-1)+ang_barra(num_posicion-2))/(12*h)
end subroutine fctmed
!*********************************************************************
*************!
!*********************************************************************
*************!
!
SUBRUTINA PARA LA LEY DE ENTRADA
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine ley_entrada(movt,var_ent)
use dialogm
use tipos
include 'resource.fd'
type(dialog) dial,dial1,dial2
real*8 var_ent
logical chequeador
character*25 in
retlog=dlginit(eleg_mov,dial)
retlog=dlgset(dial,w,.true.)
retlog=dlgset(dial,A,.false.)
result=dlgmodal(dial)
retlog=dlgget(dial,w,chequeador)
call dlguninit(dial)
if (chequeador)
then
retlog=dlginit(cond_ini2,dial2)
retlog=dlgset(dial2,veloc,"1")
result=dlgmodal(dial2)
retlog=dlgget(dial2,veloc,in)
call dlguninit(dial2)
read(in,*) var_ent
var_ent=abs(var_ent)
movt=2
! movt=2 significa velocidad constante
else
retlog=dlginit(cond_ini1,dial1)
retlog=dlgset(dial1,acel,"1")
result=dlgmodal(dial1)
retlog=dlgget(dial1,acel,in)
call dlguninit(dial1)
read(in,*) var_ent
var_ent=abs(var_ent)
movt=1
! movt=1 significa aceleracion constante
end if
end subroutine ley_entrada
!*********************************************************************
*************!
!
Diagrama de las aceleraciones
!
!
Metodo de los coeficientes de influencia
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
Subrutina vitesses
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine acceleration(bar_diag)
use tipos
use msimsl
use msflib
use influencia
type(element) elemento
type(wxycoord) punto1,punto2
real*8 xa,ya,xb,yb,ang
real*8, allocatable::tempo1(:),tempo2(:),tempo3(:),t(:)
integer(4)
h,bar_diag,num_posicion,i,ordenbarra,ierror,num_nudos,num_apoyos,num_p
arp,apoyos(200)
logical acabar
allocate(acel_barra(control(1)),ang_ent(control(1)),ang_barra(co
ntrol(1)),tempo1(control(1)),tempo2(control(1)),tempo3(control(1)),t(c
ontrol(1)),accel(control(1)),stat=ierror)
if(ierror.ne.0)then
deallocate(acel_barra,ang_ent,ang_barra,tempo1,tempo2,tempo3,t,a
ccel,stat=ierror)
allocate
(acel_barra(control(1)),ang_ent(control(1)),tempo1(control(1)),tempo2(
control(1)),tempo3(control(1)),ang_barra(control(1)),t(control(1)),acc
el(control(1)),stat=ierror)
end if
!
!
!
!
!
call
transformacion(num_barras,num_nudos,num_apoyos,num_parp,nudos,barras,a
poyos)
!
!
!
!
!
bar_diag=0
do i=1,num_barras
if
((nudos(barras(i,1),1).eq.punto1%wx).and.(nudos(barras(i,1),2).eq.punt
o1%wy)) then
if
((nudos(barras(i,2),1).eq.punto2%wx).and.(nudos(barras(i,2),2).eq.punt
o2%wy)) then
bar_diag=i
end if
end if
end do
do j=1,num_barras
if
((nudos(barras(j,1),1).eq.punto2%wx).and.(nudos(barras(j,1),2).eq.punt
o2%wy)) then
if
((nudos(barras(j,2),1).eq.punto1%wx).and.(nudos(barras(j,2),2).eq.punt
o1%wy)) then
bar_diag=j
end if
end if
end do
!
!
!
!
!
bar_ent=entradas(1)%barra
!
!
!
posicin
!
do num_posicion=1,control(1)
xa=pto_coord(barras(bar_ent,1))%x(num_posicion)
ya=pto_coord(barras(bar_ent,1))%y(num_posicion)
xb=pto_coord(barras(bar_ent,2))%x(num_posicion)
yb=pto_coord(barras(bar_ent,2))%y(num_posicion)
call calcular_angulo(xa,ya,xb,yb,ang)
ang_ent(num_posicion)=ang
end do
!
!
!
!
!
ang_maxi=ang_ent(1)
ang_mini=ang_ent(1)
do i=1,control(1)
if (ang_ent(i).gt.ang_maxi) then
ang_maxi=ang_ent(i)
end if
if (ang_ent(i).lt.ang_mini) then
ang_mini=ang_ent(i)
end if
end do
!
!
!
posicin
!
do num_posicion=1,control(1)
xa=pto_coord(barras(bar_diag,1))%x(num_posicion)
ya=pto_coord(barras(bar_diag,1))%y(num_posicion)
xb=pto_coord(barras(bar_diag,2))%x(num_posicion)
yb=pto_coord(barras(bar_diag,2))%y(num_posicion)
call calcular_angulo2(xa,ya,xb,yb,ang)
ang_barra(num_posicion)=ang
end do
!
!
!
!
!
if (entradas(num_entradas)%incremento.LT.0)
then
do i=1,control(1)
tempo1(i)=ang_ent(control(1)+1-i)
tempo2(i)=ang_barra(control(1)+1-i)
end do
do i=1,control(1)
ang_ent(i)=tempo1(i)
ang_barra(i)=tempo2(i)
end do
end if
!
!
!
Clculo de los coeficientes de influencia de las
velocidades
!
!
!
h=0
do i=2,control(1)-1
if (ang_ent(i+1)-ang_ent(i).GT.(ang_ent(i)-ang_ent(i-1))*1.2
.OR. (ang_ent(i+1)-ang_ent(i))*1.2.LT.ang_ent(i)-ang_ent(i-1)) then
h=1
end if
end do
if (h.EQ.0) then
do num_posicion=1,2
call fctini2(num_posicion)
end do
do num_posicion=control(1)-1,control(1)
call fctfin2(num_posicion)
end do
do num_posicion=3,control(1)-2
call fctmed2(num_posicion)
end do
else
do num_posicion=1,2
call fctini2(num_posicion)
end do
do num_posicion=3,h-2
call fctmed2(num_posicion)
end do
do num_posicion=h-1,h
call fctfin2(num_posicion)
end do
call fctini2(h+1)
do num_posicion=h+2,control(1)-2
call fctmed2(num_posicion)
end do
do num_posicion=control(1)-1,control(1)
call fctfin2(num_posicion)
end do
end if
!
!
!
!
!
call ley_entrada(movt,var_ent)
!
!
!
!
!
if (movt.eq.1) then
do i=1,control(1)
accel(i)=acel_barra(i)*var_ent
if (entradas(num_entradas)%incremento.lt.0) then
accel(i)=-accel(i)
end if
end do
else
do i=1,control(1)
accel(i)=0
end do
end if
!
!
!
!
!
amax=accel(1)
amin=accel(1)
do i=1,control(1)
if (accel(i).gt.amax) then
amax=accel(i)
end if
if (accel(i).lt.amin) then
amin=accel(i)
end if
end do
!
!
!
!
!
call interpolacion2()
end subroutine acceleration
!*********************************************************************
*************!
!*********************************************************************
*************!
!
!
call acceleration(bar_diag)
!
!
!
grfico
!
estado=GETWSIZEQQ(QWIN$FRAMEWINDOW,QWIN$SIZEMAX,winfofw)
status=GETWINDOWCONFIG(configfw)
10
ella
Open(Unit=15,File='User',Title='diagrama de aceleraciones')
config15.numxpixels=(configfw.numxpixels*0.7)
config15.numypixels=(configfw.numypixels*0.7)
ifun=focusqq(15)
!la traigo delante y pinto en
status=SETWINDOWCONFIG(config15)
If(.NOT.status) Goto 10
winfo15.x=0
winfo15.y=0
estado=SETWSIZEQQ(15,winfo15)
!
!
!
!
!
if (amax.gt.0.AND.amin.gt.0) then
amin=0
end if
if (amax.lt.0.AND.amin.lt.0) then
amax=0
end if
wx1=ang_mini-.1*(ang_maxi-ang_mini)
wy1=amax+.3*abs(amax-amin)
wx2=ang_maxi+.25*(ang_maxi-ang_mini)
wy2=amin-.2*abs(amax-amin)
ifun=focusqq(15)
status=SETWINDOW(.TRUE.,(wx1),(wy1),(wx2),(wy2))
!
!
!
!
!
dibuja=SETCOLORRGB(#ffffff)
call moveto_w(ang_mini,cero,wxy )
ifun=lineto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),.03*abs(amaxamin))
call moveto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero,wxy)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),-.03*abs(amaxamin))
call moveto_w(ang_mini,amin,wxy)
ifun=lineto_w(ang_mini,amax+.1*abs(amax-amin))
ifun=lineto_w(ang_mini-.015*(ang_maxiang_mini),amax+.05*abs(amax-amin))
call moveto_w(ang_mini,amax+.1*abs(amax-amin),wxy)
ifun=lineto_w(ang_mini+.015*(ang_maxiang_mini),amax+.05*abs(amax-amin))
!
!
!
!
!
call escribir2
!
!
!
Trazado de la curva
!
!
!
ifun=setcolor(10)
call moveto_w(ptx(1),pty(1),wxy)
if (control(1).gt.1) then
do i=2,nb_pts
result=lineto_w(ptx(i),pty(i))
call moveto_w(ptx(i),pty(i),wxy)
end do
end if
call espera()
!*********************************************************************
*************!
!*********************************************************************
*************!
!
subroutina escribir2
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
subroutine escribir2
use influencia
use tipos
use msflib
type (wxycoord) wxwy
integer(2) numfonts,fontnum
integer(4) res
character (25) y1,y2,x1,x2
ifun=focusqq(15)
res=setactiveqq(15)
numfonts=initializefonts()
fontnum=setfont('t''Arial''h14w8')
ifun=setcolor(15)
call moveto_w(ang_mini-.06*(ang_maxiang_mini),amax+.18*abs(amax-amin),wxwy)
call outgtext('Aceleracion')
call moveto_w(ang_maxi+.065*(ang_maxiang_mini),.11*abs(amax-amin),wxwy)
call outgtext('angulo')
call moveto_w(ang_maxi+.07*(ang_maxiang_mini),.04*abs(amax-amin),wxwy)
call outgtext('barra')
call moveto_w(ang_maxi+.06*(ang_maxi-ang_mini),.03*abs(amax-amin),wxwy)
call outgtext('entrada')
call moveto_w (ang_mini-.09*(ang_maxiang_mini),amax+.03*abs(amax-amin),wxwy)
write (y1,'(f7.2)')amax
call outgtext (y1)
!*********************************************************************
*************!
!*********************************************************************
*************!
!
Interpolacin con el mtodo de los trazadores
cbicos
!
!*********************************************************************
*************!
!*********************************************************************
*************!
subroutine interpolacion2 ()
use
use
use
use
tipos
msimsl
msflib
influencia
integer(4) i,n,j,s,ierror
real*8, dimension (1:control(1)) :: l, z, x, c, h , nu, alpha, a, b, d
allocate(ptx(nb_pts),pty(nb_pts),stat=ierror)
if(ierror.ne.0)then
deallocate(ptx,pty)
allocate (ptx(nb_pts),pty(nb_pts),stat=ierror)
end if
n=control(1)
do i=1, n
x(i) = ang_ent(i)
a(i) = accel(i)
end do
do i=1, n-1
h(i) = x(i+1) - x(i)
end do
do i=2, n-1
alpha(i) = 3 / h(i) * (a(i+1) - a(i)) - 3 / h(i-1) * (a(i) a(i-1))
end do
l(1) = 1
nu(1) = 0
z(1) = 0
do i=2, n-1
l(i) = 2 * (x(i+1) - x(i-1)) - h(i-1) * nu(i-1)
nu(i) =
h(i) / l(i)
z(i) = (alpha(i) - h(i-1) * z(i-1)) / l(i)
end do
l(n) = 1
z(n) = 0
c(n) = 0
do j=n-1, 1, -1
c(j) = z(j) - nu(j) * c(j+1)
b(j) = (a(j+1) - a(j)) / h(j) - h(j) * (c(j+1) + 2 * c(j)) / 3
d(j) = (c(j+1) - c(j)) / (3 * h(j))
end do
!
Tenemos la ecuacin de la curva :
!
!
!
con j=1,...,n-1
do i=1,nb_pts-1
ptx(i)=ang_mini+(ang_maxi-ang_mini)*(i-1)/(nb_pts-1)
s=1
do j=2,control(1)-1
if (ptx(i).gt.ang_ent(j).and.ptx(i).le.ang_ent(j+1)) then
s=j
end if
end do
pty(i)=a(s)+b(s)*(ptx(i)-x(s))+c(s)*(ptx(i)x(s))**2+d(s)*(ptx(i)-x(s))**3
end do
s=control(1)-1
ptx(nb_pts)=ang_maxi
pty(nb_pts)=a(s)+b(s)*(ptx(i)-x(s))+c(s)*(ptx(i)x(s))**2+d(s)*(ptx(i)-x(s))**3
!*********************************************************************
*************!
!*********************************************************************
*************!
!
functiones de diferencias numrica
!
!*********************************************************************
*************!
!*********************************************************************
*************!
!
!
subroutine fctini2(num_posicion)
use influencia
real*8 h
h=ang_ent(num_posicion+1)-ang_ent(num_posicion)
acel_barra(num_posicion)=(ang_barra(num_posicion+3)+4*ang_barra(num_posicion+2)5*ang_barra(num_posicion+1)+2*ang_barra(num_posicion))/(h**2)
end subroutine fctini2
!
!
subroutine fctfin2(num_posicion)
use influencia
real*8 h
h=ang_ent(num_posicion)-ang_ent(num_posicion-1)
acel_barra(num_posicion)=(2*ang_barra(num_posicion)5*ang_barra(num_posicion-1)+4*ang_barra(num_posicion-2)ang_barra(num_posicion-3))/(h**2)
end subroutine fctfin2
!
!
subroutine fctmed2(num_posicion)
use influencia
real*8 h
h=(ang_ent(num_posicion+2)-ang_ent(num_posicion-2))/4
acel_barra(num_posicion)=(ang_barra(num_posicion+2)+16*ang_barra(num_posicion+1)30*ang_barra(num_posicion)+16*ang_barra(num_posicion-1)ang_barra(num_posicion-2))/(12*h**2)
end subroutine fctmed2