Vous êtes sur la page 1sur 93

ENSAM

Ecole Nationale Supérieure d’Arts et Métiers

PROCÉDÉ DE CALCUL DE VITESSES ET


D’ACCÉLÉRATIONS DE MÉCANISMES PLANS

ANNÉE 1999/2000

RAPPORT FINAL
PFE – LMS – ESP 1

Présenté par : Professeurs responsables :


Alexis MEUNIER M. BARRACO
M. HERNÁNDEZ FRÍAS
M. PETUYA ARCOCHA
ANNEE : 1999-2000 GROUPE : LMS NUMERO DE PFE : ESP 1

AUTEUR : Alexis MEUNIER

TITRE : Procedimiento de cálculo de velocidades y aceleraciones en mecanismos


planos. (Procédé de calcul de vitesses et accélérations pour mécanismes plans)

ENCADREMENT DU PFE :M. BARRACO


M. HERNÁNDEZ FRÍAS
M. PETUYA ARCOCHA

PARTENAIRE DU PFE : Escuela Superior de Ingenieros de Bilbao,


Departamento de ingeniería mecánica.
(Ecole Supérieur d’Ingénieurs de Bilbao,
Département d’ingénierie mécanique, ESPAGNE)

NOMBRE DE PAGES : 16 + 72

NOMBRE DE REFERENCES BIBLIOGRAPHIQUES : 12

RESUME : Dans le cadre du partenariat avec l’Ecole Supérieure d’Ingénieurs de


Bilbao, ce projet consiste à développer une partie d’un programme en cours de
réalisation. Ce programme est développé sur Microsoft Fortran Powerstation et doit
permettre de simuler des mécanismes plans à un degré de liberté. Le projet concerne le
calcul des vitesses et accélérations d’une barre quelconque d’un système et leur
affichage graphique sous forme d’une courbe en fonction de l’angle de la barre d’entrée
en utilisant la méthode des coefficients d’influence.
Le projet consiste en :
Se familiariser avec le langage Fortran,
Etudier la méthode des coefficients d’influence,
Programmer.

MOTS CLES : FORTRAN


COEFFICIENTS D’INFLUENCE
DERIVATION NUMERIQUE
CUBIC SPLINES

PARTIE A REMPLIR PAR LE PROFESSEUR RESPONSABLE DU PROJET

ACCESSIBILITÉ DE CE RAPPORT ( entourer la mention correcte ) :

LIBRE CONFIDENTIEL pendant : ___ an(s)

DATE : Nom du Signataire : Signature :


Procédé de calcul de vitesses et accélérations de mécanismes plans

1. REMERCIEMENTS

Avant de commencer, je tiens à remercier le Département d’Ingénierie


Mécanique de l’Ecole Supérieure d’Ingénieurs de Bilbao pour son accueil.

Je voudrais remercier tout particulièrement Alfonso HERNÁNDEZ FRÍAS et


Víctor PETUYA ARCOCHA qui ont toujours été disponibles pour m’aider.

Grâce à eux, mon séjour fut très agréable et très instructif.

Je remercie aussi André BARRACO, mon responsable de PFE à ENSAM, et


Ricardo NOGUERA, responsable des relations avec l’Espagne, sans lesquels ce projet
n’aurait pu être possible.

PFE 2000 Page 3


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

2. SOMMAIRE

1. REMERCIEMENTS ............................................................................... 3

2. SOMMAIRE ........................................................................................... 4

3. INTRODUCTION ................................................................................... 5

4. CONTEXTE ............................................................................................ 6
4.1. Paris ...............................................................................................................6
4.2. Bilbao ............................................................................................................ 6

5. Méthode des coefficients d’influence .......................................................8

6. Dérivée numérique ...................................................................................8

7. Interpolation avec les “cubic splines” ..................................................... 9

8. Structure du programme .........................................................................10

9. Instructions pour utiliser le programme ................................................ 11


9.1. Comment charger le programme? ............................................................... 11
9.2. Comment utiliser le programme? ............................................................... 12

10. Comparaison entre la méthode des coefficients d’influence


et la MEF ............................................................................................. 14

11. LIMITES ............................................................................................. 15

12. CONCLUSION ................................................................................... 16

PFE 2000 Page 4


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

3. INTRODUCTION

Ce Projet de Fin d’Etudes a été réalisé dans le cadre des échanges entre l’ Ecole
Nationale Supérieure d’Arts et Métiers (ENSAM) et l’Ecole Supérieure d’Ingénieurs de
Bilbao (ETSII e IT)

Le projet s’est déroulé durant deux semestres :

• Un jour par semaine pendant le premier semestre au Laboratoire de Mécanique des


Structures à Paris (professeur : André Barraco),

• et le second semestre au Département d’Ingénierie Mécanique à Bilbao (professeurs :


Alfonso Hernández Frías et Víctor Petuya Arcocha).

Mon projet rentre dans cadre du développement d’un programme de simulation


de mécanismes plans avec un degré de liberté se déroulant à et l’Ecole Supérieure
d’Ingénieurs de Bilbao et sur lequel travaillent plusieurs élèves. Ce programme sera
utilisé dans l’avenir par les étudiants de l’école.

Le sujet est le suivant :


Procédé de calcul de vitesses et accélérations de mécanismes plans à un degré de
liberté avec la méthode des coefficients d’influence.

Connaissances nécessaires :

• Théorie de la mécanique,
• Méthode des coefficients d’influence,
• Méthodes de dérivation numérique,
• Programmation avec FORTRAN Powerstation de Microsoft,
• Affichage graphique sur ordinateurs.

PFE 2000 Page 5


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

4. CONTEXTE

Ce projet s’est déroulé en deux étapes :

4.1. Paris
Pendant le premier semestre, le projet a progressé assez lentement puisqu’une
journée par semaine lui était consacré. Il était difficile de se familiariser avec le Fortran
car l’ENSAM ne possède pas le logiciel en question. Par conséquent, mon travail à
Paris a été essentiellement théorique : recherche et consultation de livres et revues
scientifiques sur le langage Fortran et sur la méthode des coefficients d’influence.

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, j’ai commencé à utiliser et étudier le programme existant pour


comprendre comment il fonctionnait et savoir comment inclure ma partie à l’intérieure.

Après, j’ai cherché différentes méthodes d’interpolation linéaire et de dérivation


numérique et j’ai choisi celles qui me semblaient les plus appropriées à mon cas avec
l’opinion de professeurs des départements d’ingénierie mécanique et de mathématiques.

Pour finir, j’ai commencé à programmer ma partie et à l’inclure dans le


programme principal.

FORTRAN :
Le programme à été développé sur Fortran Powerstation de Microsoft qui offre
la possibilité d’écrire des programmes qui permettent de faire de l’affichage graphique.

De ce point de vue, ce langage est plus efficace que d’autres (comme le C++ par
exemple).

PFE 2000 Page 6


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

Programme principal :
Le programme principal a été développé par des étudiants de l’Ecole Supérieure
d’Ingénieurs de Bilbao. Il permet de simuler des mécanismes plans à un degré de
liberté.

Il existe une première partie pour dessiner le système. On peut créer un nouveau
système (avec le clavier ou la souris) et le sauvegarder pour le conserver et l’ouvrir plus
tard. Pour créer un nouveau modèle, il faut créer des points et les unir avec des éléments
(barres) et insérer des liaisons (rotules, rotules fixes, glissières...).

Après, il faut revenir au menu initial où on peut intervenir sur le système par
différentes options.

Le menu “editar” permet d’ajuster le dessin, de zoomer ou de revenir à la


positon antérieure.

Le menu “problemas de posiciones” permet de donner une position initiale,


directe, inverse ou de donner des positions successives (par incrément). On peut aussi
répéter le mouvement ou l’interrompre.

Le menu “trayectorias” permet de voir ou d’effacer les trajectoires.

Le menu “herramientas” permet de choisir ou de montrer la chemin, de déplacer


un nœud et de montrer les erreurs.

Les deux autres menus correspondent aux deux parties de calcul de vitesses et
accélérations avec la méthode MEF et la méthode des coefficients d’influence (ma
partie).

Ma partie du programme :
Pour utiliser mon menu (“análisis”), l’utilisateur doit créer ou ouvrir un système
à un degré de liberté. Après, il faut utiliser le menu “posiciones sucesivas” et donner un
incrément pour l’angle d’entrée pour que la barre d’entrée bouge.

Alors, on peut choisir l’étude de la vitesse ou de l’accélération dans le menu


“Análisis”

Les deux parties de mon programme, c’est-à-dire le calcul des vitesses et des
accélérations sont semblables. C’est pourquoi il sera seulement détaillée la partie sur les
vitesses par la suite.

Les méthodes, structures et fonctionnements sont détaillés plus loin.

PFE 2000 Page 7


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

5. Méthode des coefficients d’influence

Comme il a été spécifié lors de la présentation du sujet, le projet porte sur


l’utilisation de la méthode des coefficients d’influences. Le programme utilise cette
méthode de la manière suivante (des références sont données dans la bibliographie pour
approfondir cette méthode).

À partir de l’angle de la barre d’entrée (θ) et de l’angle de la barre étudiée (ϕ),


on calcule la dérivée d’un angle par rapport à l’autre en utilisant la méthode de
dérivation numérique (exposée en 6) :

Ce terme est aussi appelé coefficient d’influence des vitesses.

À l’aide des diverses données introduites par l’utilisateur, le programme calcule


le terme :


dt

Or,

dϕ dϕ dt
= ⋅
dθ dt dθ

Ainsi on peut déterminer le terme :


dt

qui n’est autre que la vitesse de la barre étudiée.

Le choix de l’utilisation de la méthode des coefficients d’influence a été motivé


par le fait qu’elle est plus pratique que d’autres méthodes pour les calculs dynamiques,
ces calculs dynamiques étant prévus dans le développement futur du programme.

PFE 2000 Page 8


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

6. Dérivée numérique

Après étude de différentes méthodes, celle choisi utilise les coordonnées


graphiques de plusieurs points ainsi que l’intervalle pour calculer la dérivée en un point.

Néanmoins, il faut savoir qu’on ne peut pas utiliser la même formule suivant que
l’on calcule la dérivée pour un point quelconque ou pour les premiers ou les derniers
points.

Il en ressort les formules suivantes :

• Formules des dérivées d’ordre un :

Premiers points (i = 1, 2) :
2 f i + 3 − 9 f i + 2 + 18 f i +1 − 11 f i
f 'i =
6h

Points médians (i = 3 à i = n-2) :


− f i + 2 + 8 f i + 1 − 8 f i −1 + f i − 2
f 'i =
12h

Derniers points (i = n-1, n) :


11 f i − 18 f i −1 + 9 f i − 2 − 2 f i − 3
f 'i =
6h

• Formules des dérivées d’ordre deux :

Premiers points (i = 1, 2) :

− f i + 3 + 4 f i + 2 − 5 f i +1 + 2 f i
f ' 'i =
h2

Points médians (i = 3 à i = n-2) :


− f i + 2 + 16 f i +1 − 30 f i + 16 f i −1 − f i − 2
f ' 'i =
12h 2

Derniers points (i = n-1, n) :

2 f i − 5 f i −1 + 4 f i − 2 − f i − 3
f ' 'i =
h2

PFE 2000 Page 9


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

7. Interpolation avec les “cubic splines”

Cette méthode consiste en une approximation de fonctions par approximation de


polynômes par intervalles : {(xo,f(xo)), (x1,f(x1)),...,(xn,f(xn))}

Le principe de la méthode est de calculer les différentes variables à partir des


points existants de telle manière que l’on obtient une séries de fonctions :

Sj(x) = aj + bj(x - xj) + cj(x - xj)2 + dj(x - xj)3 , pour j = 0, 1,..., n-1.

L’algorithme est le suivant :

ENTREE n; x0, x1,..., xn; a0 = f(x0), a1 = f(x1),..., an = f(xn).


Etape 1 Pour i = 0, 1,..., n-1, on détermine hi = xi+1 - xi.
Etape 2 Pour i = 0, 1,..., n-1, on détermine
α j = (ai +1 − ai ) − (ai + ai +1 )
3 3
hj hi −1
Etape 3 l0 = 1;
µ = 0;
zo = 0.
Etape 4 Pour i = 1, 2,..., n-l, on détermine
li = 2(xi+1 – xi-1) – h i-1-µ i-1;
µ i = hi / li;
zi = (αi - hi-1zi-1) / li.
Etape 5 ln = 1;
zn = 0;
cn = 0.
Etape 6 Pour j = n-1, n-2,..., 0, on détermine
cj = zj – µ jcj+1;
bj = (aj+1 - aj) / hj – hj (cj+1 – 2cj) / 3;
di = (cj+1 - cj) / (3hj).
Etape 7 SORTIE aj, bj, cj, dj, para j = 0, 1,..., n-1;
ARRET.

PFE 2000 Page 10


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

8. Structure de la partie calcul des vitesses et


accélérations du programme

Voici le processus de calcul simplifié des vitesses tel qu’il est effectué par le
programme (le listing est présenté en annexe).

1. Identification de la barre à analyser.

2. Calcul de l’angle de la barre d’entrée à chaque position.

3. Calcul des angles extrêmes de la barre d’entrée.

4. Calcul de l’angle de la barre étudiée à chaque position.

5. Rangement par ordre croissant des angles de la barre étudiée en fonction des angles
de la barre d’entrée (nécessaire pour le bon fonctionnement du programme).

6. Calcul des coefficients d’influence des vitesses avec l’utilisation des formules de
dérivation numérique.

7. Introduction de la loi d’entrée (vitesse ou accélération constante) à l’aide de boites de


dialogue.

8. Calcul des vitesses à l’aide des données précédentes.

9. Calcul des vitesses mini et maxi de la barre étudiée.

10. Interpolation avec les “cubic splines”.

11. Définition des caractéristiques de la fenêtre d’affichage.

12. Définition des caractéristiques du graphique.

13. Tracer de la courbe.

PFE 2000 Page 11


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

9. Instructions pour utiliser le programme

9.1. Comment charger le programme ?

1. Ouvrir Fortran Powerstation

2. Sélectionner :
/ File / New...
⇒ ouverture d’une fenêtre

3. Sélectionner :
Project Workspace
OK
⇒ ouverture d’une fenêtre

4. Donner les informations suivantes :


Type : QuickWin Application
Location : ...
Name : ...”nom”
⇒ Création d’un dossier nom à l’emplacement spécifié
et d’un fichier Project Workspace nommé nom.mdp

5. A l’aide de l’explorateur Windows :


Copier les fichiers (.aps, .h, .mak, .mec, .f90, .fd, .res, .rc, Icono)
depuis la disquette vers le dossier nom

6. Sélectionner :
/ Insert / Files into Project...
⇒ ouverture d’une fenêtre

7. Sélectionner tous les fichiers


OK

8. Sélectionner :
/ Build / Build nombre.exe

9. Sélectionner :
/ Build / Execute nombre.exe

PFE 2000 Page 12


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

9.2. Comment utiliser le programme ?

1. Ouvrir le fichier .mdp

2. Exécuter le programme (/ Build / Execute ...)

3. Dans le menu “Archivo”, choisir l’option désirée :


Créer un nouveau modèle ou ouvrir un modèle existant.

4. Animer le système avec l’option :


/ Problemas de Posición / Posiciones sucesivas
Séléctionner la barre en cliquant dessus.
Introduire l’incrément de l’angle de cette barre.
Il peut être positif (sens trigonométrique),
ou négatif (sens anti-trigonométrique).

5. Attendre l’arrêt du système :


Le système s’arrête lorsque le programme n’est plus à même de résoudre les
équations (cas particulier des points morts).
Néanmoins, il est possible d’arrêter le système à tout moment avec l’option :
/ Problemas de Posición / Detener

6. Lancer l’analyse :
Séléctionner / Análisis / velocidades
ou / Análisis / aceleraciones

7. Choisir la barre à étudier :


Séléctionner la barre en cliquant dessus.
⇒ Une boite de dialogue s’affiche

8. Choisir le type de mouvement à l’aide des options proposées :


ω = constante (par défaut)
A = constante
OK
⇒ Une boite de dialogue s’affiche

9. Données :
Introduire le module de la vitesse (ou de l’accélération) de la barre d’entrée.
Celui-ci doit être positif puisque le sens du mouvement a déjà été définit lors de
l’introduction de l’incrément.
OK

PFE 2000 Page 13


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

10. Graphique :
Il s’ouvre une fenêtre dans laquelle est affiché le graphique de la vitesse (ou
accélération) de la barre étudiée en fonction de l’angle de la barre d’entrée.
Les informations sont les suivantes :

Deux axes :

L’axe des abscisses représente les angles de la barre d’entrée (valeurs croissantes
de la gauche vers la droite) pour une vitesse (ou accélération) nulle.
L’axe des ordonnées représente la vitesses(ou l’accélération) de la barre étudiée
et est tracé pour l’angle minimum de la barre d’entrée.

Quatre valeurs :

Angle minimum de la barre d’entrée,


Angle maximum de la barre d’entrée,
Vitesse ou accélération minimum,
Vitesse ou accélération maximum,

La courbe des vitesses (ou accélérations) en fonction des angles de la


barre d’entrée.

PFE 2000 Page 14


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

10. Comparaison entre la méthode des


coefficients d’influence et la MEF
Dans le programme, il est possible d’obtenir le graphique des vitesses (ou
accélérations) en fonction de l’angle de la barre d’entrée de deux façons différentes :

celle expliquée précédemment et qui constitue mon projet,

la seconde en utilisant le menu “A cinemática” qui utilise la MEF et qui a été


programmé par une autre élève de l’Ecole Supérieure d’Ingénieurs de Bilbao.

Par conséquent, il est intéressant de comparer les résultats des deux méthodes à
travers un exemple simple.

La fonction “Debug” du programme Fortran Powerstation de Microsoft permet


d’avoir accès à toutes les valeurs que prennent les variables. Ceci a donc permis de
sortir les valeurs suivantes :

Position Angle Vitesse Vitesse


barre entrée (coef influ) (MEF)
1 32,49 -0,889553563 -0,890645021
2 33,49 -0,932346076 -0,931197825
3 34,49 -0,968775755 -0,968803242
4 35,49 -1,003841169 -1,003840914
5 36,49 -1,036586840 -1,036589589
6 37,49 -1,067430397 -1,067356852
7 38,49 -1,096464126 -1,096358699
8 39,49 -1,123400773 -1,123851416
9 40,49 -1,150205335 -1,150015803
10 41,49 -1,175149838 -1,175025163

Il est à noter que les valeurs données pour la méthode des coefficients
d’influence sont celles avant interpolation (sans quoi il n’aurait pas été possible d’avoir
des valeurs correspondant au mêmes angles).

On peut s’apercevoir que pour un système à un degré de liberté (celui étant assez
simple), les deux méthodes donnent des résultats assez similaires.

Par conséquent, il faudra choisir une méthode plutôt que l’autre en fonction du
développement futur du programme et après avoir testé des cas particuliers avec les
deux méthodes afin de conserver celle qui fonctionne le mieux.

PFE 2000 Page 15


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

11. LIMITES

Afin d’utiliser le programme dans de bonnes conditions et dans l’optique de son


amélioration future, il est important d’en connaître les limites.

Ce programme permet l’analyse de mécanismes plans à un degré de liberté


constitués de barres, rotules, rotules fixes, glissières... Ceux-ci peuvent être dessinés
avec la souris ou le clavier et peuvent être modifié.

Le programme ne permet de faire qu’une analyse à la fois.

Les conditions initiales possibles actuellement sont : vitesse ou accélération


constante.

Quelques cas particuliers ont été testés et des modifications ont été apporté en
conséquence; néanmoins, certains problèmes subsistent :

A courbe des accélérations présente des discontinuités.

Sur certaines études, la courbe ressemble à une sinusoïde dont les extremis
sortent très loin de l’échelle de la fenêtre. Après analyse, il apparaît que ce problème
vient de l’interpolation et qu’il survient le plus souvent lorsque l’angle de la barre
étudiée n’évolue que très peu.

PFE 2000 Page 16


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

12. CONCLUSION

L’objectif premier de ce projet était la programmation d’un procédé de calcul de


vitesses et d’accélérations de mécanismes plans à un degré de liberté avec la méthode
des coefficients d’influence.

Le projet s’est déroulé selon trois axes :

• La compréhension de la méthode des coefficients d’influence.

• La recherche, le choix et la transcription de différentes méthodes


(interpolation linéaire par les “cubic splines”, dérivation numérique).

• programmation.

Aujourd’hui, le programme fonctionne et dessine les graphiques.

Lors de l’utilisation du programme, il est apparu divers problèmes qui ont été
résolus pour une part. Néanmoins, l’objet du projet étant plus la programmation du
logiciel que son utilisation, il semble nécessaire de faire des tests plus poussés pour
relever les disfonctionnements éventuels.

Pour ma part, ce projet a été très intéressant. Il m’a permis d’apprendre un


langage informatique, de réaliser un travail en groupe (puisque plusieurs étudiants
travaillaient sur diverses parties du programme) et de passer les obstacles liés à la
langue (tout en l’apprenant).

De plus, les professeurs et les élèves de l’école ont toujours été très disponibles
quand j’avais besoin de leur aide. Je tiens à les en remercier, et grâce à eux, mon séjour
à Bilbao fut d’un grand plaisir.

PFE 2000 Page 17


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

Procedimiento de cálculo de
velocidades y aceleraciones
en mecanismos planos

Alumno : Profesores :
Alexis MEUNIER Alfonso HERNÁNDEZ FRÍAS
Víctor PETUYA ARCOCHA
André BARRACO

PFE 2000 Page 18


MEUNIER
Procédé de calcul de vitesses et accélérations de mécanismes plans

Procedimiento de cálculo de
velocidades y aceleraciones
en mecanismos planos

Alumno : Profesores :
Alexis MEUNIER Alfonso HERNÁNDEZ FRÍAS
Víctor PETUYA ARCOCHA
André BARRACO

PFE 2000 Page 19


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

1. AGRADECIMIENTOS

Antes de empezar, quisiera agradecer al Departamento de Ingeniería Mecánica


de la Escuela Superior de Ingenieros de Bilbao por su acogida.

Quisiera agradecer particularmente a Alfonso HERNÁNDEZ FRÍAS y a Víctor


PETUYA ARCOCHA por sus ayudas, mi estancia fue muy agradable e instructiva.

Gracias también a André BARRACO, mi profesor al ENSAM, y Ricardo


NOGUERA, responsable de los relaciones con España, sin los cuales este proyecto no
hubiera sido posible.

PFE 2000 Página 3


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

2. INDICE

1. AGRADECIMIENTO ............................................................................. 3

2. INDICE ................................................................................................... 4

3. INTRODUCCIÓN ................................................................................... 6

4. CONTEXTO ........................................................................................... 8
4.1. París .............................................................................................................. 8

4.2. Bilbao ............................................................................................................ 8

5. Diferenciación numérica ....................................................................... 10

6. Interpolación de splines cúbicos ...................................................... 18

7. Estructura de la parte cálculo de las velocidades del programa ............ 28

8. Instrucciones para utilizar el programa ................................................. 39


8.1. ¿Cómo cargar el programa? ........................................................................ 39

8.2. ¿Cómo utilizar el programa? ....................................................................... 40

9. Comparación entre el método de los coeficientes


de influencia y el método MEF ............................................................. 47

PFE 2000 Página 4


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

10. LIMITACIONES ................................................................................. 49

11. CONCLUSIÓN ................................................................................... 50

12. BIBLIOGRAFÍA ................................................................................. 51

13. ANEXOS ............................................................................................. 53


Listado del programa

Disquete

PFE 2000 Página 5


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

3. INTRODUCCIÓN

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 proyecto se desarrollo durante dos semestres :

• Un día cada semana durante el primer semestre en el Laboratorio de Mecánica de


estructuras en París (profesor : André Barraco),

• y el segundo semestre en el departamento de ingeniería mecánica en Bilbao


(profesores : Alfonso Hernández Frías y Víctor Petuya Arcocha).

Mi proyecto entra en el marco del desarrollo de un programa de simulación de


mecanismos (detallado después) pendiente en la Escuela Superior de Ingenieros de
Bilbao sobre el cual trabajaban algunos alumnos.

El tema es el siguiente :

Procedimiento de cálculo de velocidades y aceleraciones en mecanismos


planos de un grado de libertad con el método de los coeficientes de influencia.

Los coeficientes de influencia se utilizan para calcular velocidades y


aceleraciones de elementos y puntos del mecanismo en una posición o en posiciones
sucesivas.

También se utilizan en Dinámica de Mecanismos para resolver el problema


directo; es decir, conocidas las acciones (fuerzas) aplicadas en el mecanismo, así como
sus propiedades físicas y geométricas, calcular el movimiento del mismo (posiciones,
velocidades y aceleraciones). El proyecto parte del conocimiento de las posiciones del
mecanismo, las cuales serán calculadas mediante un procedimiento geometrico-
iterativo.

Conocidas las posiciones del mecanismo (los ángulos de posición de los


distintos elementos en función del ángulo de posición del elemento de entrada),
mediante derivación numérica se obtendrá los coeficientes de influencia de velocidad y
aceleración.

PFE 2000 Página 6


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Conocimientos necesarios :

• Teoría de mecanismos,
• Método de los coeficientes de influencia,
• Métodos de derivación numérica,
• Programación en FORTRAN Powerstation de Microsoft,
• Gráficos con computadoras.

PFE 2000 Página 7


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

4. CONTEXTO

Este proyecto se desarrollo en dos etapas :

4.1. París
Durante el primer semestre, el proyecto progreso lentamente ya que tenía un día
cada semana para adelantarlo. Fue muy difícil familiarizarme con el FORTRAN porque
la ENSAM no tenía este tipo de programa. Por consiguiente, mi trabajo en París fue
esencialmente un trabajo de investigación y de estudio bibliográfico. Consulté libros
sobre la programación en lenguaje FORTRAN y consulté libros y revistas científicas
sobre el método 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 programación gráfica.

Después, empecé utilizar el programa existente para entender como funcionaba y


saber como incluir mi parte en este.

Luego, busqué métodos de interpolación linear y métodos de derivación


numérica y elige la más apropiada con mi caso con la opinión de algunos profesores de
los departamentos de ingeniería mecánica y de matemática.

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 visualización gráfica.

De este punto de vista, este lenguaje es más eficiente que otros (como el C++
por ejemplo).

PFE 2000 Página 8


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

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 rotación y prismáticos.

Hay una primera parte para dibujar sistemas. Se puede crear un nuevo sistema
(con ratón o teclado) y salvarlo para conservarlo y abrirlo después. Para crear un nuevo
modelo, hay que crear puntos, unirlos con elementos (barras, ternario, cuaternario,
deslizadera) y poner uniones (rotulas, rotulas fijas).

Después, 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 posición anterior.

El menú “problemas de posiciones” permite dar una posición inicial, directo,


inverso o dar posiciones sucesivas. También 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 menús corresponden a los dos partes de cálculo de velocidades y
aceleraciones con el método MEF y con el método de los coeficientes de influencia (mi
parte).

Mi parte del programa :


Para utilizar mi menú (“análisis”), el usuario debe crear o abrir un sistema de un
grado de libertad. Después, debe utilizar el menú “posiciones sucesivas” y dar un
incremento de ángulo para que la barra de entrada se mueva.
Entonces, se puede elegir velocidad o aceleración en el menú “análisis”

Los dos partes de mi programa, es decir, el cálculo de las velocidades y el de las


aceleraciones son muy parecidos. Por eso, solo será detallado el parte sobre las
velocidades más tarde.
Los métodos, la estructura y el funcionamiento son detallados más atrás.

PFE 2000 Página 9


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

5. Diferenciación numérica

Se construye una hoja corrugada para techado, usando una máquina que
comprime una hoja plana de aluminio, y la transforma en una hoja cuya sección
transversal tiene la forma de onda de la función seno.

Se necesita hoja corrugada de 4 pies de largo cuyas ondas tienen una altura de 1
plg. desde la línea 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 cálculo sabemos
que esta longitud es

2
48  df ( x )  48
L=∫ 1+   dx = ∫0 1 + (cos x ) dx,
2
0
 dx 

de modo que el problema consistirá en evaluar esta integral. Aunque la función seno es
una de las más comunes en las matemáticas, el cálculo de su longitud da origen a una
integral elíptica de segunda clase, la cual no puede evaluarse con métodos normales.

Una de las razones de que aproximemos un conjunto arbitrario de datos mediante


polinomios algebraicos es que, dada una función continua cualquiera que esté definida
en un intervalo cerrado, existirá un polinomio suficientemente cercano a la función en
todos los puntos del intervalo. Por lo demás, las derivadas de los polinomios se obtienen
y se evalúan fácilmente. Por ello, no debería sorprendernos que la mayoría de los
procedimientos para aproximar integrales y derivadas usen polinomios que aproximan
la función.

La derivada de la función f en x0 es
lim f ( x0 + h ) − f ( x0 )
f ' ( x0 ) =
h→0 h

PFE 2000 Página 10


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Para aproximar este número, supongamos primero que x0 ∈ (a, b), donde f ∈
C [a, b], y que x1 = x0 + h para alguna h ≠ 0 que es lo bastante pequeña para asegurarnos
2

de que x1 ∈ [a, b]. Construimos el primer polinomio de Lagrange P0,1(x) para f


determinada por x0 y x1 con su término de error:

( x − x0 )( x − x1 )
f ( x0 ) = P0,1 ( x ) + f ' ' (ξ ( x )).
2!

f ( x0 )( x − x0 − h ) f ( x0 + h )( x − x0 )
= +
−h h

( x − x0 )( x − x0 − h )
+ f ' ' (ξ ( x ))
2

para alguna ξ(x) en [a, b]. Al diferenciar obtenemos

f ( x0 + h ) − f ( x0 )  ( x − x0 )( x − x0 − h ) 
f ' ( x) = + Dx  f ' ' (ξ ( x ))
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 ( x0 + h ) − f ( x0 )
f ' ( x) ≈ .
h

Un problema que presenta esta fórmula cuando aproximamos f’(x) para los
valores arbitrarios de x radica en que carecemos de información 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 fórmula se simplifica como sigue

f ( x0 + h ) − f ( x0 ) h
(1) f ' ( x) = − f ' ' (ξ ).
h 2

Para valores pequeños de h, podemos utilizar el cociente de la diferencia


[f(x0+h)-f(x0)]/h para aproximar f’(x0) con un error acotado por Mh/2, donde M es una
cota en f’’(x) para x ∈ [a, b]. A esta fórmula se le llama fórmula de la diferencia
progresiva si h> 0 y fórmula de diferencia regresiva si h < 0.

PFE 2000 Página 11


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Sean f(x) = ln x y x0 = 1.8. El cociente

f (1.8 + h ) − f (1.8)
, para h>0
h

sirve para aproximar f’(1.8) con el error

| hf ' ' (ξ ) | | h | |h |
= 2≤ , donde 1.8<ξ<1.8+h.
2 2ξ 2(1.8)2

Los resultados de la tabla se producen cuando h = 0.1, 0.01 y 0.001.

h f(1.8+h) f (1.8 + h ) − f (1.8) |h |


h 2(1.8) 2
0.1 0.64185389 0.5406722 0.0154321
0.01 0.59332685 0.5540180 0.0015432
0.001 0.58834207 0.5554013 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 fórmulas de aproximación a la derivada más generales, supongamos
que {x0, x1,...,xn} son (n + 1) números distintos en algún intervalo I y que f ∈ Cn+1(I).

n
( x − x0 )...( x − xn ) ( n +1)
f ( x ) = ∑ f ( xk ) Lk ( x ) + f (ξ ( x ))
k =0 ( n + 1)!

para alguna ξ(x) en 1, donde Lk(x) denota el polinomio de coeficiente de grado k de


Lagrange para f en x0, x1, ... , xn. Al diferenciar esta expresión obtenemos

PFE 2000 Página 12


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

n
 ( x − x0 )...( x − xn )  ( n +1)
f ' ( x ) = ∑ f ( xk ) L'k ( x ) + Dx  f (ξ ( x ))
k =0  (n + 1)! 

+
( x − x0 )...( x − xn )
( n + 1)!
[
Dx f ( n +1) (ξ ( x )) . ]

Una vez más tendremos un problema al estimar el error de truncamiento, a


menos que x sea uno de los números xj. En este caso, el término que contiene
Dx[f(n+1)(ξ(x))] es cero, y entonces la fórmula queda así:
n
f ( n +1) (ξ ( x j )) n
(2) f ' ( x j ) = ∑ f ( xk ) Lk ' ( x j ) + ∏ ( x j − xk ).
k =0 (n + 1)! k = 0
k≠ j

La ecuación (2) recibe el nombre de fórmula de (n + 1) puntos para aproximar


f’(x1) ya que usa una combinación lineal de los n + 1 valores f(xk) para k = 0, 1,...,n.
En términos generales, la utilización de más puntos de evaluación en la ecuación
(2) produce una mayor exactitud, aunque esto no conviene dada la cantidad de
evaluaciones funcionales y el aumento en el error de redondeo. Las fórmulas más
comunes son las que abarcan tres y cinco puntos de evaluación.
Primero derivamos alguna fórmula útil de tres puntos y consideramos los
aspectos de sus errores. Puesto que

( x − x1 )( x − x2 ) 2 x − x1 − x2
L0 ( x ) = , tenemos L' 0 ( x ) = .
( x0 − x1 )( x0 − x2 ) ( x0 − x1 )( x0 − x2 )

De manera análoga,

2 x − x0 − x2y 2 x − x0 − x1
L'1 ( x ) = L' 2 ( x ) = .
( x1 − x0 )( x1 − x2 ) ( x2 − x0 )( x2 − x1 )

Por tanto, de acuerdo con la ecuación (2),

 2 x j − x1 − x2   2 x j − x0 − x 2 
f ' ( x1 ) = f ( x0 )   + f ( x1 )  
 ( x0 − x1 )( x0 − x2 )   ( x1 − x0 )( x1 − x2 ) 

 2 x j − x0 − x1  1 ( 3) 2
+ f ( x2 )  +
 6 f (ξ j ∏ ( x j − xk ),
)
 2
( x − x 0 )( x 2 − x1 
) k =0
k≠ j

para cada j = 0, 1, 2, donde ξj indica que este punto depende de xj.

PFE 2000 Página 13


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Las tres fórmulas de la ecuación (3) son de gran utilidad si los nodos son
equidistantes, es decir, cuando

x1 = x0 + h y x2 = x0 + 2h, para alguna h≠0.

En el resto de esta sección supondremos que el espaciamiento de los nodos es el mismo.

Al utilizar la ecuación (3) con xj = x0, x1 = x0 + h y con x2= x0 + 2h


obtendremos

1 3 1  h ( 3)
2
f ' ( x0 ) = − f ( x0 ) + 2 f ( x1 ) − f ( x2 ) + f (ξ 0 ).
h 2 2  3

Y al hacer lo mismo con xj = x1, obtenemos

1 1 1  h ( 3)
2
f ' ( x1 ) = − f ( x ) + f ( x ) − f (ξ1 ),
h  2
0 2 
2  6

y para xj = x2,

1 1 3  h ( 3)
2
f ' ( x2 ) = − f ( x ) − 2 f ( x ) + f ( x ) + f (ξ 2 ).
h  2
0 1 2 
2  3

Puesto que x1 = x0 + h y x2 = x0 + 2h, estas fórmulas también pueden expresarse


como

1 3 1  h ( 3)
2
f ' ( x0 ) = −
h  2
f ( x 0 ) + 2 f ( x 0 + h ) −
2
f ( x0 + 2 h )  3 f (ξ 0 ),
+

1 1 1  h ( 3)
2
f ' ( x0 + h ) = −
h  2
f ( x 0 ) +
2
f ( x 0 + 2 h )  6 f (ξ1 ), y

1 1 3  h ( 3)
2
f ' ( x0 + 2h ) =
h  2
f ( x 0 ) − 2 f ( x 0 + h ) +
2
f ( x 0 + 2 h )  3 f (ξ 2 ).
+

Por razones de comodidad, la sustitución de la variable x0 + h por x0 se usa en la


ecuación de en medio para transformar esta fórmula en una aproximación de f’(x0). Una
sustitución semejante, x0 + 2h, por x0 se utiliza en la última ecuación. Esto nos da tres
fórmulas para aproximar f’(x0):

PFE 2000 Página 14


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

2
f ' ( x0 ) =
1
[− 3 f ( x0 ) + 4 f ( x0 + h) − f ( x0 + 2h)] + h f ( 3) (ξ0 ),
2h 3
2
f ' ( x0 ) =
1
[− f ( x0 − h) + f ( x0 + h )] − h f ( 3) (ξ1 ), y
2h 6

2
f ' ( x0 ) =
1
[ f ( x0 − 2h) − 4 f ( x0 − h ) + 3 f ( x0 )] + h f (3) (ξ 2 )
2h 3

Finalmente nótese que, como podemos obtener la última ecuación a partir de la primera
con sólo reemplazar h con -h, en realidad tenemos sólo dos fórmulas:
2
(4) f ' ( x0 ) =
1
[− 3 f ( x0 ) + 4 f ( x0 + h) − f ( x0 + 2h)] + h f ( 3) (ξ0 ),
2h 3
donde ξ0 se encuentra entre x0 y x0 + 2h y

2
(5) f ' ( x0 ) =
1
[ f ( x0 + h) − f ( x0 − h)] − h f ( 3) (ξ1 ),
2h 6

donde ξ1 está entre (x0 - h) y (x0 + h).

El error de la ecuación (5) es aproximadamente la mitad del error de la ecuación


(4). Ello se debe a que en la ecuación (5) se emplean datos en ambos lados de x0 y a que
la ecuación (4) que utiliza únicamente los de un lado. Asimismo, nótese que f debe
evaluarse sólo en dos puntos en la ecuación (5), mientras que en la ecuación (4) se
requieren tres ecuaciones. En la figura (2) se ilustra la aproximación producida con la
ecuación (5).

En la ecuación (4) la aproximación es útil cerca de los extremos del intervalo 1,


ya que posiblemente no se tenga información de f fuera del intervalo.

PFE 2000 Página 15


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Los métodos presentados en las ecuaciones (4) y (5) reciben el nombre de


fórmulas de tres puntos (aunque el tercer punto f(x0) no aparezca en la ecuación 5).
Asimismo, hay métodos llamados fórmulas de cinco puntos en que se evalúa la función
en dos puntos más, pero cuyo término de error tiene la forma 0(h4).

4
(6) f ' ( x0 ) =
1
[ f ( x0 − 2h) − 8 f ( x0 + h ) + 8 f ( x0 + h) − f ( x0 + 2h)] + h f (5) (ξ ).
12h 30

Otra fórmula de cinco puntos de gran utilidad, sobre todo en lo relacionado con
la interpolación de splines cúbicos, 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 (ξ ) (7)
5

donde ξ se encuentra entre x0 y x0 + 4h. Las aproximaciones del extremo izquierdo


pueden obtenerse aplicando la fórmula con h > 0 y las aproximaciones del extremo
derecho, con h<0.

A continuación aparece la tabla recapitulativa de las fórmulas de diferencia de grados


uno y dos que fueron utilizadas en el programa :

Fórmulas de diferencia de grado uno :

Principio :
2 f i + 3 − 9 f i + 2 + 18 f i +1 − 11 f i
f 'i =
6h

Medio :

− f i + 2 + 8 f i + 1 − 8 f i −1 + f i − 2
f 'i =
12h

Fin :

11 f i − 18 f i −1 + 9 f i − 2 − 2 f i − 3
f 'i =
6h

PFE 2000 Página 16


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Fórmulas de diferencia de grado dos :

Principio :

− f i + 3 + 4 f i + 2 − 5 f i +1 + 2 f i
f ' 'i =
h2

Medio :

− f i + 2 + 16 f i +1 − 30 f i + 16 f i −1 − f i − 2
f ' 'i =
12h 2

Fin :

2 f i − 5 f i −1 + 4 f i − 2 − f i − 3
f ' 'i =
h2

PFE 2000 Página 17


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

6. Interpolación de splines cúbicos

La naturaleza oscilatoria de los polinomios de alto grado y la propiedad de


que una fluctuación en una parte pequeña de intervalo puede ocasionar
importantes fluctuaciones en todo él limita su utilización.

Un procedimiento alterno consiste en dividir el intervalo en una serie de


subintervalos, y en cada subintervalo construir un polinomio (generalmente) diferente
de aproximación. A esta forma de aproximar por medio de funciones se le conoce como
aproximación polinómica fragmentaria.
La aproximación polinómica fragmentaria más simple es la interpolación lineal
fragmentaria que consiste en unir una serie de puntos de datos mediante una serie de
segmentos de rectas, como los que aparecen en la figura.

{(xo,f(xo)), (x1,f(x1)),...,(xn,f(xn))}

La aproximación por funciones lineales ofrece una desventaja: no se tiene la


seguridad de que haya diferenciabilidad en los extremos de los subintervalos, lo cual
dentro de un contexto geométrico significa que la función interpolante no es “suave” en
dichos puntos. A menudo las condiciones físicas indican claramente que se requiere esa
condición y que la función aproximante debe ser continuamente diferenciable.
Otro procedimiento consiste en emplear un polinomio fragmentario del tipo
Hermite. Por ejemplo, silos valores de la función f y de f’ se conocen en los puntos x0 <
x1 ... < xn, podemos emplear un polinomio de Hermite de grado tres en cada uno de los
subintervalos [xo, x1], [x1, x2] ,..., [xn-1, xn] para obtener una función continuamente
diferenciable en el intervalo [x0, xn]. Si queremos determinar el polinomio cúbico de
Hermite apropiado en determinado intervalo, basta calcular H3(x) para ese intervalo,
Puesto que los polinomios interpolantes de Lagrange necesarios para calcular H3 son de
primer grado, podemos hacer el cálculo sin gran dificultad. Sin embargo, para utilizar
los polinomios fragmentarios de Hermite en la interpolación general, necesitamos
conocer la derivada de la función que va a ser aproximada, lo cual muchas veces no es

PFE 2000 Página 18


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

posible.
Vamos a estudiar la aproximación por medio de polinomios fragmentarios que
no requieren información sobre la derivada, salvo, quizá, en los extremos del intervalo
donde se aproxima la función.
El tipo más simple de función de polinomio fragmentario diferenciable en un
intervalo entero [x0, xn] es la función obtenida al ajustar un polinomio cuadrático entre
cada par consecutivo de nodos. Esto se hace construyendo una cuadrática en [x0, x1] que
concuerde con la función en xo y en x1 otra cuadrática en [x1, x2] que concuerde con la
función en x1 y en x2 y así sucesivamente. Un polinomio cuadrático general tiene tres
constantes arbitrarias —el término 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 cuadrática 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 aproximación polinómica fragmentaria más común utiliza polinomios entre
cada par consecutivo de nodos y recibe el nombre de interpolación de splines cúbicos.
Un polinomio cúbico general contiene cuatro constantes; así pues, el procedimiento del
trazador cúbico ofrece suficiente flexibilidad para garantizar que el interpolante no sólo
sea continuamente diferenciable en el intervalo, sino que además tenga una segunda
derivada continua en el intervalo. Sin embargo, en la construcción del trazador cúbico
no se supone que las derivadas del interpolante concuerdan con las de la función, ni
siquiera en los nodos.

Dada una función f definida en [a, b] y un conjunto de nodos a = x0 < x1 < ... xn =
b un interpolante de trazador cúbico S para f es una función que cumple con las
condiciones siguientes:

a. S(x) es un polinomio cúbico, 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. S’j+1(xj+1) = S’j(xj+1) para cada j = 0, 1,..., n - 2;

c. S’’j+1(xj+1) = S’’j(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 cúbicos 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 gráfica se
aproxima a la forma que adoptaría una varilla larga y flexible si la hiciéramos pasar por
los puntos de datos {(xo,f(xo)),(x1,f(x1)),...,(xn,f(xn))}.

PFE 2000 Página 19


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

En términos generales, en las condiciones de frontera sujeta se logran


aproximaciones más exactas, ya que abarcan más información acerca de la función.
Pero para que se cumpla este tipo de condición de frontera, se requiere tener los valores
de la derivada en los extremos o bien una aproximación precisa de ellos.

Si queremos construir el interpolante del trazador cúbico de determinada función


f, aplicamos las condiciones de la definición a los polinomios cúbicos

Sj(x) = aj + bj(x - xj) + cj(x - xj)2 + dj(x - xj)3

para cada j = 0, 1,..., n-1.

Está claro que

Sj(xj) = aj = f(xj),

y si se aplica la condición (c),

aj+1 = Sj+1(xj+1) = Sj(xj+1) = aj + bj(xj+1 - xj) + cj (xj+1 - xj)2 + dj (xj+1 - xj)3

para cada j = 0, 1,...,n-2.

Puesto que los términos (xj+1 - xj) se utilizarán varias veces en este desarrollo, conviene
introducir la notación más simple

hj = xj+1 - xj

para cada j = 0, 1,...,n-1. Si también definimos an = f(xn), entonces la ecuación

(1) aj+1 = aj + bjhj + cjhj2 + hj3

será válida para cada j = 0, 1,...,n-1

PFE 2000 Página 20


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

De manera análoga, defina bj = S’(xn) y observe que

Sj’(x) = bj + 2cj(x - xj) + 3dj(x - xj)2

significa que Sj’(x) = bj para cada j = 0, 1,..., n - 1. Al aplicar la condición (d)


obtenemos

(2) bj+1 = bj + 2cjhj + 3djhj2

para cada j = 0, l,..., n-1.

Al definir cn = S”(xn)/2 y al aplicar la condición (e), se obtiene otra relación entre los
coeficientes de S,. En este caso,

(3) cj+1 = cj + 3djhj

para cada j = 0, 1,..., n-1.

Al resolver d~ en la ecuación (3) y al sustituir este valor en las ecuaciones (1) y (2), se
obtienen las ecuaciones
h 2j
(4) a j +1 = a j + b j h j + (2c j + c j +1 )
3
y

(5) bj+1 = bj + hj(cj + cj+1)

para cada j = 0, 1,..., n-1.

La relación final que incluye los coeficientes se obtiene resolviendo la ecuación


correspondiente en la forma de la ecuación (4), primero para bj,

(6) bj =
1
(a j +1 − a j )− h j (2c j + c j+1 )
hj 3

y entonces, con una reducción del índice, para bj-1:

b j −1 =
1
(a j − a j −1 )− h j−1 (2c j−1 + c j )
h j −1 3

Cuando sustituimos estos valores en la ecuación obtenida de la ecuación (5), con el


índice reducido en 1, obtenemos el sistema de ecuaciones lineales

h j −1c j −1 + 2(h j −1 + h j )c j + h j c j +1 = (a j +1 − a j )− 3 (a j + a j −1 ),
3
(7)
hj h j −1

PFE 2000 Página 21


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

para cada j = 1, 2,..., n - 1. Este sistema contiene sólo {c j }j =0 como incógnitas, ya que
n

los valores de {h j }j =0 y de {a j }j = 0 están dados por el espaciado de los nodos {x j }j = 0 y los


n −1 n n

valores de f en éstos.

Nótese que una vez que se conocen los valores de {c j }j =0 , encontrar el resto de las
n

constantes {b j }j = 0 partiendo de la ecuación (6) y {d j }j = 0 partiendo de la ecuación (3)


n −1 n −1

para construir los polinomios cúbicos {S j (x )}j = 0 es fácil.


n −1

La interrogante principal que se plantea en relación con esta construcción es si se


pueden determinar los valores de {c j }j =0 por medio del sistema de ecuaciones dado en
n

(7) y, de ser así, si estos valores son únicos. El siguiente teorema indica que esto es
posible cuando se establece una de las dos condiciones de frontera de la parte (f) de la
definición.

Si definimos f en a = x0 < x1 <...... < xn = b entonces f tendrá un interpolante único de


trazador natural en los nodos x0, x1 xn, es decir, un interpolante de trazador que cumple
con las condiciones de frontera S”(a) = 0 y S”(b) = 0.

Demostración :
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 ecuación vectorial Ax = b, donde A es la matriz de (n + 1) por
(n+1)

y donde b y x son los vectores

PFE 2000 Página 22


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

La matriz A es estrictamente dominante en sentido diagonal. Por tanto, el sistema lineal


tiene una solución única para c0, c1,..., cn.

La solución del problema de los splines cúbicos con las condiciones de frontera S”(xo)
= S”(x0) = 0 puede obtenerse por medio del algoritmo.

Trazador cúbico natural


Para construir el interpolante de trazador cúbico S de la función f, que se define en los
números x0 < x1 <...... < xn y que satisface S”(x0) = S”(xn) = 0:

ENTRADA n; x0, x1,..., xn; a0 = f(x0), a1 = f(x1),..., an = f(xn).

SALIDA aj, bj, cj, dj, para j = 0, 1,..., n-1.


(Nota : S(x) = Sj(x) = aj + bj(x - xj) + cj(x - x1)2 + dj(x - xj)3 para
xj≤x≤xj+1.)

Paso 1 Para i = 0, 1,..., n-1 tome hi = xi+1 - xi.

Paso 2 Para i = 0, 1,..., n-1 tome

α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 método 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 Página 23


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

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).

Demostración
Al aplicar el hecho de que S’(a) = f’(x0) = b0, podemos ver que la ecuación (3.21) con j
= 0 implica que

a1 − a0 h0
f ' (a ) = − ( 2c0 + c1 )
h0 3

En consecuencia,

3
2h0c0 + h0c1 + (a1 − a0 ) − 3 f ' (a )
h0

De manera semejante,

F’(b) = bn = bn-1 + hn-1 ( cn-1 + cn),

de modo que la ecuación (6) con j = n - 1 implica que

an − an −1 hn −1
f ' (b) = − (2cn −1 + cn ) + hn −1 (cn −1 + cn )
hn −1 3
a − an −1 hn −1
= n − ( cn −1 + 2cn ),
hn −1 3

PFE 2000 Página 24


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

y que

3
hn −1cn −1 + 2hn −1cn = 3 f ' (b) − ( a1 − an −1 ).
hn −1

Las ecuaciones (7) junto con las ecuaciones

3
2h0c0 = h0c1 = (a1 − a0 ) − 3 f ' ( a )
h0

3
hn −1cn −1 + 2hn −1cn = 3 f ' (b) − ( an − an −1 )
hn −1

determinan el sistema lineal Ax = b, donde

La matriz A es estrictamente dominante en sentido. En consecuencia, el sistema lineal


tiene una solución única para c0, c1,..., cn.

La solución del problema de los splines cúbicos con condiciones de frontera


S’(x0) = f’(x0) y S’(xn) = f’(xn) se puede obtener usando el algoritmo 3.5.

PFE 2000 Página 25


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

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 aproximación.

La tabla incluye las coordenadas de 21 puntos de datos relativos al sistema de


coordenadas sobrepuestas que aparece en la figura siguiente.
Obsérvese que se utilizan más puntos cuando la curva cambia rápidamente que
cuando lo hace con más lentitud.

X 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
F(x) 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

Al utilizar el algoritmo para generar el trazador cúbico libre con estos datos, se
obtienen los coeficientes que aparecen en la tabla. Esta curva de trazador es casi
idéntica al perfil, como se observa en la figura siguiente.

PFE 2000 Página 26


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

j xj aj bj cj dj
0 0.9 1.3 5.40 0.00 -0.25
1 1.3 1.5 0.42 -0.30 0.95
2 1.9 1.85 1.09 1.41 -2.96
3 2.1 2.1 1.29 -0.37 -0.45
4 2.6 2.6 0.59 -1.04 0.45
5 3.0 2.7 -0.02 -0.50 0.17
6 3.9 2.4 -0.50 -0.03 0.08
7 4.4 2.15 -0.48 0.08 1.31
8 4.7 2.05 -0.07 1.27 -1.58
9 5.0 2.1 0.26 -0.16 0.04
10 6.0 2.25 0.08 -0.03 0.00
11 7.0 2.3 0.01 -0.04 -0.02
12 8.0 2.25 -0.14 -0.11 0.02
13 9.2 1.95 -0.34 -0.05 -0.01
14 10.5 1.4 -0.53 -0.10 -0.02
15 11.3 0.9 -0.73 -0.15 1.21
16 11.6 0.7 -0.49 0.94 -0.84
17 12.0 0.6 -0.14 -0.06 0.04
18 12.6 0.5 -0.18 0.00 -0.45
19 13.0 0.4 -0.39 -0.54 0.60
20 13.3 0.25

PFE 2000 Página 27


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

7. Estructura de la parte cálculo de las


velocidades del programa

En esta parte, voy a explicar la estructura del programa que permite calcular las
velocidades.

Algunas informaciones importantes :


Las diferentes partes del programa no serán presentadas en el orden en el cual están
escritas sino en el orden en el cual están ejecutadas por Fortran.

No serán presentadas las declaraciones de las variables y algunos módulos que están
particulares.

No será presentada la parte que permite calcular las aceleraciones ya que está muy
parecida con la parte que permite calcular las velocidades.

Sin embargo, es posible ver el programa completo (partes para calcular las velocidades
y aceleraciones) en los anexos.

1. Se pide cual es la barra que quiero analizar.


call transformacion(num_barras,num_nudos,num_apoyos,num_parp,nudos,barras,apoyos)

write(10,*)'PARA FINALIZAR PULSE EL BOTÓN DERECHO DEL RATÓN'

funcion que permite tocar una barra

call tocarbarra(elemento,ordenbarra,punto1,punto2,acabar)

Cual es el numero de la barra seleccionada


bar_diag=0
do i=1,num_barras
if ((nudos(barras(i,1),1).eq.punto1%wx).and.(nudos(barras(i,1),2).eq.punto1%wy)) then
if ((nudos(barras(i,2),1).eq.punto2%wx)
.and.(nudos(barras(i,2),2).eq.punto2%wy)) then
bar_diag=i
end if
end if
end do

PFE 2000 Página 28


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

do j=1,num_barras
if ((nudos(barras(j,1),1).eq.punto2%wx).and.(nudos(barras(j,1),2).eq.punto2%wy)) then
if ((nudos(barras(j,2),1).eq.punto1%wx)
.and.(nudos(barras(j,2),2).eq.punto1%wy)) then
bar_diag=j
end if
end if
end do

2. Calculo del ángulo de la barra de entrada en cada posición.


Numero de la barra seleccionada
bar_ent=entradas(1)%barra

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)

llamada de la función que transforme las coordenadas de las extremidades de la barra en un


ángulo respecto a la horizontal

call calcular_angulo(xa,ya,xb,yb,ang)

ang_ent(num_posicion)=ang
end do

3. Calculo de los ángulos extremos de la barra de entrada


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

4. Calculo del ángulo de la barra seleccionada en cada posición.


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)

PFE 2000 Página 29


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

llamada de la función que transforme las coordenadas de las extremidades de la barra en un


ángulo respecto a la horizontal

call calcular_angulo2(xa,ya,xb,yb,ang)

ang_barra(num_posicion)=ang !lo tengo en grados con la horizontal


end do

5. Arreglo en orden creciente de los ángulos en función de la barra de


entrada.
Es necesario hacer eso para no tener problemas cuando se dibujará.
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

6. Cálculo de los coeficientes de influencia de las velocidades.


Aquí se calculan los coeficientes de influencia de las velocidades. Es decir que con el
ángulo de la barra de entrada (θ) y el ángulo de la barra estudiada (ϕ), se calcula :


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

PFE 2000 Página 30


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

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

Para calcular los coeficientes de influencia de las velocidades, se utilizan diferencias


numéricas (el método fue explicado anteriormente). Las formulas son las siguientes.

Función para diferenciar los puntos 1 y 2


subroutine fctini(num_posicion)
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

Función para diferenciar los puntos 3 a n-2

subroutine fctfin(num_posicion)
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

Función para diferenciar los puntos n-1 y n

subroutine fctmed(num_posicion)
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

PFE 2000 Página 31


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

7. Introducción de la ley de entrada


Este parte del programa permite elegir el tipo de movimiento de la barra de entrada :
movimiento con velocidad constante o aceleración constante. Además, se puede
introducir el modulo de la velocidad o aceleración.

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 significa velocidad constante

movt=2
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 significa aceleracion constante

movt=1
end if

El programa llama ventanas creadas con la función “dialog box” donde saca valores
introducidas por el usuario y que serán utilizadas luego. Aquí siguen estas ventanas.

PFE 2000 Página 32


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

PFE 2000 Página 33


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

8. Cálculo de las velocidades


Con los coeficientes de influencia de velocidades y la ley de entrada, se deduce la
velocidad de la barra estudiada.

El coeficiente de influencia es :
dϕ dϕ dt
= ⋅
dθ dt dθ

Se calcula :

dt

Así, se puede deducir :


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 Página 34


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

9. Calculo de las velocidades extremas de la barra estudiada


Aquí se calcula las velocidades extremas de la barra estudiada para dibujar el gráfico
con una buena escala.
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

10. Interpolación con los splines cúbicos


Para alisar la curva, es necesario conocer muchos puntos. Por eso se utiliza un método
de interpolación con los splines cúbicos para calcular las coordenadas de muchos puntos
en función de los puntos conocidos (el método fue explicado anteriormente).
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

PFE 2000 Página 35


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

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 ecuación de la curva.


Su forma es Sj(x) = aj+ bj * (x - xj) + cj * (x - xj)^2 + dj * (x-xj)^3 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

11. Características de la ventana donde se dibuja el gráfico.


Estas líneas permiten introducir las características de la ventana donde se dibuja el
gráfico.

Estas características son :

la posición sobre la pantalla,


el tamaño,
el título,
la escala...
estado=GETWSIZEQQ(QWIN$FRAMEWINDOW,QWIN$SIZEMAX,winfofw)
status=GETWINDOWCONFIG(configfw)

Open(Unit=15,File='User',Title='diagrama de velocidades')
config15.numxpixels=(configfw.numxpixels*0.7)
config15.numypixels=(configfw.numypixels*0.7)
10 ifun=focusqq(15)!la traigo delante y pinto en ella
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

PFE 2000 Página 36


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

if (vmax.lt.0.AND.vmin.lt.0) then
vmax=0
end if

12. Características del gráfico.


Estas líneas permiten introducir las características del gráfico.

Estas características son :

los ejes,
las flechas,
los títulos de los ejes,
los valores extremos,
los colores...
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)!la traigo delante y pinto en ella


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(vmax-vmin))
call moveto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero,wxy)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),-.03*abs(vmax-vmin))
call moveto_w(ang_mini,vmin,wxy)
ifun=lineto_w(ang_mini,vmax+.1*abs(vmax-vmin))
ifun=lineto_w(ang_mini-.015*(ang_maxi-ang_mini),vmax+.05*abs(vmax-vmin))
call moveto_w(ang_mini,vmax+.1*abs(vmax-vmin),wxy)
ifun=lineto_w(ang_mini+.015*(ang_maxi-ang_mini),vmax+.05*abs(vmax-vmin))

ifun=focusqq(15)
res=setactiveqq(15)
numfonts=initializefonts()
fontnum=setfont('t''Arial''h14w8')
ifun=setcolor(15)

call moveto_w(ang_mini-.06*(ang_maxi-ang_mini),vmax+.18*abs(vmax-vmin),wxwy)
call outgtext('Velocidad')
call moveto_w(ang_maxi+.065*(ang_maxi-ang_mini),.11*abs(vmax-vmin),wxwy)
call outgtext('angulo')
call moveto_w(ang_maxi+.07*(ang_maxi-ang_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_maxi-ang_mini),vmax+.03*abs(vmax-vmin),wxwy)
write (y1,'(f5.2)')vmax
call outgtext (y1)

PFE 2000 Página 37


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

call moveto_w (ang_mini-.09*(ang_maxi-ang_mini),vmin+.03*abs(vmax-vmin),wxwy)


write (y2,'(f5.2)')vmin
call outgtext (y2)
call moveto_w (ang_mini-.04*(ang_maxi-ang_mini),-.04*abs(vmax-vmin),wxwy)
write (x1,'(f5.2)')ang_mini
call outgtext (x1)
call moveto_w (ang_maxi-.04*(ang_maxi-ang_mini),-.04*abs(vmax-vmin),wxwy)
write (x2,'(f5.2)')ang_maxi
call outgtext (x2)

13. Trazado de la curva


Se traza la curva de la velocidad de la barra seleccionada en función del ángulo de la
barra de entrada.

Hay que notar que el eje de las abscisas es graduado con valores crecientes de la
izquierda hasta la derecha y que el eje de las ordenadas es graduado con valores
crecientes de abajo arriba.
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

PFE 2000 Página 38


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

8. Instrucciones para utilizar el programa

8.1. ¿Cómo cargar el programa?


Es necesario tener un ordenador con el programa Fortran Powerstation de Microsoft.

Aquí siguen las instrucciones para cargar el programa y utilizarlo :

1. Abrir Fortran Powerstation,

2. Seleccionar :

/ File / New...
Se abre una ventana,

3. Seleccionar :
Project Workspace
OK,
Se abre una ventana,

4. Dar las informaciones :


Type : QuickWin Application,
Location : ...,
Name : ...”nombre”,
Se crea una carpeta nombre en el emplazamiento especificado
y un fichero Project Workspace que se llama nombre.mdp,

5. Con el Explorador de Windows :


Copiar los ficheros desde el disquete hasta la carpeta nombre
(.aps, .h, .mak, .mec, .f90, .fd, .res, .rc, Icono),

PFE 2000 Página 39


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

6. Seleccionar :
/ Insert / Files into Project...
Se abre una ventana,

7. Seleccionar todos los ficheros,


OK,

8. Seleccionar :
/ Build / Build nombre.exe

9. Seleccionar :
/ Build / Execute nombre.exe

8.2. ¿Cómo utilizar el programa?

1. Abrir el fichero .mdp.

2. Ejecutar el programa (/ Build / Execute ...).

3. En el menú Archivo, hay dos opciones principales :


Crear un nuevo modelo :

/ Archivo / Nuevo con ratón


/ Archivo / Nuevo con teclado

O abrir un modelo existente.

PFE 2000 Página 40


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

4. Mover el sistema con el opción :


/ Problemas de Posición / Posiciones sucesivas,

Seleccionar la barra de entrada pinchándola,

Introducir el incremento del ángulo de esta barra.

Este incremento puede ser positivo (sentido trigonométrico),


o negativo (sentido anti-trigonométrico).

PFE 2000 Página 41


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

5. Esperar que el movimiento se acabe :


El sistema se para cuando no puede resolver casos particulares (puntos muertos).

PFE 2000 Página 42


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Sin embargo, se puede parar el movimiento cuando se quiere seleccionando :


/ Problemas de Posición / Detener.

6. Empezar el análisis :
Seleccionar / Análisis / velocidades,
o / Análisis / aceleraciones.

PFE 2000 Página 43


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

7. Elegir la barra a estudiar :


Seleccionar esta barra pinchándola.

Se abre una caja de diálogo.

8. Elegir el tipo de movimiento con una de las dos opciones propuestas:

ω = constante (en rebeldía)


A = constante

OK.

Se abre otra caja de diálogo.

9. Datos :
Aquí se introduce el módulo de la velocidad o de la aceleración de la barra de
entrada.

PFE 2000 Página 44


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Hay que saber que este módulo es siempre positivo porque el sentido fue dado
elogiando el incremento positivo o negativo al principio (/ Problemas de Posición /
Posiciones sucesivas). Si el usuario introduce un valor negativo, sólo será considerado
el módulo.

OK.

10. Gráfico :
Se abre una ventana con el gráfico de la velocidad o de la aceleración de la barra
estudiada en función 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 aceleración nula.

El eje de las ordenadas representa la velocidad o la aceleración de la barra


estudiada.
Este eje esta situado para el ángulo mínimo de la barra de entrada.

PFE 2000 Página 45


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Cuatro valores :

Angulo de la barra de entrada mínimo,


Angulo de la barra de entrada máximo,
Velocidad o aceleración mínima,
Velocidad o aceleración máxima.

La curva de las velocidades o aceleraciones en función de los ángulos de


la barra de entrada.

Para leer bien el gráfico, hay que saber que el ángulo de la barra de entrada tiene
valores crecientes de la izquierda hasta la derecha. Así, aun cuando el ángulo tome
valores decrecientes respecto a la horizontal en el tiempo, los ángulos se representan por
valores crecientes de la izquierda hasta la derecha.

PFE 2000 Página 46


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

9. Comparación entre el método de los


coeficientes de influencia y el método MEF

En el programa, hay dos posibilidades para obtener el gráfico de las velocidades


o aceleraciones en función del ángulo de la barra de entrada.

La primera fue explicada antes y constituye mi proyecto. Utilice el método de


los coeficientes de influencia.

La segunda es utilizar el menú A cinemática que utiliza el método MEF y que


fue programado por una alumna de la Escuela Superior de Ingenieros de Bilbao.

Por eso, es interesante comparar estos dos métodos a través de un ejemplo


sencillo.

Se utilizan los parámetros siguientes :

Incremento : -1

Velocidad constante

PFE 2000 Página 47


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Módulo de la velocidad de la barra de entrada : 1

Con la función “Debug” del programa Fortran Powerstation de Microsoft, es


posible ver los valores de las variables.

Con este ejemplo, salen estos valores :

Hay que notar que los valores calculados con el método de los coeficientes de influencia
son los valores antes de la interpolación con los splines cúbicos (que sale demasiados
puntos para comparar bien).

Posición Angulo Velocidad Velocidad


barra entrada (coef influ) (MEF)
1 32,49 -0,889553563 -0,890645021
2 33,49 -0,932346076 -0,931197825
3 34,49 -0,968775755 -0,968803242
4 35,49 -1,003841169 -1,003840914
5 36,49 -1,036586840 -1,036589589
6 37,49 -1,067430397 -1,067356852
7 38,49 -1,096464126 -1,096358699
8 39,49 -1,123400773 -1,123851416
9 40,49 -1,150205335 -1,150015803
10 41,49 -1,175149838 -1,175025163
11 42,49 -1,198670661 -1,199071751
12 43,49 -1,222566504 -1,222292533
13 44,49 -1,244989737 -1,244820667
14 45,49 -1,266439509 -1,266812415
15 46,49 -1,288162857 -1,288377325
16 47,49 -1,309927476 -1,309635399
17 48,49 -1,330852173 -1,330696349
18 49,49 -1,351351006 -1,351687759
19 50,49 -1,372522005 -1,372710569
20 51,49 -1,394276383 -1,393877514
21 52,49 -1,415451302 -1,415299467
22 53,49 -1,436662486 -1,437105220
23 54,49 -1,459296377 -1,459410833
24 55,49 -1,482287075 -1,482349939
25 56,49 -1,506049670 -1,506066458

Podemos ver que para sistemas de un grado de libertad (este es bastante


sencillo), los dos métodos salen resultados parecidos.

Por eso, los dos métodos son factibles. Para elegir uno de los dos, hay que saber
cual es el más sencillo para el desarrollo futuro del programa.

PFE 2000 Página 48


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

10. LIMITACIONES

Para utilizar bien el programa y mejorarlo en el futuro, hay que conocer los
límites.

Este programa permite analizar sistemas en mecanismos planos de un grado de


libertad constituidos de barras, rotulas, rotulas fijas, deslizaderas... Se puede dibujarlos
con ratón o teclado. Se puede también modificarlos.

El programa permite analizar una barra cada vez que esta ejecutado.

Ahora, las condiciones iniciales deben ser : velocidad o aceleración constante.

Quedan problemas de análisis con casos particulares.

Los problemas identificados son los siguientes :

• A veces, el gráfico sale una curva que parece sinusoidal y de la cual no se


puede ver los extremos. Parece que el cálculo de las velocidades funciona bien pero hay
un problema con la función de interpolación. Frecuentemente, este problema ocurre
cuando se estudia una barra cual ángulo no mueve mucho. Por eso, podría ser un
problema de precisión o de división por cero.

• Hay también un problema de continuidad de la curva de las aceleraciones.

PFE 2000 Página 49


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

11. CONCLUSIÓN

El objetivo de este proyecto fue la programación de un procedimiento de cálculo


de velocidades y aceleraciones en mecanismos planos de un grado de libertad con el
método de los coeficientes de influencia. Así tenemos dos enfoques (el otro es con el
método de los elementos finitos).

El proyecto se desarrollo según tres ejes :

comprensión del método de los coeficientes de influencia,

busca, elección y transcripción de varios métodos


(splines cúbicos, diferenciación numérica),

programación.

Ahora, el programa funciona y dibuja los gráficos.

En el transcurso de la utilización del programa para varios sistemas, se revela


que había que mejorarlo para que funcione con casos particulares.

Eso fue hecho; sin embargo, subsiste algunos problemas.

Para mi, este proyecto fue muy interesante. Me permití aprender un lenguaje
informático, hacer un trabajo en grupo (ya que muchos alumnos trabajaban en diferentes
partes del programa) y pasar el obstáculo del idioma.

Además, los profesores y los alumnos de la escuela están siempre disponibles y


me ayudaron cada vez que lo necesitaba. Quiero agradecerlos y gracias a ellos, mi
temporada en Bilbao fue un real placer.

PFE 2000 Página 50


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

12. BIBLIOGRAFÍA

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

Método de los coeficientes de influencia :


An Indirect Method for determining accelerations in complex mechanisms
Thomas P Goodman
Transactions of the ASME (november 1958)

Analysis of Comlex kinematic chains with influence coefficients


J Moodrey
Journal of Applied Mechanics,
Transactions of the ASME (june 1959)

Kinematics and Dynamics of planar machinery


Paul Burton
Prentice-Hall International Editon

Mechanics of Machines
Samuel Doughty
Wiley

Método de las diferencias numéricas :

Applied Numerical methods in C


Shoichiro Nakamura
Prentice-Hall International Editon

PFE 2000 Página 51


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

Numerical Methods for computer science, engineering and mathematics


J H Mathews
Prentice-Hall International Editon

Numerical Analysis
Richard L Burden
J Douglas Faires

Numerical Methods for engineers


S C Charpa
R P Canale
Mc Graw-Hill

Introduction to Numerical analysis


F B Hilderbrand

Método de los splines cúbicos :


Numerical Analysis
Richard L Burden
J Douglas Faires

PFE 2000 Página 52


MEUNIER
Procedimiento de cálculo de velocidades y aceleraciones en mecanismos planos

13. ANEXOS

PFE 2000 Página 53


MEUNIER
!*********************************************************************
*************!
! 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

!
!
! Cual es el numero de la barra seleccionada
!
!
!

call
transformacion(num_barras,num_nudos,num_apoyos,num_parp,nudos,barras,a
poyos)
write(10,*)'PARA FINALIZAR PULSE EL BOTÓN DERECHO DEL
RATÓN'
call tocarbarra(elemento,ordenbarra,punto1,punto2,acabar)

!
!
! Numero de la barra seleccionada
!
!
!

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

!
!
! ¿Cual es la barra de entrada?
!
!
!

bar_ent=entradas(1)%barra

!
!
! Calculo del ángulo de la barra de entrada en cada
posición !
!
!

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)
! Llamada de la función que transforme las coordenadas
!
! de las extremidades de la barra en un ángulo respecto a la
horizontal !

ang_ent(num_posicion)=ang
end do

!
!
! Cálculo de los angulos extremos de la barra de entrada
!
!
!

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

!
!
! Cálculo del ángulo de la barra seleccionada en cada
posición !
!
!

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

!
!
! Arreglo en orden creciente de los ángulos
!
! en función de la barra de entrada
!
!
!

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

!
!
! Cálculo 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

!
!
! Se pide la ley de entrada desde una pantallita
!
!
!

call ley_entrada(movt,var_ent)

!
!
! Cálculo de las velocidades
!
!
!

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

!
!
! Calculo de las velocidades extremas de la barra estudiada
!
!
!

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
!
!
! Se llama la subrutina de interpolación
!
!
!

call interpolacion()

end subroutine vitesses

!*********************************************************************
*************!
!*********************************************************************
*************!
! 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

!
!
! Se llama la subrutina vitesses
!
!
!

call vitesses(bar_diag)

!
!
! Características de la ventana donde se dibuja el
gráfico !
!
!

estado=GETWSIZEQQ(QWIN$FRAMEWINDOW,QWIN$SIZEMAX,winfofw)
status=GETWINDOWCONFIG(configfw)
Open(Unit=15,File='User',Title='diagrama de velocidades')
config15.numxpixels=(configfw.numxpixels*0.7)
config15.numypixels=(configfw.numypixels*0.7)
10 ifun=focusqq(15) !la traigo delante y pinto en
ella
status=SETWINDOWCONFIG(config15)

If(.NOT.status) Goto 10
winfo15.x=0
winfo15.y=0
estado=SETWSIZEQQ(15,winfo15)

!
!
! Características del gráfico
!
!
!

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))

!
!
! dibujo los ejes
!
!
!

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(vmax-
vmin))
call moveto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero,wxy)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),-.03*abs(vmax-
vmin))
call moveto_w(ang_mini,vmin,wxy)
ifun=lineto_w(ang_mini,vmax+.1*abs(vmax-vmin))
ifun=lineto_w(ang_mini-.015*(ang_maxi-
ang_mini),vmax+.05*abs(vmax-vmin))
call moveto_w(ang_mini,vmax+.1*abs(vmax-vmin),wxy)
ifun=lineto_w(ang_mini+.015*(ang_maxi-
ang_mini),vmax+.05*abs(vmax-vmin))

!
!
! Se llama la subrutina que permite escribir en la ventana
!
!
!

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()

end subroutine diag_vit

!*********************************************************************
*************!
!*********************************************************************
*************!
! subroutina escribir
!
!*********************************************************************
*************!
!*********************************************************************
*************!

! Subrutina para escribir en la ventana


!

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_maxi-
ang_mini),vmax+.18*abs(vmax-vmin),wxwy)
call outgtext('Velocidad')
call moveto_w(ang_maxi+.065*(ang_maxi-
ang_mini),.11*abs(vmax-vmin),wxwy)
call outgtext('angulo')
call moveto_w(ang_maxi+.07*(ang_maxi-
ang_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_maxi-
ang_mini),vmax+.03*abs(vmax-vmin),wxwy)
write (y1,'(f7.2)')vmax
call outgtext (y1)
call moveto_w (ang_mini-.09*(ang_maxi-
ang_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)

end subroutine escribir

!*********************************************************************
*************!
!*********************************************************************
*************!
! Interpolación con el método de los trazadores
cúbicos !
!*********************************************************************
*************!
!*********************************************************************
*************!

subroutine interpolacion ()

use tipos
use msimsl
use msflib
use 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

! Tenemos la ecuación de la curva :


!
! Sj(x) = aj+ bj * (x - xj) + cj * (x - xj)^2 + dj * (x-xj)^3
!
! 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

end subroutine interpolacion


!*********************************************************************
*************!
!*********************************************************************
*************!
! functiones de diferencias numérica
!
!*********************************************************************
*************!
!*********************************************************************
*************!

!
!
! Función para diferenciar los puntos 1 y 2
!
!
!

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

!
! Función para diferenciar los puntos 3 a n-2
!

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

!
! Función para diferenciar los puntos n-1 y n

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

!
!
! Cual es el numero de la barra seleccionada
!
!
!

call
transformacion(num_barras,num_nudos,num_apoyos,num_parp,nudos,barras,a
poyos)
write(10,*)'PARA FINALIZAR PULSE EL BOTÓN DERECHO DEL
RATÓN'
call tocarbarra(elemento,ordenbarra,punto1,punto2,acabar)

!
!
! Numero de la barra seleccionada
!
!
!

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

!
!
! ¿Cual es la barra de entrada?
!
!
!

bar_ent=entradas(1)%barra

!
!
! Calculo del ángulo de la barra de entrada en cada
posición !
!
!

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

!
!
! Cálculo de los angulos extremos de la barra de entrada
!
!
!

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

!
!
! Cálculo del ángulo de la barra seleccionada en cada
posición !
!
!

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

!
!
! Arreglo en orden creciente de los ángulos
!
! en función de la barra de entrada
!
!
!

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

!
!
! Cálculo 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

!
!
! Se pide la ley de entrada desde una pantallita
!
!
!

call ley_entrada(movt,var_ent)
!
!
! Cálculo de las velocidades
!
!
!

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

!
!
! Calculo de las velocidades extremas de la barra estudiada
!
!
!

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

!
!
! Se llama la subrutina de interpolación
!
!
!

call interpolacion2()

end subroutine acceleration

!*********************************************************************
*************!
!*********************************************************************
*************!
! SUBRUTINA PARA DIBUJAR EL DIAGRAMA DE VELOCIDADES
!
!*********************************************************************
*************!
!*********************************************************************
*************!

subroutine diag_acel()

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

!
!
! Se llama la subrutina vitesses
!
!
!

call acceleration(bar_diag)

!
!
! Características de la ventana donde se dibuja el
gráfico !
!
!

estado=GETWSIZEQQ(QWIN$FRAMEWINDOW,QWIN$SIZEMAX,winfofw)
status=GETWINDOWCONFIG(configfw)

Open(Unit=15,File='User',Title='diagrama de aceleraciones')
config15.numxpixels=(configfw.numxpixels*0.7)
config15.numypixels=(configfw.numypixels*0.7)
10 ifun=focusqq(15) !la traigo delante y pinto en
ella
status=SETWINDOWCONFIG(config15)

If(.NOT.status) Goto 10
winfo15.x=0
winfo15.y=0
estado=SETWSIZEQQ(15,winfo15)

!
!
! Características del gráfico
!
!
!
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))

!
!
! dibujo los ejes
!
!
!

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(amax-
amin))
call moveto_w(ang_maxi+.05*(ang_maxi-ang_mini),cero,wxy)
ifun=lineto_w(ang_maxi+.03*(ang_maxi-ang_mini),-.03*abs(amax-
amin))
call moveto_w(ang_mini,amin,wxy)
ifun=lineto_w(ang_mini,amax+.1*abs(amax-amin))
ifun=lineto_w(ang_mini-.015*(ang_maxi-
ang_mini),amax+.05*abs(amax-amin))
call moveto_w(ang_mini,amax+.1*abs(amax-amin),wxy)
ifun=lineto_w(ang_mini+.015*(ang_maxi-
ang_mini),amax+.05*abs(amax-amin))

!
!
! Se llama la subrutina que permite escribir en la ventana
!
!
!

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()

end subroutine diag_acel

!*********************************************************************
*************!
!*********************************************************************
*************!
! subroutina escribir2
!
!*********************************************************************
*************!
!*********************************************************************
*************!

! Subrutina para escribir en la ventana


!

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_maxi-
ang_mini),amax+.18*abs(amax-amin),wxwy)
call outgtext('Aceleracion')
call moveto_w(ang_maxi+.065*(ang_maxi-
ang_mini),.11*abs(amax-amin),wxwy)
call outgtext('angulo')
call moveto_w(ang_maxi+.07*(ang_maxi-
ang_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_maxi-
ang_mini),amax+.03*abs(amax-amin),wxwy)
write (y1,'(f7.2)')amax
call outgtext (y1)
call moveto_w (ang_mini-.09*(ang_maxi-
ang_mini),amin+.03*abs(amax-amin),wxwy)
write (y2,'(f7.2)')amin
call outgtext (y2)
call moveto_w (ang_mini-.04*(ang_maxi-ang_mini),-
.04*abs(amax-amin),wxwy)
write (x1,'(f7.2)')ang_mini
call outgtext (x1)
call moveto_w (ang_maxi-.04*(ang_maxi-ang_mini),-
.04*abs(amax-amin),wxwy)
write (x2,'(f7.2)')ang_maxi
call outgtext (x2)

end subroutine escribir2

!*********************************************************************
*************!
!*********************************************************************
*************!
! Interpolación con el método de los trazadores
cúbicos !
!*********************************************************************
*************!
!*********************************************************************
*************!

subroutine interpolacion2 ()

use tipos
use msimsl
use msflib
use 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 ecuación de la curva :
!
! Sj(x) = aj+ bj * (x - xj) + cj * (x - xj)^2 + dj * (x-xj)^3
!
! 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

end subroutine interpolacion2

!*********************************************************************
*************!
!*********************************************************************
*************!
! functiones de diferencias numérica
!
!*********************************************************************
*************!
!*********************************************************************
*************!

!
! Función para diferenciar los puntos 1 y 2

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

!
! Función para diferenciar los puntos 3 a n-2
!

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

!
! Función para diferenciar los puntos n-1 y n

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

Vous aimerez peut-être aussi