E S C U E L A P O L I T É C N I C A N A C I O N A L
FACULTAD DE INGENIERÍA ELÉCTRICA
"ESTUDIO DEL PÉNDULO INVERTIDO
Y SIMULACIÓN DINÁMICA
MEDIANTE UN PROGRAMA PARA WINDOWS"
TESIS DE GRADO PREVIA A LA OBTENCIÓN DEL
TITULO DE INGENIERO EN ELECTRÓNICA Y CONTROL
POR
GONZALO FABRICIO MONTALVAN AREVALO
QUITO, DICIEMBRE DE 1994
CERTIFICO QUE EL PRESENTE TRABAJO
HA SIDO REALIZADO EN SU TOTALIDAD
POR EL SR. GONZALO FABRICIO
MONTALVAN AREVALO.
Ing. Marco "Barragán
DIRECTOR DE TESIS
AGRADECIMIENTO
Mi más sincero agradecimiento al
Ing. Marco Barragán por su
acertada dirección de esta tesis,
sin cuya ayuda no hubiese sido
posible la culminación de la
misma.
DEDICATORIA
A mis padres.
ÍNDICE
CAPITULO I INTRODUCCIÓN
Obj etivos 1
Generalidades.
Elección de la planta e importancia del tema . 3
La simulación dinámica como alternativa de aprendizaje . . 5
Descripción de la tesis 6
CAPITULO II MODELACIÓN MATEMÁTICA
2.1 Obtención de las ecuaciones que describen-
el sistema 8
2.2 Linealización de las ecuaciones 17
2.3 Descripción del sistema a variables de estado ...... 21
CAPITULO III COMPENSACIONES
3. 1 Realimentación de estado 28
3.2 Compensación lineal 42
3.3 Control de tiempo mínimo 48
3.4 Influencia del modelo utilizado en la forma
de la compensación 57
CAPITULO IV DESARROLLO DEL PROGRAMA
4.1 Simulación dinámica 59
4. 2 Compensaciones 62
4 . 3 Diagramas de f luj o 64
4.4 Funciones utilizadas 70
4.5 Ejercicios 76
CAPITULO V -RESULTADOS Y CONCLUSIONES
5.1 Resultados 90
5 . 2 Conclusiones 92
BIBLIOGRAFÍA 97
ANEXOS
Nomenclatura utilizada 100
Manual del usuario 103
Listado del programa 111
CAPITULO I
INTRODUCCIÓN
OBJETIVOS.
En la actualidad la computación se ha convertido en
una valiosa herramienta de cálculo en todos los campos de
la ingeniería y ha permitido una mayor versatilidad y un
más rápido desarrollo de la misma. Aquí, nosotros
utilizaremos a la computación para el estudio de los
sistemas de control a fin de facilitar los cálculos
complejos que resultan al aplicar un tipo de control a
determinada planta.
Mediante el presente trabajo se pone a consideración
del estudiante de Control un programa de computación que le
servirá como una herramienta útil con la que pueda aplicar
los conocimientos adquiridos en Control tales como la
realimentación de estado, el control proporcional
derivativo y control de tiempo mínimo u óptimo a un
problema clásico de control: el péndulo invertido.
2
El programa desarrollado se comporta como si se
dispusiera de la planta real mediante la simulación
dinámica de ésta (animación gráfica del péndulo invertido
en el computador), permitiéndonos observar su
comportamiento ante determinado tipo de control, con un
costo mínimo y con todas las ventajas que ofrece el entorno
gráfico Windows. Para el desarrollo del programa se utilizó
el compilador Turbo C++ para Windows, versión 3.1 y se lo
realiso con la técnica de programación orientada a objetos.
El programa fue implementado en un' computador 486 DX
compatible con I.B.M. con tarjeta de gráficos V.G.A, que es
el más difundido en nuestro medio y que además se dispone
en laboratorio. Para poder utilizar el programa se debe
tener instalado el programa Windows en el computador y debe
tener la suficiente memoria para su ejecución.
El programa desarrollado es versátil y de fácil
comprensión y utilización para el usuario, tiene menús
desplegables para elegir las opciones y cuadros de diálogo
para ingresar los datos. Además tiene opciones para
presentar los resultados, copiar gráficos al portapapeles,
impresión directa desde el menú de cualquier texto o
gráfico de la ventana del programa sin tener que recurrir a
otro programa y una ayuda práctica e ilustrativa que se
selecciona directamente desde el menú del programa para
aprender a utilizarlo.
3
Se presenta a la simulación dinámica de una planta
como un auxiliar en el aprendizaje de las técnicas de
Control Moderno tales como la realimentación de estado,'lo
que permitirá al estudiante centrarse en el diseño del
controlador sin tener que preocuparse de lo relativo al
ensamblaje y armado, pero al mismo tiempo observar en la
simulación el funcionamiento de la planta con el
controlador diseñado y la respuesta en el tiempo.
El programa funciona bajo el entorno Windows con lo
que se consiguen las ventajas que ofrece este entorno como
son: el poder correr varios programas .al mismo tiempo, la
utilidad del portapapeles para copiar cualquier gráfico de
una aplicación a otra, la selección automática del
controlador de la tarjeta de video por lo tanto el programa
puede ser ejecutado en cualquier computador compatible con
I.B.M. independientemente del hardware, etc.
GENERALIDADES .
ELECCIÓN DE LA PLANTA E IMPORTANCIA DEL TEMA.
Se eligió al péndulo invertido, un problema clásico de
control, por ser una planta de inestabilidad inherente y
porque es un sistema que se puede animar o simular por
medio de un programa de computación.
4
El péndulo invertido consiste en una varilla sujeta en
un extremo por un pivote que le permite rotar libremente en
un plano vertical paralelo a la trayectoria del carro. De
esta manera el extremo superior de la varilla queda libre3
resultando inestable su posición vertical. El pivote se
encuentra instalado en un carro que puede moverse en
movimiento rectilíneo, tal como se indica en la figura 1.1.
Fig- 1.1 Péndulo Invertido
El objetivo del péndulo invertido, es aplicar una
fuerza externa al carro del tal manera de mantener la
varilla en posición vertical. La fuerza aplicada al carro
dependerá del tipo de controlador implementado.
La solución de un problema de control no sólo debe
quedarse en el diseño de determinado compensador, sino que
el resultado obtenido será más comprensible al tener una
idea de cómo reaccionará la planta frente a éste, lo que se
observará en la simulación dinámica y en los gráficos en el
tiempo de cada estado del sistema.
5
Los cálculos se facilitan al utilizar un programa
permite obtener los resultados teóricos esperados, tales
como la respuesta en el tiempo, parámetros del controlador,
y realizar un análisis de todos los estados del sistema.
LA SIMULACIÓN DINÁMICA COMO ALTERNATIVA DE APRENDIZAJE.
La simulación dinámica, también llamada animación
cinética, de una planta real mediante un programa de
computación es una alternativa que en la actualidad se está
usando a gran escala para simular el comportamiento de un
sistema físico bajo determinadas condiciones aún a nivel
industrial.
Es útil para el estudio de los sistemas de control,
puesto que se pueden ensayar diferentes alternativas de
control con diferentes especificaciones y observar el
comportamiento del sistema como si se dispusiera de la
planta real en funcionamiento sin tener que preocuparse por
eventuales daños de la planta, la instalación de misma y
los problemas que trae consigo como son los defectos de
construcción, conexión, cambios en la planta por el
envejecimiento de sus elementos, etc.
En el campo industrial también se utiliza la
simulación dinámica, así cuando se adquiere un sistema
nuevo viene con el software de soporte que permite aprender
6
a utilizar todas las opciones del sistema y simularlo
mediante un programa de computación.
DESCRIPCIÓN DE LA TESIS.
Para una rápida referencia aquí explicaremos como está
desarrollada la tesis:
En el capitulo II se hace la demostración matemática
formal para encontrar las ecuaciones diferenciales que
definen al sistema, se define el sistema de referencia
utilizado, y - se hacen los diagramas de cuerpo libre de la
varilla y del carro. Para posteriormente linealizar las
ecuaciones bajo ciertas suposiciones, se obtiene las
funciones de transferencia y por último se describe el
sistema a variables de estado.
En el capítulo III se hace la implementación de las
alternativas de control propuestas, explicando todo el
desarrollo matemático para encontrar la solución del
problema.
En el capítulo IV se describe de manera general las
principales funciones utilizadas en el programa, si se
ctuiere una mejor referencia de cómo se realizó el programa
fuente se deberá revisar los comentarios existentes en el
listado del mismo. Además se presenta algunos diagramas de
7
flujo de funciones donde se realizan bifurcaciones de
acuerdo al valor de alguna variable y se aplica el programa
a un ejercicio numérico específico para cada compensación.
En el capitulo V se presentan los resultados
conseguidos, y las conclusiones.
En los anexos se hace una list'a completa de la
nomenclatura utilizada para obtener una rápida referencia o
conseguir información de algún término que se requiera.
Además se presenta al usuario un manual para que pueda
utilizar el programa, aunque se puede acceder directamente
a ayuda desde el menú del mismo,
Por último se presenta el listado del programa que fue
desarrollado en su totalidad con el paquete Turbo C+4-
versión 3.1 de Borland. Mediante este paquete se tienen
todas las herramientas .necesarias para la programación bajo
Windows orientada a objetos.
CAPITULO II
MODELACIÓN MATEMÁTICA
2.1 OBTENCIÓN DE LAS ECUACIONES QUE DESCRIBEN EL SISTEMA.
Para obtener las ecuaciones diferenciales que
describen el sistema, consideraremos el movimiento del
péndulo invertido en dos dimensiones, es decir, el péndulo
gira en el plano vertical (plano xy) paralelo a la
trayectoria del carro y perpendicular al plano horizontal.
Primero comenzaremos analizando las fuerzas que
actúan tanto en el carro cuanto en la varilla, que
representa al péndulo, mediante los diagramas de cuerpo
libre de cada uno de ellos. Al mismo tiempo iremos
introduciendo la nomenclatura que se utilizará de aquí en
adelante.
El sistema de referencia que utilizaremos para el
problema es el siguiente: el eje x es paralelo a la
dirección del movimiento del carro, el origen de las
9
abscisas está en el centro de la pista. El eje y es
perpendicular a la pista y el origen de las ordenadas está
sobre la superficie del carro. En la figura 2.1 se muestra
el péndulo invertido junto al sistema de referencia
utilizado para la modelación matemática.
teje y (+]
eje x [+J
fig_ 2.1 Sistema de referencia
En la figura 2.2 se identifican las fuerzas que se
aplican a la varilla y en general las diferentes variables
que utilizaremos para la modelación matemática. La varilla,
de longitud total igual a 2L, es homogénea y delgada de tal
manera que su centro de gravedad está a una distancia L de
cualquiera de sus extremos; en ésta actúan tres fuerzas: el
peso de la varilla mg representado en el centro de gravedad
de la misma, la reacción horizontal H(-t) y la reacción
vertical V(-fc) ambas debidas al pivote que está sujeto al
10
carro y que permite girar a la varilla.
Fig. 2.2 Diagrama de cuerpo libre de la varilla
El ángulo que forma la varilla con la vertical se
define positivo hacia la derecha y se lo identifica con la
letra griega 4>(t)
La ubicación del centro del carro se encuentra a una
distancia x(t) del origen del sistema de referencia, que
como ya indicamos, está en el centro de la pista.
L es la distancia desde el pivote al centro gravedad
de la varilla que en nuestro caso, como se mencionó
anteriormente, está en el centro de la misma. O sea en otro
11caso si la masa dé la varilla no está distribuida
uniformemente, L no será la mitad de la longitud total,
sino que será la longitud desde el pivote al centro de
gravedad de ésta. Tomando en cuenta este detalle el modelo
matemático aquí desarrollado será de carácter general .
Aplicando las leyes de la Física Clásica para el
movimiento de los cuerpos tenemos:
- Sumatorio de fuerzas en la varilla en el eje x:
2FX - m a c (2.1)
la componente de la aceleración en el eje x (ase) se obtiene
de la -segunda derivada de la ubicación del centro de
gravedad de la varilla que está dado por la expresión 2.2
x(t) + L sin(fr(t) (2.2)
Reemplazando la expresión 2,2 en la ecuación 2.1 y
considerando las fuerzas que actúan en la varilla en el eje
x representadas en el diagrama de la figura 2.2 se obtiene:
( t) +Lsin(t> ( t) )dt2
resolviendo la segunda derivada del seno:
= d [cos(t)(t)Tdt2 dt T dt
— sin4»(t) ( )'+co8«t>(t)
12
haciendo el reemplazo correspondiente:
t) = m J + , n ¿ [cos*( t) -sin*( t) ( - - ) 21dt2 dt2 ere
realizando las operaciones indicadas obtenemos:
-ji»L8Ín»(fc) ( - ) 2 (2.3)dt2 dt2
- Sumatorio de fuerzas en la varilla en el eje y:
ZFy = m ay (2.4)
Al igual que en el caso anterior la componente de la
aceleración en el eje y (ay) se obtendrá de la segunda
derivada del espacio. La componente en el eje y de la
ubicación del centro de gravedad del péndulo se obtiene por
una relación trigonométrica:
L cos4»(t) (2.5)
Reemplazando la ecuación 2 . 5 en la ecuación 2 . 4 y
considerando las fuerzas, que actúan en el eje y en la
figura 2.2, se obtiene:
V( t) -mg=m-— (L CO3<{> ( t)dt2
resolviendo la segunda derivada del coseno :
d2cos<{> ( t) =_^ [gin<<) ( fc) cft}) ( fc) jdt2 dt dt
de la varilla sobre el pivote respecto a su centro de
gravedad está dado por el sumatorio de torques que es igual
al momento de inercia de la varilla J por la derivada de la
velocidad angular:
(2.7)
donde <*>= es la velocidad angular con que gira
la varilla.
Los torques que actúan en la varilla respecto A i=m
13
-cos4><t)
haciendo el reemplazo correspondiente:
V( t) -mg=-mLB±n$ ( t) -mLcos» ( t) ( ) 2 (2.6)dfc* cft
Por otro lado la ecuación del movimiento de rotación
de la varilla sobre el pivote respecto a su centro de
gravedad está dado por el sumatorio de torques que es igual
al momento de inercia de la varilla J por la derivada de la
velocidad angular:
(2.7)
donde 6>»- -£j—- es la velocidad angular con que giradt
la varilla.
Los torques que actúan en la varilla respecto a su
centro de gravedad son debidos a las reacciones H(t) y V(t)
y las distancias a éstas se obtienen por relaciones
trigonométricas, además consideremos el sentido positivo al
movimiento de rotación en sentido horario. Reemplazando
estos torques en la ecuación 2.7 se obtiene la ecuación 2.8
)cos<fr(t) (2,8)dt2
Reemplazando las ecuaciones 2.3 y 2.6 en la ecuación
2.8 se obtiene:
14
t) -mLcos* ( t) ( -)^] ain*( t)dt2 dt2
)*]cos»(t)dt2 dt2 dt
realizando las operaciones indicadas se obtiene:
dt2 dt2
-/nL2cos<b(t)sin<|)(t) ( - . ) 2-j7iLcosó( t)Tdt T dt2
dt2 dt
eliminando términos semejantes:
-mLdt2 dt2 dt2
sacando como factor común la segunda derivada del ángulo
dt
dividiendo para J+mL2:
t) +jnLcos<{) ( t) =0
d2»(t) , mgrlsin» ( t) + dt2
dt2
Por último, reemplazando £/=±L_5¿~_ en la ecuaciónmL
anterior :
9
dt2 I/ L7
La ecuación 2 . 9 es una de las ecuaciones que define el
movimiento del péndulo invertido. A L' se denomina la
15
"longitud efectiva del péndulo" puesto que sería igual a la
longitud de un péndulo con toda su masa concentrada en un
punto al extremo superior de la varilla.
En nuestro caso el momento de inercia J respecto al
centro de gravedad es el de una varilla delgada homogénea,
de longitud total 2L y cuyo centro de gravedad está ubicado
a la distancia L de uno de sus extremos. En tablas de
momentos de inercia hallamos que J es igual a
Ahora nos ocuparemos del movimiento del carro, éste
sólo puede moverse en movimiento rectilíneo paralelo al eje
x ya sea en sentido positivo o negativo. En la figura 2.3
se identifican las fuerzas que actúan sobre él. Para este
caso se despreciará todo tipo de rozamientos a fin de no
complicar demasiado a la ecuaciones que gobiernan el
movimiento del péndulo invertido.
oje y
N
Fig_ 2.3 Diagrama de cuerpo libre del carro
16
En el eje horizontal (eje x) actúa -una fuerza externa
que es la que va a controlar el movimiento del carro y
H(-t) que es la reacción horizontal.
En el eje vertical (eje y) actúan las siguientes
fuerzas: el peso del carro Mg, la normal N debida al
contacto del carro con la pista y la reacción vertical V(t)
que ejerce la varilla sobre el carro.
Aplicando el sumatorio de fuerzas en el carro en el
eje x de acuerdo al diagrama de su cuerpo libre dado en la
figura 2.3
2? = M ac (2.10)
La aceleración del carro es la segunda derivada del
espacio, asi tenemos:
n ( t) -H( t) (2.11)dt2
Por último , el sumatorio de fuerzas en el carro en el
eje y es igual a cero porgue no existe movimiento del carro
en este eje y sólo puede desplazarse en dirección
horizontal .
ZFy - O (2.12)
Las fuerzas que actúan en el eje y son las gue se
17
grafican en la figura 2.3, por lo tanto
N - Mg - V(t) - O (2.13)
En resiunen, el modelo matemático del péndulo
invertido, considerando que no hay rozamiento en el pivote
ni en el carro, está dado por las siguientes ecuaciones:
coa* <
M
dt2 Lf
d2x(t) = -
dt2 _Q
dt
2.2 LINEALIZACION DE LAS ECUACIONES.
Puesto que en el problema del péndulo invertido
debemos conservar la varilla en posición vertical, para la
linealización debemos suponer que el ángulo entre la
vertical y la varilla es pequeño.
La ecuación 2.9 es una ecuación diferencial no lineal
pero que puede ser linealizada utilizando la expansión en
series de Taylor del seno y del coseno:
2 1 4 1 6 1
Entonces, para pequeñas variaciones del ángulo estas
dos ecuaciones anteriores se pueden aproximar a
18
cos<f>=l
Reemplazando estas aproximaciones en la ecuación 2.9
obtenemos la ecuación 2.14 que es lineal:
=C (2.14)£' dt'
Por otro lado, si consideramos que la masa del carro M
es mucho mayor a la masa de la varilla podemos de la
ecuación 2.11 despreciar la reacción H(t).
dt
Ahora obtendremos la función de transferencia tomando
como variable de entrada la fuerza u(t ) y como variable de
salida el ángulo entre la vertical y la varilla. Apliquemos
a las ecuaciones 2.14 y 2.15 la transformada de Laplace
Ms2X(t) -ü(a) (2.16)
J * ! = 0 (2.17)
reemplazando X(s) de la ecuación 2.16 en la ecuación 2 . 17 y
despejando la relación entre ángulo y la fuerza se obtiene:
(2.18)
El diagrama de bloques correspondiente a esta función
19
de transferencia se muestra en la figura 2.4
-1
U M (s2 - J )
fig 2.4 Función de transferencia de lazo abierto entre
el ángulo y la fuerza
El lugar geométrico de las raices de esta función de
transferencia se muestra en la figura 2.5, el sistema es
inestable, pues para cualquier ganancia que se dé a la
planta se obtendrán polos de lazo cerrado en el semiplano
derecho del plano s.
*TO
fig. 2.5 Lugar geométrico de las raices del
péndulo invertido
20
La función de transferencia tomando como variable de
entrada la fuerza u(t) y como variable de salida la
ubicación del carro x(-t) la obtenemos aplicando la
transformada de Laplace a la ecuación 2.15
X(S)
M9(2.19)
El gráfico correspondiente a esta función de
transferencia se observa en la figura 2.6.
u(s) .f
1
Ms2
x(»)fcf
fig 2.6 Función de transferencia entre la posición
del carro y la fuerza
Luego, como en todo proceso en el cual se hace
cálculos por medio de un computador se necesita de valores
numéricos para obtener los resultados, en este caso se han
tomado valores para los parámetros físicos de una planta
que se pueda construir en un laboratorio. Así para las
demostraciones del programa se han tomado los siguientes
valores:
Masa del carro: M = 1
21
Masa de la varilla: m - 0.1 Kg
Longitud de la varilla: 2L = 1.26 m
Momento de inercia de la varilla con respecto
a su centro de gravedad
No obstante el programa realisado permite que estos
datos puedan ser cambiados para simular otros péndulos,
pero con las siguientes restricciones:
M >= lOm, y rozamiento despreciable
La longitud de la pista prevista para el movimiento
del carro es de 1 m.
2.3 DESCRIPCIÓN DEL SISTEMA A VARIABHES DE ESTADO.
El estado de un sistema puede describirse por medio de
un conjunto de ecuaciones diferenciales de primer orden
escritas en función de las variables de estado (xi, xa, ...
7xn). Estas ecuaciones son en general de la forma que se
describe a continuación:
XI - ai 1X1 4 a 12X2 4 ... 4 ainXn 4 bll Ul -4- . . .4 blmUm,
X2 — aaiXl 4 a22X2 4 ... 4 aSnXn 4 b21 Ul + . . .4- b
+ án2X2 + . . . 4- annXn 4- bnl Ul 4 . . .4- bramUm,
donde Xn. = cbtn/dt, y x es el vector de estados
Las variables de estado elegidas para el problema son
las siguientes:
xi(t) = x(t) = la posición del carro respecto al centro de
la pista.
xs(t) ~ 7—-= la velocidad del carro.dt
xs(t) = $ (t) ~ el ángulo entre la vertical y la varilla.
x-i(t) = —9-~—- - la velocidad angular con que gira ladt
varilla.
Con las ecuaciones linealiaadas deducidas y con los
estados elegidos obtendremos la descripción del sistema a
variables de estado.
La primera ecuación la obtenemos de la definición del
estado xa(t):
HY_ mx^(t) (2.20)
dt ^ '
La segunda ecuación la obtenemos de la ecuación 2.15:
CÍX- ( t) 1—2- =J:u(t) (2.21)
dt M
La tercera ecuación viene de la definición del estado
XA('t) que es la derivada del ángulo:
ckc, < t) t ,*±-L=x.(t) (2.22)
23
Y por último la cuarta ecuación de estado la obtenemos
reemplazando la ecuación de estado 2.21 en la ecuación 2.15
--±-u(t) (2.23)-
En base a estas cuatro ecuaciones obtendremos la
descripción a variables de estado en forma matricial.
La ecuación matricial es la siguiente:
x(t) = A x(t) 4- B -u(t)
en donde:
x(t) es el vector de estados,
x(t) es el vector de las derivadas de los estados,
A es una matriz cuadrada 4x4,
B es un vector de cuatro elementos,_ /
•u( t) es la entrada, que en este caso es la fuerza.
Ya que lo que nos interesa controlar es el ángulo
entonces la ecuación de salida es la siguiente:
y(t) - [O O 1 O] x(t)
De las ecuaciones 2.20 a la 2.23 se obtiene:
d
dt
x x ( t )
xa ( t )
X3( t )
X 4 ( t )
0 1 0 0
0 0 0 0
0 0 0 1
g0 0 Oi_j V^ V
L'
xi( t )
X 2 ( t )
X3( t )
X 4 ( t )
0
1
M
0
1
L'M
u(t)
donde:
x(t) =d
dt
Xl(t)
X3(t)
A =
O O
o o
o o
o o
L'
X(t) =
Xl(t)
X2(,t)
X4(t)
L'M
26
está dado por la función de transferencia (ecuación 2.18) y
que fue deducida de las mismas ecuaciones generales del
movimiento del péndulo invertido y su representación a
variables de estado es la siguiente:
d
dt
L'
X3(t )
X-4 ( t )
4
0
1
L'M
Para el sistema reducido , donde la señal de control es
la fuerza, la posición y la velocidad del carro son
funciones integrales de u(t). Lo que se considera aquí son
los estados del ángulo y su derivada. Por eso la ecuación
diferencial vectorial de estado es de la forma arriba
descrita.
Podemos observar que con este modelo la matriz A de la
ecuación de estado es la parte inferior de la matriz A
original que es 4 x 4. Además conserva la raíz que está en
la parte derecha del plano s, pues el polinomio
característico es :
det[Xz - = U = o
En el capítulo III se realizarán las alternativas de
control para estabilizar al péndulo invertido en base a las
ecuaciones que describen ' el movimiento del sistema, y
tomando en consideración el modelo matemático que se
desarrolló en este capítulo.
CAPITULO III
COMPENSACIONES
3.1 REALIMENTACION DE ESTADO -
El sistema de control gue se diseñará aguí para
estabilizar al sistema es tal forma gue la fuersa u(t), que
es el parámetro de control, es una función de las variables
de estado , de esta manera, la fuersa es
donde: k es el vector de realimentación, k=[kl k2 k3 k4] 3
x(t) es el vector de estados, y
u.(t;) es la fuersa externa gue se aplica al carro.
El sistema de control qxie estabilizará al sistema con
la realimentación deberá medir las variables de estado del
sistema. Asi se supone que se miden las cuatro variables de
estado y se realimentan multiplicándolas por el vector de
realimentación. Como el vector de estado x representa el
29
estado del sistema, el conocimiento de x(t) y de las
ecuaciones que describen la dinámica del sistema nos da la
información suficiente para el control y la estabilización
del mismo.
Comenzaremos primero por probar que el sistema es
controlable chequeando que el determinante de la matriz de
controlabilidad Me sea distinto de cero o sea que los
vectores columna sean linealmente independientes, para
garantizar que los resultados que se obtendrán sean
válidos .
Aun cuando la mayoría de los sistemas físicos son
controlables, los modelos matemáticos correspondientes
pueden no serlo debido a las suposiciones que se hicieron
para el desarrollo del mismo, de allí que es importante
determinar si el sistema es controlable.
El concepto de controlabilidad permite conocer si
existe una entrada u(t) físicamente factible que permita
llevar el vector de estados de un punto x(0) del espacio de
estados a otro punto x(l) arbitrario en un intervalo de
tiempo finito.
Para nuestro sistema de cuatro variables de estado, se
define la matriz de controlabilidad como:
Me - C B ! AB !
30
Realizando las operaciones indicadas de las matrices
obtenemos la matriz de coñtrolatailidad Me:
Me =M
L'M
M
L'M
g
Una vez realisados los cálculos correspondientes al
determinante de esta matriz encontramos que éste es
distinto de cero y es el siguiente:
det (Me)L4
por lo tanto el sistema es controlable.
El diagrama de bloques correspondiente a la
implementación de la realimentación de estado es el <3_"ue se
presenta en la figura 3.1.
31
r=0
i
fig. 3,1 diagrama de bloques para la realimentación de
estado
De este diagrama de bloques obtendremos las ecuaciones
para realizar la realimentación de estado:
La ecuación de estado del sistema es:
x(t) = A x(t) + B u(t)
La ley de control aplicada para realimentar los estados es
de la siguiente forma
u(t) - - k x(t)
reemplazando la fuerza u(t) en la ecuación de estados
x(t) - A x(t) -4- B [-k x(t)]
x(t) - [A - B k] x(t) (3.1)
32
La matriz de lazo cerrado [ A - B k ] es de la siguiente
forma:
[A - B k ] =
kl
M
k2
M
k3 k4
M
kl
ITM
k2
L'M
gM+k3
L'M
k4
L'M
Para resolver la ecuación de estado de lazo cerrado
dada por la ecuación 3.1 utilizaremos el método de la
transformada de Laplace, asi tenemos:
sX(s) - x(0) = [A - B k] X(s)
donde X(s) es la transformada de Laplace de x(t)
por lo tanto,
[s I - A + B k] X(s) = x(0)
Premultiplicando ambos miembros de esta última ecuación por
[s I — A + B kD"1 se obtiene
X(s) = [s I - A + B k]-i x(0) (3.2)
La ecuación 3,2 es la solución general de la ecuación
de estado en el dominio de Laplace. La transformada inversa
de Laplace de X(s) nos da la solución ü.(t). Y Para
33
encontrar la transformada inversa de Laplace de una matriz
se debe encontrar las transformadas de Laplace dé cada uno
de siis elementos.
Seguidamente realizaremos las operaciones indicadas:
[s I - A + B k] =
kl
M
- 1
sM+k2
M
k3
M
O
k4
M
kl
L'M
k2
L'M
gM+k3 sL'M-k4
L'M
A esta matris debemos invertirla y multiplicarla por
el vector de condiciones iniciales con lo cual obtenemos el
vector de estados en el dominio de Laplace. Estas
operaciones se indican en la siguiente ecuación matricial:
X(s) =det
donde :
all a!2 a!3 a!4
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44
xl(0)
x2(0)
x3(0)
x4(0)_
L'M 'M
34
y es igual al polinomio característico de la matris
C A - B k J '
además :
a =11 Af L'M L> L'M I/A
L/Af
a21~ *
• M Lf
Jc4 Jc3
*32
Af
L'íí
'42 « r/Af r/Mju rí Jj n
L'M L'M
35
.=
L1M
a,á = s3 + s2— -f-s— i44 M M
Realizando las operaciones indicadas de la matriz de
.laso cerrado por el vector de condiciones iniciales
obtenemos cada estado en el dominio de Laplace, los cuales
resultan ser los siguientes:
2L1 L(M
L'M
+x (o)3+g[xl(0)4
Af
L-'Af
3L'M L'M
Para el análisis de la estabilidad utilizaremos el
método de Routh-Hurwitz considerando la .ecuación
36
característica del sistema, que en términos de la variable
de Laplace se describe como:
q( s) — s4 + aas3 + ass2 4- ais 4- ao — O
Para ver si el sistema es estable o no, se debe
averiguar si alguna de las raices de q(s) está en la parte
derecha del plano &, lo que nos conducirá a decir que el
sistema es inestable. Factorizando q(s) tenemos:
(s-pl)(s-p2)(s-p3Ks-p4) = O
Donde pl, p2, p3 y p4 son los polos deseados de laso
cerrado o sea las raices de la ecuación característica,
también llamados autovalores o valores propios de la matriz
de lazo cerrado [A - B ]£ 3 - Multiplicando los factores
encontramos que
q(s) = s - (pl + p2 +p3 +p4)s3
+ (plp2 + P2p3 + plpS + ... )s2
- (plp2p3 + plp2p4 4- ... )s
+ Plp2p3p4 = O
Analizando esta ecuación observamos que todos los
coeficientes del polinomio deben tener el mismo signo si
todas las raíces están en la parte izquierda del plano s.
Por otro lado, para un sistema estable, todos los
coeficientes deben ser distintos de cero - Estos requisitos
37
son necesarios pero no suficientes.
En nuestro caso el polinomio característico siempre
tendrá coeficientes positivos , y además el sistema siempre
será estable puesto que ubicaremos directamente las raíces
de la ecuación característica garantizando que estén a la
izquierda del plano s. Las raíces de la ecuación
característica o polos de lazo cerrado deben ser cuatro , y
si son complejos deberán ser conjugados. La ecuación
característica de la matriz [ A - E £ ] resulta
( s-pl) (s-p2) (s-p3) (s~p4) — s4 + aas3 4- aas2 + aiB + ao
L1M LrM
Luego encontraremos el vector de "realimentación k
despejando de la ecuación 3 . 3 kl , k2 , k3 y k4 .
L'Ma,~
LMa,
V 'a
donde as, aa, ai y ao están en función de los polos de lazo
cerrado deseados.
38
De esta manera una ves obtenidos los elementos del
vector de realimentación k reemplazamos en cada uno de los
estados en el dominio de Laplace para posteriormente
obtener la transformada inversa de Laplace y encontrar cada
estado en el tiempo.
La respuesta en el tiempo de cada estado dependerá de
los polos de laso cerrado que se seleccionen. Kn
realimentación de estado, todos los estados tienen la
siguiente forma en el dominio de Laplace:
3s4 + a3 s3 + a2 a2 + a± s + a0(3-4)
Aplicaremos la transformada inversa de Laplace a la
ecuación 3.4 para hallar cada uno de los estados en el
tiempo, para esto la dividiremos en fracciones parciales y
según sean los polos reales, o complejos conjugados, o
repetidos, o combinados, se pueden obtener nueve casos
diferentes de expansión en fracciones parciales que se
describirán a continuación.
a) Todos los polos reales y distintos.
En este caso siempre se puede expandir Xn.(s) en la
suma de fracciones parciales simples, como sigue:
39
DXn(3) = -^_+_*-+_L_8-pI 3-p2 3-p3
donde A, B, C y D son constantes.
Para hallar la respuesta en el tiempo se obtiene la
transformada inversa de Laplace de donde resulta:
H * '
b) Dos polos reales repetidos y dos polos reales distintos.
, D8-pl (s-pl)2 3~p2 S~p3
xn( t) = (A+Bt] e£>iC+Cel32C+Dep3C
c) Tres polos reales repetidos y un polo diferente.
•" + ° o. C 2 ! + D3-pl ( £
xn(t)~(A+Bt+Ct2)eplt+DeI}2t
d) Todos los polos reales repetidos.
A B C 2 I D 3 I
xn(t) = (A+Bt+Ct2+Dt3)
40 •
e) Cuatro polos reales repetidos de dos en dos,
B , C , D-t-
(s-pl)2 3-p2 (S-P2)-2
f) Polos complejos conjugados distintos.
X.ÍS)--
C(s-a2)
.. .+ceff?t
g) Un polo complejo conjugado de multiplicidad 2.
x
C(g-o) +
9-a)2 + p3]2 [ ( s -a ) 2 +P 2 ] 2
41
t) .
. . . - -2 p
t) -(3 tcos(|3 1)]
-h) un polo complejo conjugado y dos reales distintos
X - A
xn(t) =Aepa+Be^+Ceatcos(p t) +£>e°csin(p t)
i) Un polo complejo conjugado y un polo real de
multiplicidad 2.
x- (s-pl)2
t) +l?eotain(p t)
Con esto hemos analizado todas las posibilidades de
los polos que puedan existir para la realimentación de
estado .
Al fijar los polos de lazo cerrado en el semiplano
izquierdo del plano s estamos garantizando la estabilidad
del sistema, sin embargo si los polos de lazo cerrado hacen
muy lento al sistema, éste necesitará un mayor espacio para
42
equilibrar al péndulo, lo cual no resulta práctico puesto
que existen limitaciones de la pista.
3.2 COMPENSACIÓN LINEAL.
En base al sistema de referencia definido en el
capitulo II, si ponemos una condición inicial: que la
varilla forme un ángulo positivo respecto a la vertical y
el carro esté en reposo, entonces para controlar la
posición vertical del péndulo se deberá aplicar una fuerza
positiva en dirección del eje x.
Asi, el tipo de control que se aplicará aquí debe ser
tal que al existir un error en el ángulo actúe una fuerza,
entonces, si el ángulo o su derivada crecen entonces la
fuerza también debe crecer. Este tipo de control es el
proporcional derivativo. Para la implementación, se supone
que se miden el ángulo y su derivada continuamente y se
realimentan cada uno con ganancia diferente. La acción
derivativa hará una corrección proporcional a la derivada
del error respecto al tiempo. El control derivativo
responde a la rapidez del cambio del error 7 por eso puede
hacer una corrección significativa antes de que el error
crezca demasiado.
En el control del tipo proporcional derivativo se mide
el error de la variable controlada que es el ángulo, y se
43
obtiene su derivada. Luego se multiplica por las ganancias
proporcional y derivativa respectivamente para generar la
señal del control que comandará la planta. Tal como se
muestra en el gráfico:
r = 0 -^ error
6^» KpfHKd B) t PLANTA
fig_ 3,2 Control proporcional derivativo
La fuerza que se deberá aplicar al carro para
controlar la posición vertical del péndulo es de la
siguiente forma:
) ] (3.5)
la ecuación diferencial linealisada de la planta es:
(3.6)
Reemplazando la ecuación 3 . 5 en la ecuación 3,6 se obtiene :
fc)dC
t) =_ t)at
(3_7)
Para representar esta realimentación en diagrama de
44
bloques aplicaremos la transformada de Laplace a. las
ecuaciones 3.5 y 3.6 obteniendo lo siguiente:
U(s) =Kp[i + Kd s] *(e)
*(s) _ 1
I
En base a esto el diagrama de bloques para este tipo
de realimentación es el siguiente:
<J>r(s)=0
fig. 3.3 diagrama de bloques del control proporcional
derivativo aplicado
Dividiendo la ecuación 3.7 para L'M y aplicando la
transformada de Laplace:
L*(s)-c
despejando el ángulo:
(3.8)
45
donde:
4>(0) es la condición inicial del ángulo.
—5J—L es la condición inicial de la derivada del ángulode
Arreglando la ecuación 3.8 para obtener la
transformada inversa de Laplace de una expresión conocida
.+—*L
reemplazando a, t>, y las condiciones iniciales:
46 .
obteniendo la transformada de Laplace inversa:
4»<t)—<fr(o)
donde
La ecuación del espacio encontraremos integrando dos
veces la aceleración, la cual sale de la fuerza de la
ecuación 3.5 dividiendo para la masa M del carro. La
integral del ángulo se halla por recurrencia de la ecuación
3.7 de donde resulta:
donde:
at
47
Para el análisis cíe estabilidad partiremos de la
ecuación 3.8; en primer lugar tanto el valor de a como el
de b deben ser positivos de manera que no existan raices
con parte real positiva. Para las especificaciones de
respuesta transitoria nos interesa conocer el tiempo de
establecimiento y el máximo sobre impulso .
Usando el criterio del 2 %, el tiempo de establecimiento es
el siguiente:
El máximo sobreimpulso porcentual está dado por:
ATp - 100 e-K/Ví1?)*
Lo que requerimos para una respuesta transitoria
aceptable del sistema de segundo orden es una relación de
amortiguamiento -entre 0.4 y 0.8 del tal manera que sistema
no tenga sobreimpulso excesivo ni tampoco que sea muy
lento. Como el valor de la relación de amortiguamiento se
determina por el requerimiento de máximo sobreimpulso
deseado , entonces el tiempo de establecimiento es
determinado principalmente por la frecuencia natural no
amortiguada y para obtener una respuesta rápida, la
frecuencia natural no amortiguada debe ser grande.
48
3.3 CONTROL DE TIEMPO MÍNIMO.
La teoría de control óptimo utiliza la minimisación de
un índice de funcionamiento como criterio de calidad de un
sistema} en este caso el del tiempo. El tipo de control que
emplearemos aquí será de tiempo mínimo u óptimo.
Nuestro objetivo es transferir al péndulo desde un
ángulo inicial pequeño hasta que el ángulo sea cero en el
mínimo tiempo con restricciones físicas de la fuerza
aplicada.
Para este tipo de control utilizaremos la ecuación de
transferencia del péndulo invertido dado por la ecuación
2.18 para poder realisar el análisis con el plano de fase.
El análisis del plano de fase, es adecuado para
encontrar la curva de conmutación en la cual se cambiará de
signo a la señal de control que en nuestro caso es la
fuerza.
El sistema de segundo orden obtenido de la ecuación
2.18 está representado por la siguiente ecuación
diferencial ordinaria.
fc)-. 0.9)dt2 L2M L*M
49
Para conseguir el control de tiempo mínimo en un
sistema físico que tiene potencia limitada, se debe
utilizar adecuadamente en cualquier momento toda la
potencia disponible. A esta hipótesis se denomina el
principio "taang bang" y es válido para plantas que tienen
la forma:
"11 + . . . + a^y + any = bu
donde el valor de u(t) está limitado, o
-uo <= u(t) <= uo (ref. [10])
En nuestro sistema aplicaremos la máxima fuerza
disponible que es un dato conocido, ésta debe ser constante
y puede cambiar de signo.
Resolveremos la ecuación 3.9, para una entrada de
fuez za constante u(t) - F de tal manera que la ecuación 3.9
queda de la siguiente forma:
LfM
de donde obtenemos los siguientes resultados:
(3.10)
dt L*\2M
50
"T/V * c 1T.I y fy , A. (3.11)
donde:
A9
Para el diagrama de fase grafio aremos la derivada del
ángulo en función del ángulo utilizando el tiempo como
parámetro, a esta curva se denomina trayectoria.
Encontraremos una expresión algebraica que relacione
la velocidad angular en función del ángulo, comenzaremos
sumando las ecuaciones del ángulo y su derivada para luego
despejar el tiempo y reemplazarlo en la ecuación de la
derivada:
ecuación 3.10 4- ecuación 3.11:
dt
despejando
51
reemplazando t en la ecuación 3.8 se obtiene la ecuación
que relaciona el ángulo con su derivada:
-=0 (ec 3.12)
Dependiendo de las condiciones iniciales del ángulo,
su derivada, y si la fuerza es positiva (+F) o negativa
(-F), se forman dos familias de curvas diferentes como se
muestra en las figuras 3.4 y 3.5
fig. 3-4 Trayectorias para u(t) = -hF
52
fig, 3.5 Trayectorias para u(t) = —F
La curva de conmutación, donde debe cambiar de signo
la fuerza, está formada por dos de estas trayectorias que
pasan por el origen, para u(t) - +F corresponde la
trayectoria AO y para u(t) - -F corresponde la trayectoria
BO.
De acuerdo 'a las condiciones iniciales del ángulo y su
derivada se deberá aplicar una fuerza positiva o negativa
hasta que se interseque a la curva de conmutación y luego
cambiar de signo a la fuerza para alcanzar el origen.
Así, para dos condiciones iniciales de ángulo y su
derivada se traza las trayectorias óptimas que sigue el
sistema en la figura 3.6.
53
u=+F
fig. 3.6 Gráfico de plano de fase que muestra
trayectorias de tiempo óptimo
De las figuras 3.4 y 3,5 deduciremos las regiones en
donde la fuerza debe ser positiva o negativa.
Primeramente definamos los tiempos:
t es el tiempo que se está analizando.
to es el tiempo inicial donde se dan los estados
iniciales de ángulo y su derivada,
ti es el tiempo donde los estados iniciales de ángulo
y su derivada coinciden con algún punto de la curva
de conmutación.
t* es el tiempo en el cual el ángulo y su derivada
llegan al origen del plano de fase.
Para u(t) - -t-F y para t (= Cto, t*], los estados
iniciales del ángulo y de su derivada deben estar en algún
punto de la trayectoria AO de la figura 3.4,
54
Para u(t) - -F. y para t e [t0, t*], los estados
iniciales del ángulo y de su derivada deben estar en algún
punto de la trayectoria BO de la figura 3.5.
Si u(t) = +F para t e [to, ti] y u(t) = -F-para t e
[ti, t*] y debido a que en el control óptimo la fuerza es
igual a -F para t e [to, t*), al tiempo ti el ángulo y su
derivada deben estar en algún punto de la trayectoria BO.
Esto puede verse en la figura 3.6.
Con referencia a la figura 3.4 podemos afirmar que
sólo las curvas que están a la derecha y arriba de la curva
AO interceptarán a la curva BO. Además sólo las
trayectorias que se inician sobre BO con u(t) = +F
interceptarán a la curva BO. Por lo tanto concluimos que
para estados iniciales del ángulo y su derivada que estén
sobre, tanto de AO como de BO, el control óptimo será
u(t) = +F hasta llegar a un punto de la curva BO, y luego
conmuta a u(t) = -F, hasta llegar al origen.
Si u(t) - -F para t e [t0, ti] y u(t) = +F para t e
[ti, t*], entonces al tiempo ti el ángulo y su derivada
deben estar en algún punto de la curva AO. De una manera
similar al caso anterior nos lleva a concluir que para
estados iniciales que estén debajo de AO y BO, el control
óptimo será u(t) = -F hasta que los estados alcancen algún
punto de la curva AO y luego conmuta a u(t) = -f-F hasta
llegar al origen.
55
Una ves que el sistema ha alcanzado el origen, se
puede mantener en esa posición aplicando una fuerza de
control u(t) - O para t > t*, Asimismo en las dos
compensaciones anteriores la fuerza se hace cero al final.
Los estados que nos interesan para este tipo de
control son el ángulo y su derivada definidos como el
vector x.
x(t)
X3(t)
X4(t)
xs(t) = ángulo
X4(t) = derivadadel ángulo
La ley de control óptimo a cualquier tiempo t e's una
función de las variables de estado (ángulo y su derivada).
Para expresar la ley de control óptimo en una forma
conveniente, definiremos- a la función de conmutación
s(x(t))5 que se obtiene de la ecuación 3.12, como:
Nótese que
s(x(t)) > O implica que x.(t) está sobre la curva de
conmutación A-O-B
56
< O implica que x.(t) está bajo la curva de
conmutac ion A-O-B
s(x.(t)) = O implica que x(t) está justamente en la curva
de conmutación A-O-B
Entonces, en términos de la función de conmutación la
ley de control óptimo es:
u(t) =
F, para x.(t) tal que s(x.(t)) > O
F, para x(t) tal que s(x_(t)) < O
F, para x_(t) tal que s(s(t)) = O y x
F, para x.(t) tal que
03 para x(t) = Q.
(x(t)) = O y
> O
< O
El diagrama de bloques para la implementación de esta
ley de control óptimo se observa en la figura 3.3, Consiste
en un módulo generador de la función de conmutación s(x(t))
en base a las variables de estado, y un relé ideal para
poder cumplir con la ley de control.
El relé ideal reacciona a una entrada de la siguiente
forma:
salida ~+ F si entrada > O
- F si entrada > O
57
relé Ideal PLANTA
*<0.
generadorde fundón
fig. 3.7 Diagrama de bloques para el control de
•tiempo mínimo.
3.4 INFLUENCIA DEL MODELO UTILIZADO EN LA FORMA DE LA
COMPENSACIÓN.
Comenzando con el caso de la realimentación de estado
se realimentan cuatro variables de estado obteniendo la
información suficiente para equilibrar al sistema, el punto
de equilibrio se consigue cuando todas las variables de
estado alcanzan el valor de cero.
En el control proporcional derivativo y en el control
óptimo se realimentan sólo dos estados como son el ángulo y
su derivada. Al utilizar el modelo matemático del péndulo
58
invertido sin considerar el rozamiento y al integrar dos
veces aceleración a partir de la ecuación de la fuerza para
obtener el espacio aparece un término que crece con el
tiempo. Idealmente el carro puede quedar con una velocidad
constante con lo que no actúan fuerzas que puedan mover a
la varilla.
Pero en la práctica esto no sucederá, puesto que el
punto de equilibrio del péndulo es inestable debido a que
el punto de suspensión (pivote) está por debajo del centro
de gravedad de la varilla, entonces apenas se separa de esa
posición, ésta tenderá a caer.
El término del espacio que crece en el tiempo se lo
puede eliminar con una adecuada condición inicial de la
velocidad.
En el programa realisado sólo se considera la
simulación hasta que se alcanza el punto de equilibrio,
porque luego no es posible predecir para qué lado caerá el
péndulo.
CAPITULO IV
DESARROLLO DEL PROGRAMA
4.1 SIMULACIÓN DINÁMICA,
Aprovechando las ventajas que ofrece el programa en el
entorno gráfico Windows, desde del menú principal se elige
correr animación para realizar la simulación dinámica del
péndulo invertido,
Al inicio del programa se hace una prueba para conocer
qué tan rápido es el computador que se está utilizando,
para según eso poner un adecuado retardo en la animación,
ya que si no se hiciera esto, en computadores más veloces
la animación sería más rápida que en otros menos veloces,
esta diferencia de velocidad podría ser bastante
significativa de acuerdo al computador en el que se corra
el programa si es que no se.toma en cuenta la velocidad del
computador. Para esto se toma un tiempo pequeño en el que
se incrementa una variable, entonces como el tiempo es el
mismo para cada computador, el que incremente más a la
60
variable será más rápido que el que la incremente en menor
grado. Posteriormente el valor almacenado en la variable
servirá para hacer un lazo iterativo de retardo.
Antes de correr la animación, debemos escoger desde el
menú "realisar cálculos", para almacenar los cuatro estados
del sistema (posición y velocidad del carro, ángulo y su
derivada) en arreglos diferentes además de almacenar la
fuerza en otro arreglo, de éstos cinco arreglos nos
interesan dos para la animación: la posición del carro y el
ángulo que forma el péndulo con la vertical. Luego con
estos valores se gráfica en la ventana principal del
programa las diferentes posiciones del carro y la varilla
para conseguir la animación del péndulo.
La simulación dinámica se realiza mediante la función
Animación que primeramente dibuja la pista y luego se
realiza un lazo iterativo para ubicar en la ventana
principal del programa las posiciones la varilla,
calculadas en base al ángulo, y las posiciones del carro
todas escaladas de acuerdo al tamaño de la ventana del
programa. En • cada iteración se chequea si carro ha
sobrepasado el espacio disponible para el movimiento del
carro, si no lo ha hecho entonces se continúa con otra
iteración, pero si el carro ha sobrepasado el limite
izquierdo o el derecho de la pista se simulará el choque
del carro con el limite de la pista sobrepasado y se sale
del laso iterativo finalizándose la simulación dinámica. Si
61
no existe el sobrepasamiento de los límites de la pista
entonces se podrá ver que el sistema se estabiliza y se
termina la simulación.
La animación se divide en dos partes: la animación del
carro y la animación de la varilla. Cada una se hace por
dos métodos diferentes que se explicarán a continuación:
La animación del péndulo (varilla) se hace copiando en
la pantalla la posición de la varilla luego se dibuja la
misma posición de la varilla con el color de fondo de la
ventana de tal manera que se borra esta posición y por
último se copia la nueva posición de la varilla en la
pantalla. Esto se repite varias veces hasta terminar la
simulación dinámica.
La animación del carro se hace con otra técnica de
animación: en una memoria intermedia llamada página oculta
se copia la nueva posición del carro, para luego copiar
esta página en la ventana del programa, con esto se
consigue evitar el efecto de parpadeo que se produce al
realizar la animación por el método anterior y que es poco
perceptible en la varilla por ser más rápida la
graficación.
Además esta técnica de copiar el carro en esta memoria
intermedia ofrece una mejor visualización de la animación
debido a que la página oculta no se observa en ningún
62
momento, y en ésta se realiza el borrado del gráfico
anterior y graficación de la nueva posición del carro. Pero
luego de tener el nuevo gráfico en esta página se la copia
en su totalidad a la ventana del programa de tal manera que
se superpone completamente al gráfico anterior de la
ventana del programa. Asi, no se borrarán en ningún momento
los puntos del carro que coinciden con la posición
anterior, sino solamente aquellos gue no coinciden con la
nueva posición.
Se llama página oculta a un segmento de memoria donde
se almacena un rectángulo donde se graficará el carro y
cuyos lados son la longitud de la pista y la altura del
carro.
La razón porque no se hace la animación por un sólo
método es que se ocuparla mucha memoria en el caso de
hacerlo por el método de la página oculta la cual debería
ser de mayor tamaño, en cambio al hacer todo por el método
del copiado y borrado se producirá un efecto de parpadeo.
Así la combinación de estos dos métodos producen una
animación satisfactoria.
4.2 COMPENSACIONES,
Desde el menú principal del programa de la opción
Ingreso de datos podemos elegir el tipo de compensación
63
requerido.
Los tres tipos de control implementados, están
realisados en base a la parte teórica desarrollada en el
capitulo anterior. Se hacen cálculos para cada una de las
compensaciones en base a las ecuaciones obtenidas.
Para la realimentación de estado se deben ingresar los
polos de lazo cerrado deseados y las condiciones iniciales
del sistema. Al realizar los cálculos, previamente se
verifica el tipo de polos ingresados, ya sean éstos polos
múltiples, polos complejos conjugados, polos distintos,
etc. para posteriormente realizar el cálculo del vector de
realimentación, dividir en fracciones parciales, y obtener
la respuesta en el tiempo de los cuatro estados y la
fuersa. Para la simulación dinámica y para los gráficos de
cada estado y la fuerza se deben almacenar los estados en
cinco arreglos diferentes, tomados cada intervalo de
maestreo adecuado.
Para el control proporcional derivativo se deben
ingresar las condiciones iniciales, además los valores de
la frecuencia natural no amortiguada y el coeficiente de
amortiguamiento deseados, en base a éstos se calcula la
ganancia proporcional y derivativa del controlador, el
tiempo de establecimiento, etc. Luego se obtiene la
respuesta en el tiempo y se almacena los resultados en
varios arreglos.
64
En el control de tiempo mínimo se debe ingresar la
fuerza máxima que se aplicará al carro. Esta será constante
y sólo podrá cambiar de signo o hacerse cero. El signo de
la fuerza ingresada no tiene importancia ya que de acuerdo
a los estados del ángulo y su derivada el programa elige
que la fuerza sea positiva o negativa. Primeramente se
chequea que la fuerza sea suficiente para que pueda
equilibrar al péndulo, en caso contrario no se podrán
realizar los cálculos. Una vez que se ha verificado que la
fuerza es suficiente para controlar el péndulo, se calcula
la curva de conmutación y se selecciona el signo de la
fuerza de acuerdo a donde estén ubicadas las condiciones
iniciales en el plano de fase. Posteriormente se calcula el
ángulo y su derivada de las ecuaciones del movimiento hasta
que alcancen la curva de conmutación entonces se cambia el
signo de la fuersa y se resuelven las ecuaciones de
movimiento con esas nuevas condiciones iniciales y con la
nueva fuersa. Y por último se verifica si ha llegado al
origen del plano de fase y se terminan los cálculos.
4.3 DIAGRAMAS DE FLOJO.
A continuación realizaremos los diagramas de flujo de
algunas de las funciones principales donde se debe realizar
bifurcaciones y tomar decisiones de acuerdo a algún
parámetro.
65
Primero, en lo que se refiere a la realimentación de
estado, para saber qué tipo de cálculos se debe realisar de
acuerdo a los polos ingresados, implementamos la función
RealimEstado, que inicia tomando el caso de polos reales,
luego complejos conjugados más reales y por último sólo los
polos complejos, y según el tipo de polos se llamará a la
función respectiva que tratará en forma distinta cada caso.
El diagrama de flujo correspondiente a esta función se
encuentra en la figura 4,1 donde se puede observar que se
hace un chequeo de qué tipos de polos se ingresan, las
abreviaturas utilizadas significan:
PRI polos reales iguales.
PKD polos reales diferentes.
En los rectángulos de la figura 4.1 se encuentra la
función correspondiente que se ejecutará de acuerdo a los
polos de laso cerrado que se ingresaron, luego de lo cual
se termina la función.
En realidad el algoritmo para realisar esta función es
mucho más complejo, puesto que además los datos que se
enviarán a cada función deben ordenarse previamente ya que
los polos ingresados se pueden ingresar en cualquier orden
mediante el cuadro de diálogo previsto.
66
Inicio j
^ todos los \ ™polos reales?^--'
iodos los^-v^ SIpolos distirrtos
NO
DosPRIyOosPRI
CuatroPRDtícr
c fin
DosPRDyDosPRI
UnPRDyTresPRI
Cuatro PRIgual
= 7
^ 2 poloscomplejos C
NO
DosPCCDIstlnt
DosPCCIcgualea
fig. 4.1 Diagrama de flujo para seleccionar giie cálculos
se realizarán en realimentación de estado
67
En segundo lugar, respecto a la simulación dinámica la
función se inicia dibujando la pista para luego hacer un
laso iterativo donde borra el gráfico anterior y se dibuja
en actual., de acuerdo al ángulo y al espacio almacenados en
arreglos, con las técnicas de animación descritas
anteriormente. Luego se produce un retardo que es un lazo
FOR cuya máxima iteración depende de la velocidad del
computador que se utilice. Además se chequea si el espacio
recorrido por el carro ha sobrepasado uno de los extremos
de la pista para luego simular el choque, posteriormente se
sale del lazo iterativo y se termina la función de
animación. En caso de no haber sobrepasado los limites del
movimiento del carro continuará la simulación hasta que se
termine el laso iterativo. El diagrama de flujo
correspondiente se muestra en la figura 4.2.
En tercer lugar, para el control de tiempo mínimo se
debe hacer la ' selección de la fuerza sea positiva o
negativa dependiendo de la región del plano de fase donde
se encuentren los estados del ángulo y velocidad angular.
Luego se chequea si se ha llegado a algún punto de la curva
de conmutación y se cambia la dirección de la fuerza, tal
como se indicó en la sección de Compensaciones.
En la figura 4.3 se muestra el diagrama de fluj o
correspondiente.
68
Inicio ")
Dibujar la
Pista
ir
1=1,1 max
borrar gráficoanterior y ponerel gráfico actual
retardo
simular choquecan el lado izq.I = Imax
fin
simular choquecon el lado der.I = Imax
fig. 4.2 Diagrama de flujo para la simulación dinámica
69
la fuerzaes suficiente para
el control7
calcular Sngulo, velo-cidad angular, espacioy velocidad
alcanzócurva de
conmutación?.
cambiar de signo lafuerza, y tomar comocondiciones inicialcalos valores actualesde ángulo y su deriv.
, IMax
calcular ángulo, velo-cidad angular, espacioy velocidad
es ceroel ángulo y su
derivada?
fig. 4.3 Diagrama de flujo para el control de tiempo mínimo
70
4.4 FUNCIONES UTILIZADAS.
Ahora explicaremos otras funciones utilizadas en el
programa y que todavía no se han mencionado.
- Al iniciarse el programa se ejecutan varias funciones,
una de ellas es la función WMSize que además 'se ejecuta
cada vez que se redimensiona la ventana del programa. En
esta función se consiguen las dimensiones de la ventana,
para en base a éstas escalar gráficos y mapas de bits de
manera que el programa funcione normalmente con cualquier
tamaño de la ventana. Además se hace un chequeo si ya se
han creado las celdas para la animación (mapa de bits del
carro y página oculta), si la respuesta es afirmativa se
deben destruir el mapa de bits y la página oculta
existentes, y construirlos de nuevo escalados
proporcionalmente a las nuevas dimensiones de la pantalla
mediante la función ConstrCeldas; si la respuesta es
negativa entonces no se debe destruir.nada, sino que el
mapa de bits y la página oculta se construirán por primera
vez. Siempre es necesario destruir el mapa de bits y la
página oculta utilizados para la animación cuando se
redimensiona la pantalla porque en caso contrario se
tendrán problemas de memoria y el programa puede
"colgarse".
- La función ConstrCeldas crea el mapa de bits que
representa al carro y la página oculta, para la animación
71
de acuerdo a las dimensiones de la ventana del programa.
Pero no las utiliza, sino que es "una función que sólo
prepara el mapa de bits y la página oculta. Primero crea la
página oculta y luego crea el mapa de bits donde se dibuja
el carro con un rectángulo y dos circuios.
- La función* CtíDatosPendulo consigue los datos del
péndulo gue se ingresan desde el cuadro de diálogo
correspondiente y los copia en una cadena de caracteres
añadiendo las unidades de masa, longitud, momento de
inercia y gravedad, para luego mostrar en otro cuadro de
diálogo los valores ingresados y que son aceptados por el
programa, estos valores son almacenados en constantes
globales para su posterior utilización.
- Se pueden utilizar datos preestablecidos en el
programa mediante la selección del menú de Por defecto, que
pondrá en cada estructura de datos y en cada variable los
valores referenciales que se han puesto en el programa,
esto se hace mediante la función CMdatosDefecto, al
ejecutarse ésta primero se pregunta al usuario si quiere
colocar los datos por defecto de tal manera que se puede
confirmar o cancelar esta opción.
- Cualquier gráfico o texto que se encuentre el la
ventana principal del programa se puede imprimir, gracias a
la función CMimprimirPant, que inicializa una estructura
PR1NTDLG3 para luego mostrar el cuadro del diálogo para
72
seleccionar las preferencias cíe la impresión, Al aceptar la
opción de impresión se crea un mapa de bits compatible con
la ventana donde se la copia, para luego copiar el mapa de
bits a la impresora. Las dimensiones de la impresión
dependen de las dimensiones de la ventana.
- También se puede copiar cualquier gráfico o texto al
portapapeles de Windows mediante la selección de Copiar del
menú. La función que realiza éste trabajo es
CMcopyClipboard. Primero se crea un mapa de bits compatible
con la ventana principal donde se la copia. Luego se borra
el contenido del portapapeles, para posteriormente copiar
el mapa del bits en éste.
Las funciones CMdatosRealEst, CMdatosPropDer,
CMdatosTiemMin y CMdatosCondlni consiguen los datos
ingresados de los cuadros de diálogo correspondientes y los
copian en una cadena de caractere-s agregando las unidades
de .cada parámetro para luego mostrarlos en otro cuadro de
diálogo con los valores que aceptó el programa. Además
consiguen poner los datos en variables globales que se
utilizarán posteriormente en la ejecución del programa.
- La función CalculosMenu selecciona qué cálculos hacer,
ya sean éstos de realimentación de estado, control
proporcional derivativo o control de tiempo mínimo, de
acuerdo al último tipo de control que se ingresó.
73
La función ClearMenu. simplemente pesetea todas las
banderas de gráficos que se utilizan en el programa y
limpia la pantalla con las instrucciones InvalidateWindow y
Update Window.
- Las funciones que llaman a otras funciones que
realizan gráficos son: GrafEspMemí, GrafVelMenu,
GrafAngMenu., GrafVanMemí, GrafTodoMenu, GrafDvAMemí y
GrafFueMemi. Para hacerlo, primero resetean todas las
banderas de gráficos activos del programa y setean la
bandera del gráfico que se seleccionó del menú principal,
luego llaman a la función para limpiar la pantalla y esto
ocasiona el mensaje WM_PAINT que llama a la función Paint
donde de acuerdo a la bandera gráfica activa llamará a la
función de gráfico correspondiente que puede ser cualquiera
de las siguientes: GrafEspacio, GrafVelocidad, GrafÁngulo,
GrafV angular, GrafAngvsDang y GraficaFuerza. Estas
funciones grafican el espacio, la velocidad, el ángulo, la
derivada del ángulo versus el tiempo, la derivada del
ángulo versus el ángulo y la fuerza versus el tiempo
respectivamente, para lo cual escalan adecuadamente el
gráfico dependiendo del máximo valor de la curva y del
tamaño de la ventana principal.
- La función GrafTodMenu ejecuta un cuadro de diálogo
donde se pueden escoger varios gráficos que se pueden
presentar al mismo tiempo, el cuadro de diálogo setea y
resetea las banderas gráficas de acuerdo a lo que el
74
usuario escoge. y posteriormente llama a la función Paint
para que realice los gráficos correspondientes.
La función Paint se ejecuta cada vez que ocurre un
mensage WM_PAINT y -que puede ser debido a causas como al
cerrarse una ventana de otra aplicación activa que estaba
tapando el programa o al cerrarse un cuadro de diálogo o al
redimensionar una ventana. Aprovechamos esta función para
llamar desde aquí a todas las funciones de gráficos y
presentación de resultados para que se ejecuten cuando
éstas estén activas y de esta manera se redibujen. Porque
de lo contrario por ejemplo al realizar un gráfico en el
programa y luego abrimos otra aplicación tapando la ventana
de nuestro programa, al volver al mismo el gráfico se habrá
borrado.
- Desde el menú se accede directamente a programas de
Windows tales como el reloj, la calculadora y el
administrador de archivos, que pueden ser útiles en algún
momento, mediante las funciones CMReloj, CMCalculadora,
CMArchivos respectivamente las cuales llaman a la función
WinExec que ejecuta el programa correspondiente.
- Existen también funciones para realisar cálculos de
realimentación de estado para cada caso de polos que se
ingresen que calculan el vector de realimentación, realizan
la expansión en fracciones parciales y obtienen la
transformada inversa de Laplace. Además se utilizan otros
tipos de funciones auxiliares para cálculos.
- La función WMRaton obtiene las coordenadas de la-
ventana principal del programa, la esquina superior
izquierda tiene como coordenadas (O, O) y la esquina
inferior derecha tiene las máximas coordenadas. Esta
función se ejecuta con el movimiento del ratón, este evento
produce un mensaje WM_MOUSEMOVE que envía Windows a nuestro
programa y produce la llamada de la función. Ahora con las
coordenadas obtenidas y si algún gráfico está presente en
la ventana, se hace un reconocimiento de qué gráfico es
mediante el chequeo de la bandera gráfica que esté activa.
Entonces de acuerdo a esto se llamará a la función
correspondiente que obtendrá las coordenadas de la curva.
- Las funciones que obtienen las coordenadas de los
gráficos de estados son: CoorEspacio, CooirVelocidad,
CoorAngulo y CoorVangular. Las coordenadas se calculan en
base a las coordenadas del ratón, las dimensiones de la
ventana del programa, el intervalo de tiempo de muestreo, y
las amplitudes máximas de los estados de tal manera que a
cada coordenada de la ventana donde esté ubicado el cursor
en forma de cruz le corresponde una coordenada del plano
donde está dibujada la curva.
- La función CMUHelp índex, se ejecuta al escoger desde
el menú el contenido de la ayuda, y llama a la ayuda de
Windows para abrir el archivo de ayuda (péndulo,hlp) que
76
fue realizado mediante un proyecto aparte utilizando el
compilador de ayuda.
De manera similar a la función anterior la función
CMUHelpHelp es llamada al escoger del menú CJsar ayuda, pero
el archivo que se abre aguí es el de cómo utilizar la ayuda
y gue es propio de Windows.
Existen además varias funciones que son propias de la
programación en Windows, también existen funciones para ver
si está instalado el archivo de librería que necesita el
programa, si no existe se comunica al, usuario, puesto que
sin éste archivo es imposible abrir los cuadros de diálogo
para ingreso de datos. Otras funciones también se hicieron
para el coordinamiento de las funciones que utiliza el
programa.
4.5 EJERCICIOS.
Con los datos previstos en el programa, tanto para el
péndulo invertido como para las compensaciones y las
condiciones iniciales, realizaremos algunos ejercicios con
la ayuda del mismo.
Comenzaremos con realimentación de estado. El sistema
sin compensar tiene la siguiente descripción a variables de
estado:
77
d
dt
xl( t )
x2( t )
x3(t)
x4(t)
0 1 0 0
0 0 0 0
0 0 0 1
0 0 10.9 0
xl( t )
x2(t)
x3(t)
x4( t )
0
1
0
-1.1
La realimentación de estado nos permite fijar los
polos de lazo cerrado para estabilizar el sistema.
Teóricamente si todos los polos de lazo cerrado son
negativos se conseguirá que el sistema se estabilice, sin
embargo tenemos otras restricciones como son el espacio de
la pista y que el ángulo no debe crecer demasiado porque el
modelo matemático utilizado para el problema ya no seria
válido y todos los resultados serian erróneos.
Deseamos que el sistema realimentado tenga
siguientes polos.reales diferentes:
pl - -2
p2 = -2.5
p3 - -3
p4 = -4
y con una condición inicial de ángulo de 10 grados.
los
A continuación hallaremos el polinomio característico
de la matriz de lazo cerrado multiplicando los polos
ingresados:
(s-pl)(s-p2)(s-p3)(s-p4) - (s+2)(s+2.5)(s+3)(s+4) =
- £r4 + 11,5 S3 + 48.5 S2 + 89 3 + 60 » O
78
Como era de esperarse todos los coeficientes de la
ecuación característica son positivos. Luego de realizar
los cálculos respectivos, obtenemos el vector de
realimentación y la matriz de lazo cerrado:
K - [-5.15 -7.64 -54.98 -16.11]
[A - B K] -
0
5.15
0
-6.11
1
7.64
0
-9.07
0
54.98
0
-53.64
0
16.11
1
-19.13
Y con la ayuda del programa obtenemos la respuesta en
el tiempo de cada uno de los estados:
x= {0.379 seg/d¡v|
y= {0.0371946 m/dív)
4.4 Posición del carro vs_ tiempo
El espacio recorrido por el carro es en la dirección
prevista y regresa al origen del sistema de referencia, con
79
los polos de lazo cerrado propuestos el sistema es lo
suficientemente rápido para no chocar con la pista
x= (0.379 seg/div)
y= (0.0827952 [m/s]/div]
fig. 4.5 Velocidad vs_ tiempo
x= (0.379 scg/dlvj
y=
fig. 4.6 Ángulo vs_ tiempo
El ángulo se lleva a su posición de referencia cero,
con lo que se consigue poner al péndulo en la posición
vertical.
80
(0.379 seg/drv)(3.80761 (g/sj/dlvj
fig. 4.7 Velocidad angular vs tiempo
Asi vemos que mediante la realimentación de estado
todos los estados llegan a cero.
x= (0.379 seg/div)y= (0.959637 newfdlv)
u ( t j
fig_ 4.8 Fuerza vs, tiempo
La fuerza al final se hace cero al equilibrar al
péndulo.
81
En el diagrama de fase se observa que tanto el ángulo
como la derivada llegan al origen.
x= fl g/divj
y= (3.8Ü7B1 (g/s)/dlv)
fig 4.9 Diagrama de fase
De' esta manera se observa que el sistema se estabiliza
completamente.
- Ahora probaremos con el control proporcional
derivativo, nos pondremos unas especificaciones requeridas
de frecuencia no amortiguada de 7 rad/seg, de coeficiente
de amortiguamiento igual a 0.6 y de ángulo inicial de 10
grados.
De allí obtendremos las constantes del controlador que
on:
Kp = 51.068
Kd - 0.1385
82
En este tipo de control las varibles de interés son el
ángulo y su derivada. El máximo sobreimpulso se puede
entender agui como la parte más negativa del ángulo
comparada con su condición inicial.
x= (0.169048 seg/div)
y= (1 g/dh/j
fig. 4.10 Ángulo vs. tiempo
x= (0.169040y= (3.49178 (
fig_ 4.11 Velocidad angular vs_ tiempo
83
x= (0.180476 seg/dlv)
y= (0.891305 new/div)
u( t ]
fig. 4.12 Fuerza vs. tiempo
x= (1 g/div)y= (3.49178 |g/s]/dlv]
fig. 4.13 Diagrama de fase
- Para el control de tiempo mínimo elegiremos una fuerza
de 5 newtons que será constante y gue sólo puede cambiar de
signo. Con una condición inicial de ángulo de 10 grados.
84
x= (0.063 seg/dK/J
y= (1 g/div]
fig 4-14 Ángulo ve. tiempo
Es este gráfico observamos que el ángulo no cambia de
signo, pues la respuesta decrece desde el valor inicial
hasta cero.
x= (0.063 seg/drv)
y= (5.37151 (g/sj/dtv)
fig 4-15 Velocidad angular ve. tiempo
86
Aguí podemos ver en el plano de fase que las dos
variables de estado convergen hacia el origen, y la
trayectoria es similar a la deducida en la parte teórica.
El tiempo de estabilización es menor que en los otros»
casos y la fuerza es menor que los máximos de fuerza de los
otros dos casos, lo cual confirma que aplicar la máxima
fuerza y manteniéndola constante se consigue- el control de
tiempo minimo .
Mediante el cambio de las condiciones iniciales y los
parámetros de control podemos ver como reacciona el
sistema.
Asi, ensayemos con un sistema oscilatorio utilizando
el control proporcional derivativo con el coeficiente de
amortiguamiento pequeño
( - o.i ^B = 7 4>(o) = 10 *2<°) = °-05
Con estas especificaciones el sistema se estabiliza
para una posición distinta de cero, se ve claramente que el
sistema es muy oscilatorio debido al coeficiente de
amortiguamiento utilizado, y el sistema es lento, con un
tiempo de estabilización de 5.7 segundos.
Mediante el programa se obtienen lo gráficos
correspondientes para las especificaciones dadas :
87
x= (1.08286 seg/dív)
y= (0.0311734 m/dtvjx ( t ]
fig. 4.18 Posición del carro vs-
x= (1.08286 seg/drv)
y= (0.108940 (m/stfdM
fig. 4_19 Velocidad del carro VB_ t
88
x= (1.08286 seg/divj
y= n 9/dM
4.20 Ángulo vs. t;
x= [1.08286 scg/div)
y= (6.03675 (g/s)/dlv)
fig. 4.21 Velocidad angular vs. t
89
x= (1-15143 seg/dlv]y= (0.891305 new/div)
u ( t j
fig. 4.22 Fuerza vs. t
x= (1 9/drv)
y= (6.03675 (g/s)/dlvj
fig, 4-23 Diagrama de fase
CAPITULO V
RESULTADOS Y CONCLUSIONES
En este capítulo analizaremos los resultados y las
conclusiones en base a la teoría desarrollada y a los
ejercicios que se realizaron.
5.1 RESULTADOS.
El programa desarrollado permite ensayar varios tipos
de control para el péndulo invertido de una manera fácil
para el usuario presentando resultados, gráficos y la
simulación dinámica del péndulo invertido.
Al inicio del programa se cargan datos que ya han sido
preestablecidos en el programa y que se pueden utilizar en
la ejecución del mismo, pero si se desea se pueden cambiar
los datos del péndulo.
Se presentan los resultados del control implementado
91
para cada una de las alternativas de control. Y en todos
los casos se presenta los datos del péndulo ingresado. Para
asi poder analizar los resultados de cada una y ver cómo
influye el cambio de un parámetro en el sistema.
Asi} en realimentación de estado se presentan los
polos de lazo cerrado deseados, el polinomio
característico, el vector de realimentación K, y la
transformada de Laplace inversa de cada estado,
Al realizar el control proporcional derivativo, se
presentan los datos que se han ingresado, tales como: la
frecuencia natural no amortiguada y el coeficiente de
amortiguamiento deseados. Además datos de salida como son:
el tiempo de establecimiento, máximo sobreimpulso y la
respuesta en el tiempo.
En el control de tiempo óptimo se obtiene información
de la fuerza ingresada, el tiempo en el cual se realiza la
conmutación.
En todos los casos se obtiene los gráficos de cada uno
de los estados versus el tiempo y el diagrama de fase.
Los gráficos y la simulación se realizan para cada
tipo de compensación y se escala automáticamente de acuerdo
a las dimensiones de la ventana del programa.
92
Mediante el programa se puede imprimir directamente el
contenido de la ventana principal del programa, ya sean
textos o gráficos. En el caso de los gráficos, se puede
cambiar el tamaño de la impresión, mediante la ampliación o
reducción de la ventana del programa.
También se puede copiar al portapapeles cualquier
gráfico de la ventana del programa y de cualquier dimensión
dependiendo de su tamaño. Lo que permitirá obtener gráficos
del programa desde otras aplicaciones.
Se accede directamente desde el menú del programa a la
ayuda que enseña a cómo utilizar el programa.
5.2 CONCLUSIONES-
El programa desarrollado utiliza la técnica de
programación orientada a objetos en el compilador Turbo C++
versión 3.1 para Windows lo que permite hacer más modular
al programa fuente y de fácil mantenimiento. Permite
acceder directamente a funciones de Windows pero en el caso
de la redimensión de la ventana del programa se debe
programar el escalamiento de los gráficos.
El paquete Turbo C+4- versión 3.1 posee todas las
herramientas necesarias para la realización del programa,
asi podemos mencionar un editor del programa fuente que
93
pone diferentes tipos y colores de letra a las palabras
clave del lenguaje, a los comentarios, a los archivos de
inclusión, etc., lo cual hace más fácil la programación. Se
utilizó el taller de recursos (Resourse Workshop) para
realisar mapas de bits, cuadros de diálogo, teclas
aceleradoras, iconos, etc. Además este paquete trae un
compilador de ayuda (HC) en el cual se realizó el archivo
de ayuda del programa.
Mediante este programa y el empleo de Windows se
facilita la obtención de la información. Puesto gue desde
cualquier otra aplicación se puede importar gráficos del
programa realizado, Y las entradas y salidas son de fácil
utilización para el usuario.
Con la 'realimentación de estado es posible conseguir
un mejor control, se toma una mayor información del
sistema, pues se hace la realimentación de las cuatro
variables de estado. Pero la implementación práctica seria
complicada.
En el control proporcional derivativo sólo se
realimenta el ángulo y su derivada por lo tanto la fuerza
sólo responderá a un cambio de los mismos. No se toma en
consideración el espacio y la velocidad, y al obtenerlos a
partir de la integración de la fuerza el sistema
teóricamente puede quedar con una velocidad constante, pero
que podría ser anulada con las condiciones iniciales.
94
En el control de tiempo óptimo, la curva de
conmutación es difícil conseguirla con elementos analógicos
por lo tanto se debería emplear un control por computador
en la práctica. También puede haber conflictos en las
conmutaciones cuando el ángulo es pequeño, sin embargo en
otros trabajos con redes neurales se ha aplicado fuerzas
constantes al péndulo invertido que sólo pueden cambiar de
dirección a fin de controlarlo.
Mediante la simulación dinámica del péndulo invertido
se confirman los resultados analíticos. Además permite
darnos cuenta si algún tipo de control es demasiado lento y
necesita más espacio para conseguir el equilibrio. En el
cálculo de las compensaciones no se toma en cuenta el
límite de la pista y los gráficos que se obtienen no tienen
el limitante del espacio, luego en la simulación dinámica
se puede verificar si existe o no el choque del carro con
la pista.
El programa desarrollado es de fácil uso, pues cuenta
con una ayuda a la que puede acceder el usuario desde el
menú del mismo.
Las limitaciones del programa están en cuanto al
modelo utilizado se refiere y en la forma de control
implementado, que debería ser igual al desarrollado en la
parte teórica, para poder simular algún péndulo invertido.
95
La simulación dinámica ha permitido observar las
limitaciones que pueden existir en un sistema en la
práctica y los rangos permisibles para realizar el control. •
Finalmente con esta tesis se ha cumplido las metas y
objetivos propuestos, entregando al estudiante una programa
que le servilla como ayuda didáctica para la compresión dei
los Sistemas de Control.
BIBLIOGRAFÍA
BIBLIOGRAFÍA
[1] ADAMS L,, "Programación avanzada de gráficos en C para
Windows", Ed. Windcrest/McGraw Hill, Madrid, 1993.
[2] BANDA H, , FOLKES D. , STEWART B. ,. "Programming in C" ,
üniversity of Dundee, 1991
[3] DISTEFANO J., STÜBBERUD A., WILLIAMS I.,
"Hetroalimentación v Sistemas de Control", Segunda
Edición, Santafé de Bogotá, julio 1992, McGRAW-HILL
INTERAMERICANA, S.A.
[4] DONALD E. KIRK, "Qptimal Control Theorv". New Jersey,
1970, PRENTICE-HALL, INC.
[5] DORF Richard, "Sistemas Automáticos de Control".
Tlacopac San Ángel, Fondo Educativo Interamericano,
1977.
[6] KWAKERNAAK Huibert, "Linear Qptimal Control Svstems".
1972
98
[7 ] MICROSOFT CORPORATION 3 "üiorosoft Windows 3_J^_
Herramientas dR Programación", Madrid, 1994,
McGRAW__HILL/INTERAMERICANA DE ESPASA, S. A.
[8] MURRAY W., PAPPAS Ch. , "Programación en Windows 3 JL" ,
Ed. Osborne/McGraw Hill, Madrid, 1993.
[9] OGATA K., "Dinámica de Sistemas", Ed. Prentice Hall,
México, 1987.
[10] OGATA K., "Ingeniería de Control Moderna", Ed.
Prentice Hall, México, 1985.
[11] PAPPAS Ch./ MURRAY W., "Manual de Borland C++", Ed.
Osborne/McGraw Hill, Madrid, 1993.
[12] PASMAY F. , "Diseño Y comprobaciónde un mód-ulo para
.control óptimo de poeioion de un motor D.G. " ,Tesis
E.P.N, 1983.
[13] PORTER A., "Programación en C++ para Windows", Ed.
Osborne/McGraw Hill, Madrid, 1994.
[14] SHELDON T., "Windows 3.1 Manual de Referencia", Ed
Osborne/McGraw Hill, Madrid, 1993.
[15] STARKEY B. J. , "La-place transforma for electrical
engineers", Philosophical Library, New York^ 1958.
s o
NOMENCLATURA UTILIZADA
F fuerza máxima aplicada en el control óptimo.
g Gravedad.
H(t) Reacción horizontal debida al pivote.
J Momento de inercia de la varilla respecto a su
centro de gravedad.
L Longitud desde el pivote al centro de gravedad de
la varilla.
L" Longitud efectiva del péndulo.
M Masa del carro,
m Masa de la varilla.
N Normal debida al contacto del carro con la pista
pl, p23 p3 y p4 Son los polos de lazo cerrado que se desean
en la realimentación de estado.
u(t) Fuerza externa que se .aplica al carro.
V(t) Reacción vertical debida al pivote.
x(t) Ubicación del carro respecto al centro de la
pista.
xx Variable de estado que representa el espacio o
ubicación del carro respecto al centro del sistema
de referencia que es el centro de la pista.
101
Variable de estado que representa la velocidad del
carro .
xa Variable de estado que representa el ángulo que
forma el péndulo con la vertical.
XA Variable de estado que representa a la velocidad
angular con que gira la varilla.
a Parte real del polo complejo conjugado de laso
cerrado .
P Parte imaginaria del polo complejo de lazo
cerrado .
a± Parte real del primer polo complejo conjugado de
lazo cerrado .
PÍ Parte imaginaria del primer polo complejo
conjugado de laso cerrado .
a2 Parte real del segundo polo complejo conjugado de
lazo cerrado.
(3 2 Parte imaginaria del segundo polo complejo
conjugado de laso cerrado.
$(t) Ángulo que forma la varilla con la vertical.
Velocidad angular de la varilla.d t
<f>(0) Condición inicial del ángulo que forma la
varilla con la vertical.
: — v^ Condición inicial de la velocidad angular de lad tvarilla.
Transformada de Laplace del ángulo
102
ü(s) Transformada de Laplace de la fuerza aplicada al
carro.
XI(B) Transformada de Laplace del espacio o ubicación
del carro.
X2(s) Transformada de Laplace de la velocidad del carro
J£j(s) Transformada de Laplace del ángulo ue forma la
varilla con la vertical.
X¿(B) Transformada de Laplace de la velocidad angular
con que gira la varilla.
6>n Frecuencia natural no amortiguada.
o> Velocidad angular de la varilla.
C Coeficiente de amortiguamiento
MANUAL DEL USÜAEIO
Para la realización del programa PENDULO.EXE se
utilizó los siguientes archivos:
PÉNDULO.PRJ Que es el archivo de proyecto donde se
realizó el programa.
Es el programa fuente donde está todo el
listado del mismo.
Archivo de definición de constantes
Archivo de definición de módulo.
Es el archivo de recursos donde se definen
cuadros de diálogo, mapas de bits, teclas
aceleradoras, iconos y el menú del programa.
PÉNDULO.ICO Es el icono diseñado para el programa.
PÉNDULO.CPP
PÉNDULO.H
OWL.DEF
PÉNDULO.RC
Archivos para crear la Ayuda:
PÉNDULO.HPJ
PERDULO.RTF
PENDULOM.H
Es el archivo de proyecto para crear el
archivo ayuda.
Es la edición del programa de ayuda en un
formato de texto enriquecido.
Es un archivo donde se definen constantes
104
PENDULOM.H Es un archivo donde se definen constantes
para el proyecto de ayuda.
PÉNDULO.HLP Es el archivo de ayuda compilado, que debe
existir en el directorio donde se copia al
programa ejecutable para poder acceder a la
misma,
Antes de nada se debe copiar el archivo BWCC.DLL en el
directorio C:\WINDOWS\SYSTEM, que utiliza en programa para
presentar los cuadros de diálogo, en caso contrario no se
podrá acceder a ellos. Este archivo se copia al instalar el
compilador de lenguaje C-M-, pero se .lo puede copiar sin
ningún problema.
El programa realizado es de fácil uso. Primeramente
inicialice Windows y elija desde en menú File del Program
Manager la opción JRun y escriba el path y el nombre del
programa (PENDULO.EXE). El programa se inicia mostrando un
cuadro de diálogo "Acerca de ...", presione ENTER o
seleccione OK con el ratón para continuar, y acceder al
menú principal que tiene las siguientes opciones: fichero,
Edición, ingreso de datos, Simulación, (gráficos Ütil y
Ayuda.
Se accede a cada elemento del menú o submenú mediante
la selección con el ratón o mediante el teclado con ALT más
la letra subrayada de cada ítem.
105
Cada uno de los elementos del menú principal tienen
submenús que se explicarán a continuación:
Eicliero
Dentro de este . ítem se encuentran las siguientes
opciones:
£)tro Péndulo. Que permite acceder a un cuadro de
diálogo donde se deben ingresar los datos del péndulo que
se desea simular.
Por defecto. Al seleccionar esta opción el programa
pregunta al usuario si está seguro de querer esta acción,
ante una respuesta positiva se colocan datos que han sido
tomados como referencia y se perderán los datos ingresados
anteriormente en el caso de haberlo hecho. Si la respuesta
es negativa, no se cambiarán los datos. Al inicio del
programa se colocan estos datos por defecto, que permiten
obtener resultados correctos con el fin de hacer una rápida
demostración del programa.
Imprimir. Esta opción permite imprimir lo que existe
en la ventana del programa ya sean gráficos o textos.
Primero se abre un cuadro de diálogo de donde se escoge las
preferencias para la impresión.
Las dimensiones de la impresión dependen del tamaño de
la ventana del programa, al maximizar ésta, se consigue el
106
mayor tamaño de impresión que es el de una hoja de tamaño
A4. Si la ventana es pequeña entonces la impresión también
será pequeña.
Salir. Mediante esta opción se termina el programa.
Pero antes se pregunta al usuario si está realmente seguro
de salir con el fin de evitar salirse del programa
accidentalmente.
Edición
Mediante la elección de este ítem se despliega un
submenú en el que existe la opción Copiar, Al elegir ésta,
se borra el contenido del portapapeles y se copia en éste
lo que exista en la ventana principal del programa y con
las dimensiones de ésta. Al final de esta operación sale un
cuadro de mensajes que indica que se realizó esta
operación.
ingreso de datos
Mediante esta opción se puede acceder a un submenú
para ingresar datos de cada tipo de control implementado. Y
consta de cuatro itemes que se explicarán a continuación:
Eealimen. Estado. Permite el ingreso de los polos de
lazo cerrado que se desean, éstos pueden ser reales,
complejos conjugados, múltiples o cualquier combinación de
éstos. Si se ingresa un polo complejo entonces ya no se
necesitará poner su conjugado y la casilla prevista para el
107
siguiente polo ya no sirve para ingresar otro polo porque
se supone que allí debe ir el conjugado; luego para poner
más polos se deberá poner en las demás casillas de ingreso
de polos. Si los polos son reales entonces se debe dejar en
blanco o poner un cero en la parte imaginaria. Para
ingresar polos múltiples se debe poner en las casillas el
polo varias veces de acuerdo a la multiplicidad de éste.
Eroporcional Deriv. Al elegir esta opción aparece un
cuadro de diálogo donde se deben ingresar los valores
deseados de la frecuencia natural no amortiguada y del
coeficiente de amortiguamiento.
Tiempo Minimo. Mediante esta opción aparece un cuadro
de diálogo donde se debe ingresar la fuerza constante que
se aplicará al carro, no importa el signo.
A su vez, en el ingreso de datos se confirma los datos
que acepta el programa mediante un cuadro de mensajes que
se presenta al usuario con los valores ingresados y se hace
un chequeo de que éstos sean consistentes. Al ingresar
correctamente los datos se está seleccionando el
controlador utilizado. El último OK en el cuadro de diálogo
de algún tipo de control lo selecciona automáticamente
cuando se realicen los cálculos.
.Condiciones Iniciales. Cuando se elige esta opción,
aparecerá un cuadro de diálogo que permite ingresar las
IOS
condiciones iniciales de velocidad del carro, ángulo y
velocidad angular del péndulo. La condición inicial del
espacio por defecto es cero con el fin de observar la
simetría que existe. Es importante el ingreso de las
condiciones iniciales, ya que si éstas son nulas no se
realizará ningún tipo de cálculo y no se simulará nada.
Simulación
Presenta un submenú con las opciones que se describen
a continuación:
Hacer Cálculos, Mediante esta opción se realizan los
cálculos con los datos ingresados y con el último tipo de
controlador que se ingresó. En el caso de que no se hayan
ingresado los datos del controlador o que los ingresados
sean inconsistentes o que las condiciones iniciales sean
nulas, se presentará un mensaje indicando esta situación.
Información. Permite poner en la ventana principal del
programa los datos ingresados y los resultados obtenidos de
cada control.
.Correr Animación. Inicia la simulación dinámica del
péndulo Invertido.
Limpiar pantalla. Limpia la ventana principal del
programa.
109
Gráficos
Presenta los gráficos de cada estado dependiendo de
qué se seleccione de su submenú. Los gráficos que se pueden
obtener son los siguientes:
Espacio vs. t
Velocidad vs. t
Ángulo vs. t
VeJL- ang. vs. t
Varios- Permite seleccionar varios gráficos que se
presentarán en forma simultánea.
Vel. ang vs. ang.
Además al realizar el movimiento del ratón se conocerá
las coordenadas del punto donde está situado el mismo.
lítil
Mediante esta opción se pueden correr, directamente
del submenú, programas de Windows, asi tenemos:
Eeloj
.Calculadora
Administrador de Archivos
Ayuda
Existen tres opciones:
.Contenido Fl. Permite abrir el archivo de ayuda del
programa mediante la Ayuda de Windows. Lo mismo se puede
110
hacer pulsando la tecla Fl.
Usar Ayuda. Abre el archivo de Windows sobre cómo
utilizar la ayuda.
Acerca de ... Muestra el cuadro de diálogo del
programa realizado, para continuar presione la tecla ENTKR
o seleccione OK con el ratón.
111
LISTADO DEL PROGRAMA
ARCHIVO: péndulo.
// Programa para la simulación dinámica del Péndulo Invertido// Rsslizado por Sonzalo Hontalván
de <owl.h>Sinciude <radiobut.h>lincíude <bchkbox.h>Sinclude <edit.h>íinclude <string.h>líinclude <stdlib.h>Sinclude <áath.h>üinclude <errno.h>lincíuda <bios,h»
üincluds <print.h>iinclude <cDsisdlg,h>
ííinclude "psndulo.h*iincliide "péndulos.h"
idefins Pí 3.141592654
doublB ac[43[^]í b[4), x[43;daublB kl, k2, k3j k4, pi, p2,tíüuble Pr[43, Pi[43;int CTH}
int ian, ÍBB, Haxl,r8tardo=0}doubia TespjTdBspjTangjTdanint pxsaXj incX;int jncX;doublE HnJSi,ü_o,-fid__oJvo=0JBQ=O.OjdEltaT;doublE íueriaTHjdoublB Lp=0.842, g=9,81, M=1.0, si, ^3Í longit;doublB an[iOOO],anJEÍ0003iBS[i0003íe5j[10003)fUB[í0003idoublB HaxE5p=0,0, MasDesp^.O, HaxAng=0,0, MaxDang^O.O, MaxFuB=0,0;doubls T=j // tiempo de BSchar OeTieís!([253íDeE5paY[25]JOelTtploYC25];char OBftnguYE25]JDBVangYC253JDaFuerY[253j
HCÜRSOR hPravCursor; // guardará si cursor antariorHCURSQR hHourGlass; // gestor del cursor reloj de arsnaHCÜRSOR hCrossHairi // gestor del cursor de cruz
II variables para el control de la anidación en pantallaHDC hMapaDC; // contexto visual, en aesoria para sapas bits actores
113
struct TPenduloStructchar HStringCiO];char 3iStringÜQ3;char LStringüGljchar JStringC10]jcbargString[IQ3j
struct TRealEstStruct íchar píStringüOljchar pilSiring[IO];char p2String[iQ3jchar p3String[I03ichar pi3String[103jchar p4String[IO]j}J
síruct TPropDerStruct {char HnStringüO];chsr SitaStringíIO];
struct TTisflHinStruct íchar Fusrza[10]j
struct TCondlniStruct {char desStringCiO];char fiString[103¡char dfiScring[i03¡
struct TVariosGrafStructíBDOL GEsp;BOOL BDesp;BOOL 6ñngjBOOL SOang;BOOL GFuerza;
ciass TPenduloftpp ; püblic TApplication ípublic:
TPsnduloAppíLPSTR ANasie, HINSTftNCE'hlnstance, HINSTANCE hPrevInstance,LPSTñ IpCíidLins, int nCaidShoH); TAppíicaiiontANaffie, hlnstance, hPrevInstance, IpCídLine, nCadShoHj {};
virtual void ínitínstancsí);virtual void
class TPsndulolíindQM ; public
114
p u b l i c :
TPenduloStruct PenduloStructjTRealEstStruct RaalEstStruct;
TPropDerStruct PropOerStructjTTieísMinStruct TiesHinStruct;
TCündlniStruct CondíniStructjTVariQsBraíStruct VariosGrafStruct j
7PenduloHindoH(PTHindowsübject AParent, LPSTR ATitleJ;virtual void GeiSíindowClassí HNDCLASSi HndClass);
virtual LPSTR SEtClassNameOj
virtual void SetupWindoHÍ);virtual void Paintl HDC hdc, PñINTSTRÜCH Paínt lnfo);virtual void 'riHEnterldlsí RTHessage J = [HHJIRST * HH_ENTERIDLE]¡virtual void CHExítí RTMessags } = [CKJIRST + CWJXITl j
virtual void CHÜHeipIndsxí RTfiessage ] = [CMJIRST t CHJiJELPINDEX];virtual void CHUHelpHeipí RTHesaage J = [CHJIRST + CHJJJELPHELPljvirtual void CHÜHe!pAbout( RT.lBSsage ) = [CHJIRST + CHJJJELPABQUT3;
virtual void CBdatosPendulotTMessageÍE Hsg) = [CMJIRST * CHJ_Pandulo]jvirtual void CHdatosDeíectoíRTHessage) = [CMJIRST i CHJJJatosDeíec];virtual void CHifitprifflirPanttRTÍÍBssagB) = [CHJIRST + CHJJnprinir];virtual void CHcopyClipboard(8TMes5sgB) = [CHJIRST + CH_UJopy]j
virtual void CHdatosRaalEst(THsssageít Hsg) = [CHJIRST + CHJJnputRestl;virtual void CMdatQsPropOer(THE5sagB& Msg) = [CMJIRST + CMJJnputPderlivirtual void CHdatosTifiafíiníTHBBsage* Hsg) = [CHJIRST * CHJJnputTidnljvirtual void CHdato5CondIni(THe5sage& Hsg) = [CHJIRST + CMJJondlnici];
virtual void CalculosMsnuIñTHessagB) = [CHJIRST i CHJJuildCels];virtual void AnisadonMBnuíRTMessage) = [CHJIRST ^ CMJJJnisate];virtual void ClearHsnu(RTHessage) = [CMJIRST + CH_U_CÍEar];virtual void InforsiaHenuíRTHessage) = [CHJIRST -f CMJJardware];
virtual void GrafEspHenufRTMessags} = [CílJIRST f CHJJJspacioJ;virtual void BraíVelHenutRThessage) = [CHJIRST i CM_UJeloddad]jvirtual void SraíAngHenuíRTHassage} = [CHJIRST + CM_Ü_AnguloJ;virtual void SraíVanHenuíRTHessage) = [CMJIRST + CHJJAngular];virtual void SrafFusMenufRTHsssage) = [CMJIRST + CMJJusrzajjvirtual void 6rafTod«enu(RT«Bssage] = [CMJIRST + CHJJraíVarios];virtual void GrafDvftMenuíRTMessaga) = [CHJIRST t CHJJJngvsDang]¡
virtual void CfíRelojfñTHessage Msg) = [CHJÍRST + CMJ_RBloj]jvirtual void CHCalcuiadoraíRTfisssage Hsg) = [CHJIRST i CM_U_CaIculadora3jvirtual void CHArchivasíRTMessage Hsg) = [CHJIRST + CH_U_Archivos];
virtual void «KSizetTKessage* «essageJ=[iiMJIRST + HHJIIE];virtual void WHRaton'íTHessagE?; Hessage)=[HHJÍRST -f- «MJIOUSEHOVEli
void RaalisiEstadO;void Bstadoi íJ j
void es tado2 ( ) jvoid estado3(í i
115
void 2stado4()jvoid Naxifflosdi
void CuatroPRDiíerdívoid DosPROyDosPRIdivoid UnPRDyTrBsPRIUj•/oíd CuatroPRIgualOjvoid DosPSIyDosPRKJivoid OosPRIyUnPCCoO;-/oíd DosPRDyünPCCoOjvoid DasPCCDistintUivoid DasPCCIguaJesUj
void InfoCREUjvoid InfoCPD()¡
void InfoCTHU;
void NoCalculosUj
void SisEcuacionesO;Yoid ProporDeriví);void TisjipoMinisioí);void ConstrCeldasíí;voití Anisacioní);void LiiipiarPantallaOj
void GraficaEjssO)void BrafEspacioOivoid SrafVelocidadí);void SrafAnguloí);void BraíVAngularíJjvoid 6raficaFuena()¡void GrafAngvsDangOj
void CoorEspacioí);void CoorVelocidadí);void CoorAnguloí);void CoorVangularO;void CoordeFueriaílivoid CoorVangvsAnglíj
void DeíecioO;
BOQL
TPandulofíindoví:;TPBnduloHindow(PTHindow50bJBct AParent, LP5TR ATitle)THindoHÍAParsnt, ATitle)
ílong sndTifi)B,de]ayTick5=5;
116
AssignHenuíIDJENUJjaefisetdíPendiiloStruct, 0x0, BÍZEDÍ PenduloStruct) ;aefiSsttítRealEstStrucfc, O x O j sizeof RealEstSfcructí iflsasettlíPropDBrStruct, 0x0, sizeof PropDerStructJ jffiestsatUíTieíiíUnStructj 0x0, sizeof TiefflHinSfcructliñe?iS5tt«íCofídlniSíructl O x O j sizeof CondiniStructJ jaBüsstíítyariosSrafStrucfcjOxOjSizeoi VariosBraíStruct);V3rÍQs6r3TStruct.GEsp=FALSE;VariosBrafStruct.6Qesp=FALSE¡Vario56rafStruct.SAng=TñUEiVario5GrafStruct.GDang=TRÜEjVarios6raíStruct.BFuer2a=FALSEj
5trcpyíPsnduIoStruci.M5tring,"iu)jBtrcpyíPendyloStrüct.fsString/O.!");5trcpyíPendu!DStruct,LStringJll0.842");5Írcpy{PsnduioSíructJString,uO,Oi2uí;strcpy{PEndiílQStruct.gString,"9-SiM.;
5trcpy(RB3Ít5tStruct,p!StringJn-211}jstrcpytRealEstStruct.piíStríng,"");5trcpy(Rea!E5tStruct.p2Stringíu-2,51!};
5trcpytRea!EstStruct.p3StringJ l t -3Bí¡BtrcpyíñealEstStruct.piJStrlng/1');5 t r c p y ( R e 3 l E 5 t S t r u c t . p 4 S t r i n g J * ~ 4 f l ] j
strcpyíPropDErStruct.WnString/'?11)}5trcpy(PropDerStruct.SIiaString,1'0.¿H]i
B i r c p y í T i e f t M i n S t r u c t . Fuerza, "2 .5" ) ;
5trcpy(CondíniStruct.dasString,E"!)jBtrcpyíCQndlniStruci.fiString/iO'1);BtrcpytCQndlniStruct.dfiString,"");Deísciol J¡
endlise = biostiíBEÍO, OL)' -f- delayTicksjwhile (bio5tiae(0; OL) < endTias)rEtardo-H j
void TPenduíoWindow::Defecto{)ííi=l; Lp=0.842; g=9.ei|Pr[0)=-2; PiEOHi Pr[i]=-2.5¡ Pr[2]=-3; Pi[i]=0;
fuErzaííl=2.5jfi_o=iOfPI/180j
Calculo5Rsst= TRUEjCalculosPdBr= FñLSE;CalculosTfflin= FALSE;Condicione5Í= TRUE;
117
void TPenduIüñpp;;InitInst=ncsU{
TApplication::!niHnstanceUiHAccTable = LoadAccalsratorsI hlnstance, HAKElNTRESOURCEf PEH0ULOAPACCEL
' hHourSlass^ LoadCursor{NULL,IDCJAIT]i
class TDialogPBndulo : public TDialog {public;
TDialogPBudulQ{PT8indü«sÜbjsct AParent, int Resourceld);
void
char ftLabEl[2551ilong i t j
if [ SetHodulE()->EsecDialGqínBW TDialogPendulofthis, ID_PENDULOJ)==IDOKí
M = a t o f ( P B n d u l o S t r u c t , f l S t r i n g J iB=atof (PenduloStruct . astr ingí jJ=a to i (P3nduloSt ruc t . JS t r ing) ;l ong i t=a to f (Pendu loS t ruc t .LS t r i ng ) jg=atof [ P f i n d u l o S t r u c t . g S t r i n g l j
strcpylALabsl, "Pftidulo !nvertída:\n\nu);strcatlALabel, "sasa dsl carro = L'J;strcai(ALabEl, PEnduloStruct.MString);strcattALabfil, a Kg\n«asa dsl péndulo = a í jstrcatfALabelj PenduloStruct.aStrinq) ¡strcaííALsbBl, " Kg\nlongitud = "};sfcrcat(ALabeI, PsnduloStruct.LStrinq);strcatíALabeí j H ffi\n¡30inBnto de inercia = 3j;
lj PsndulaStruct.JStrinq);" Kg m2\ngravadad = ");
5trcat(ALabeíj PenduloStract-gStríng);strc3t(ALabBlf " í8/52\n"};
j ALabslj "datos ingrEsados", HBJ3K);
TDialogPendulo::TDialogPendulo(PTWindoií50bject AParsnt, int Resourceld): TDialogíñParBntj Resourceld)
{ns« TEdit(this, ID_Hj
5Í2fio-f([ÍTPBnduloHindo« t)Parent)->P2ndulo5truct,í1Stríng))jnen TEdit(tfiis, ID_rij
siseoííí(TPBndulc-NindoH í)ParBnt)-)?BnduloStruct,ísStringl)iitflhiSj ÍDJ_j
118
5 Í z e a f ( [ ( T P e n d u l o H i n d a w í )Pa ren t ) ->Psndu lQSt ruc t .LS t r ing ) í ¡ÍÍE« TEdi t í th is , IDJ,
5 Ízeo í [ ( (TPsndu loHindoH í )Pa ren t ) ->Pendu loS t ruc t . JS t r ing )} inBH TEdi t í th í s , ID_g,
s i zeo f tKTPendu loWindow í ) P a r s n t ) - > P e n d u i o S t r u c í . g S t r i n g ) ) jT r a n s í e r B u f f e r = (void f a r U $ ( í ( T P e n d u l o B i n d o w Í J P a r e n t ) - > P e n d u l o S t r u c t ) i
class T D i a l o g R e a l E s ; p u b l i c TDialog {pub l ic ;
T D i a l D g R e a l E B Í P T K i n d o í í s O b J B C t ñParent , int R e s o u r c e l d j j)¡
yoid TPendulo ' r f indoH; ¡CHdatosRealEsttTHessageí;)
char A!
double PaimO,PaiaíJfJaxia,PrBal[4];int sig = 8; // dígitos significativasint i;char plinE]="pí = a;char p2inC3=Hp2 = ";char p3in[J="p3 = "jchar p4inE3="p4 = "jchar pR_iEi23 J pR_2[123 ) pR_3Ei2] ,pRJEi2] ;char
if ( 6 e t H o d u l e í ) - > E x B c D i a l o g í n e w TDia logReaiEs í th i s , IDJEALJST)) ==f
Pr[0]=atof (Res lEs tS t ruc t .p lS t r ing l jP r E i 3 = a t o f ( R e a l E 5 t S t r ü c t , p 2 S t r i n g ) ;P r E 2 3 = a t o f ( R e a l E s t S t r u c t , p 3 S t r i n g ) jPr [33=a tQf{RB3lEs tS t ruc t .p4St r inq) jPi[03=atoí{R6alE5tStri ict ,piiString};Pi£í3=atofiRealE5tStruct,pi35tring);
PaiflO=-Pi[03iPaiífil=-PÍ[I];g c v t í P r C O ] , sig, pRJJ ;g c v t t P r C i ] , 5ig, p R _ 2 ) jgcv t íP r [23 , sig, pR_3);gcvt íPr[33; 5Í9í p R J J jgcvUPiíO] , sig, p I J J jQcvtíPaiflOj sigj p l _ 2 ) jgcvt(Pi[i] , sig, p l j l igcvt tPaial , sig, pMíi
s t r c p y t A L a b B l , "Real i sentac iGn de B s t a d o : \ n \ n " ) ji f ( i f abs íP i [ f l ] í>0) í ( f abs (P iC l ] )>0 ) í
119
strcafcfALabel, "parte real parte isag.\nMiSise
strcat íALabel , "polos reales\nMjstrcaUALabslj piinljstrcatíALabel, pRJU;Pr3al{fl]=Pr[0];if(íab5(Pi[OJ)>Q)ístrtatíALabelj " MistrcatiALabel, pl_i)jsírcatíALabeij " j\n"}jstrcatíflUbelj p2ín)_;sírcatí ALabel, pRJ);strcatíALabelj " ")}sírcatíALabei, pi_2);strcatíALsbel, ' j\n"):strcpytRealEstStruct.pZStringjpRJJjPreal[l]=PrEO]i}else(strcatíALabel, H\nu}i5trcat[ALabelj p2in);strcstíALabel, pR_2);strcat(ALabel, "\nBJ;
strcatíALabel, p3in);strcatíALabel, pR_3)j?rea][2]=Pr[2]j
ifífabs(Pi[13)>0){strcatíALabel, ü MÍstrcatíALabel, pl_3);strcatíALabel, u j\nMj5trcat(ALabeI3 p3in);strcatíALabel, pñj);strcatíALabel, " MistrcatíALabeij pIJÍ;strcatíALabsl, " J M istrcpy(RealE5tStruct.p4String,pRJ};Preal[33=PrE2]¡}else{strcatíñLabel, "\nMjstrcatfALsbeij p4inj;strcatíALabel, pR__4):Preaim=Pr[3]ji
HesBageBojííHHindow, ALabel, "datos ingresados", HBJ3KJ}
f íaxis=PrealCO];
120
íor(i=iji(=3;i+-í-)
haxiaF Praalíi};i.¡
t M a x = i G / f a b 5 l f í a x Í B ) i // staxiao va lo r de tieapo de s iaulaci in
CalculosRest= TRUE;oer^ FALSE;ifi= FALSE;
]-0) &* (Pi[i3™0)ííifííPr[03>=OJ!(Pr[i]>=OÍ¡(PrC2]>=OÍ!(Pr[33>=0}¡
íñessageBoxíHtíindoví,"Los polos de lazo cerrada realss\n*ano deben ser csros o positivos","Mal ubicados los polos",MBJCOMEXCLAHATIOH ! HB_OK);
QsRa5t= FALSE;
í
if((fabs(?iCO])>0) Jt(if(ÍPrC03>=OÍ!iPr[23>=Oi!ÍPrE3]>=Oi)
"Los polos de lazo cerrado realesXn""no deben ser ceros o positivos","Mal ubicados los palos",MBJCOHEXCLAMflTION ! HBJKJíCalculosRest= FALSE;
if((Pi[Q]==0) H ífabs(Pi[I3í>OJ)íiíí(Pr[0]>=0)!ÍPr[i]>=0);CPr[23>=0)}
í
"Los polos de lazo cerrado reaiss\njano deben ser ceros o positivos","Mal ubicadas los polos",«BJCONEXCLfthflTIQN ! HB_OK)jCalculosRsst= FfiLSE;
i í í ( f a b s ( P i [ 0 ] ) > 0 ) f c i Í Í 3 b s ( P i í i 3 í > O J ]/
i1UPr lO]>=0) ¡ tP r [2 ]>=0)J
122
, sig, lr!n_ago/USi, sig., Si_acep);
s t rcp ' / ÍHLabel , "Proporcional de r ivaUvo; \n \ r , " ) js t r c a t í ñ L a o e l j Ingr l ín ) ;
strcatíALabsl, UnidHn);strcatíAUbel, "\n")istrcaUALabel, IngrSi);
lj Sí_acsp);indoKj ALabelj "datos ingresados", HBJJK))
if í(Hn<=0)MSi<=OJJ
"Los datos ingrssadosVn11
"NO son los correctos","error da datos",MBJCOHEXCLAMATION í H 8 _ O K ) ;CalculosPder= FflLSEj
TPrDpDerDialog!;TPropDerDialog(PTMindowsObject APsrent, int Resourceld}i T D i a i o g t ñ P a r e n t , Rssource idJ
{new TEditíthis, IDJN,
5Ízeo í ( ( (TPendu loá í i ndow t ) P a r B n t l - ) P r o p D e r S t r u c t . W n S t r i n g ) ) }new T E d i t f t h i s , ID_S1TA,
5Í2eo í ( ({TPendu loHindoM í )Pa ren t ) ">PropDerS t ruc t ,S i t aS t r ing)} ;Trans f s rBu í fe r = (void f a r t í i ( ( ( T P e n d u l o W i n d o w MParent) - )PropDerStruct ) ;
class T D i a l o g T f a i n : p u b l i c T D i a l o g (publ ic ;
TDialogTfsin(PTHindowsObJBct AParsnt, int RssourceJd);
void TPenduloiJindoHüCHdatosTiBfBÍl iníTflessagBlc){
char A L a b E l [ 2 5 5 ] jint 5ig=8;char F_scep[i2]j
if i 6 B t H o d u l E ( J - > E x s c D i a l o g ( n 8 M T D Í 3 l o g T f f l i n ( t h Í 5 , IDJ1EMPJIN1J == IDDK(
CslculQsRe$t= FALSEjCa lcu losPdsr= FALSE;
123
iíF TRUE;fuerzaTÍ1=atof(T.is3iHinSí:ruct. Fuerza);
gcv t ( fusrzaTMj sigj F_acep);
strcpyiftLabel, "Control opt ino: \n\n") jstrcatíALabel, F_acep)j
KessageBoslHlíindDHj ALabei, "datos ingrssadoB", HB_QK);
TDialogTiin::TDialogTain[PTHindowsObJBct AParent, int Resourcsld); TDislogtAParentj Resourcsld]
{new TEditíthis, 1DJUER1A,
sizfiof(((TPenduloWindüíi í)ParentJ-}Tief5HinStnict,Fueria}í;T.-ansferBuífer = (void faríí^íí(TPsnduioWindow t)ParEntJ->Tie»HinStruct)j
cía55 TCondlnicBialog : public TDialog {public;
TCondlnicDialogtPTMindoMsübject AParent j int Resourceld)¡
void TPenduloHindoH! íCHdstQsCondlniíTHessagelí)(char ALabel[2551iint 5ig=8;.char Ingrvo[3=!lv8locidad = *jchar Onidvü[]=" ¡n/58g";char Ingrfi_p[]=H9ngulo = ";char ünidfi_pC3=" grados";char !ngrfidjj[]="velocidad angular = " jchar Unidfid_o[]=M grados/ssg";char vo_acep[12], an_acep[!2]j 3d_acep[i2];
if ( 6etí lodulE(J->ExscDialogínEW TCcndlnkOialogfthis, ID_CflNDJNICJÍ ~ IDOK
íYo=atof(CondlniStruct.desStrifig)i•fijj=atof(CondIniStruct.fiString)jfid_o=atofíCondIniStruct,díiSíring};
gcvtívo, sig, vo_acsp);gcvt(i i_0j sig, an_3CBp);gcvt(fid_o, sig, sd_acep);
Condicionesl=T8UEifi__o=fi_otPI/180; // transformación a radianes•íÍd_o=fid_oíPI/i80; // transformación a radianes
124
strcpyfALabEl, "Condiciones Inidales;\n\n") ¡strcatfALabelj IngrvojjstrcatfALabelj vo_acap)jstrcatíALabelj UnidvoJ;strcatíflUbel, "VJ;scrcaííALabelj Ingrfiji}¡strcatfALabelj an_acep]¿strcatíALabeí, Unidfi_o);strcafc l f tLabel j "\n"!i
belj Ingr1id_oí;lj ad_acsp)j
ünidíid^o);strcatlALabeJ, JI\nM); "
Hes5BQe8ox(Hyjindow, ALabsl, "datos ingresados", MBJ
TCondlnicDíalogüTCondJnicDialogíPTilindoHBObJBct AParent, int RESourceld); TDialogíAParsnt, Resourceld)
/
ne* TEditíthis, IDJELINIC,5Ízeoi(((TPsnduloiíindow í)Parent)-)Cond]niStruct.de5String)í¡
ne« TEditfthis, IDJH6INIC,sizeoííííTPenduioHindovf í)Parent)->CoRdIniStruct.-fiString))i
new TEditíthis, ID_VfiNINIC,sizsof(((TPBndulolíindo« ÍÍParent)->Cond!niStrtict.dTÍString3);
TransíarBuffer = (void fa r t j& í ((TPBndulaWindoií MParentHCondíniStruct);
class TVariosGrafDialog ; pubÜc ÍDialog {public:
TVariosGrafDialüg(PTiíindoH50bject AParent, int Resourceld);)¡
void TPenduloHindow::6raíTodfíenu(RTNesBagB)
í
if ( GetModule()-)ExecDialog(n9H TVarios6rafDialog(this, VARIOSJRAFJ) == 1DOK/
Íf(CaIculosHech==FALSE)
íNoCalculosí í jreturnj
if(Varias6rafStruct.GEsp==TRU£íGrafiE=pacio=TRUEjelseGrafiE5pacio=FALSE;
125
H(VariosGrafStruct,6De5p==TRUE)GrafiVelGcid=TSUEjBl5B
6rafiVelocid=FALSEi
if{VariosGrafStruct.GAng==TRUE)6rafi_AngulG=TRUE¡el seGrafi_Anguio=FALSE;
iftVariosGrafStruct.GDang==TRUE)6raüDeriAng=TRUE¡el seGraüDeriAng=FAlSE;
if(Varios6rafStnict.6Fuerza==TRUE)GraficFuerza=TRUE;elseBj-a1icFuerza=FALSE;
BraficVarios= TRÜEj6rafiAfiiraaci= FALSEjGraficarAvsD= FALSE;
LiaipisrPBntallaU;
TVariosGraffl ialogiiTVariosGrafDialQgíPTHindowsübject AParent, ini Sesourceld): TDialagíAParsnt, Resourceld)
new TBCheckBoxíthis, IDJEsp, 0);neH TBCheckBüxíthÍ5, IDJDesp, 0 ) 5nes TBCheckBoxtthis, IDJAng, 0);nesí TBChedBoxíthis, IDJDang, 0);nsw TBCheckBoxtthis, IDJFuerza, 0);
TransferBufíer = (void farUMÍlTPenduloHindow UParentJ->VariosGrafStruct)i
void TPBnduloHindo«::Paint[ HDC hdc, PA1NTSTRÜCT JAR ftj
í
ii(Coffiienzo)
(Coínien2o=FALSE;GstAppiicationtí->ExBcDialog[ne« TDislogfthis/ñBQUT"]);
if( GraíiEspscio ¡ GraíiVeJocid
126
JSrafiJtogulo \gÍBraficFuarza)
Graf icaEjesí j ;
ifíGraüEspacio)BrafEspacioíJ;
ifíGrafiVslQcid)SrafVsloc idadí) ;
ifíGrafiJtatjuloíGrafAngulaU;
if(GrafiDariAng)GrafVAnguísrí);
ifíGraíicarAvsO]BraíAngvsDangí )¡
if (SraficFuerza)GraficaFijenafí;
if(lnfor»ac6ra-f ítít CalculosHech)íi f tCalculosRest)infoCREOjií(CalculosPder)InfoCPD[)¡
InfoCTMDi
voíd TPenduioHindo«:!6etHindoHCl35s(«NDCLASSA WndClass ]
{THindo«;;GetHindQwClas5ÍHndClass);HndCla55.hCursor=LoadCursoríNULL,IDC_CRQSS)j^ndClas5,hIcon=Loadkon{6BtApplication(}->hIn5t3ncs,
LP3TR TPenduloi i indQ»: :6etCla5sNaaeUí
return "TPendulo?Íindow";
void T P e n d u l o H i n d o H : : S e t u p H i n d o w ( J{
tfFiPr555ed = FALSE;
J
void TPendulQflindoBüHHEnfcerldleí RTHsssage Hsg }í
ifí (Ksg.HParan == HSSF HENO i &ft ((SetKeyState( VK Fi í fc 0x8000) != 0)í
tfFIPresssd = TRUE;PostMessagel HHindo*, BHJEYDQHN, VKJETURN, OL )j
void TPEnduloWindoN'.sChEntí RThessage Hsg )
THindoHüCHExitl Hsg );i
void TPenduioyindox;;CfíUHBlpIndBX{ RTMessage )ei
HinHslpí HWindow, "PÉNDULO.HLP', HELPJHDEX, OL );
void TPBnduloWindow::CKUHelpHBlp( RTHessage )
iHinHelpt HKindon, "HINHELP.HLP", HELPJELPONHELP, OL );
void TPenduloHintíow:;CHÜHelpAboutí RThessage J
G2tftpplication(J->ExecDiaiog(new TDialog(this í l lABOÜT"}) i
void TPenduloAppülnitMainHindoHÍ)í
= neH TPenduloWindoHÍNULL, "Pfridulo Invertido");
// Prograaa Principalint PASCAL HinMainíHINSTANCE hlnstancs, HINBTANCE hPrevInstancB,LPSTR IpCadLine, int nCffldShow)
{HINSTANCE hBorLibrary;hBorLibrary=LoadLibraryf-''bwcc.dnü);ií(íint) hBorLibrary<=32)
MessageBoslHULL,M No hay coao abrir la librfiria\n"8 Asagúrass que si archivo BWCC,DLL\nu"esté en si directorio C:\WIHDGHS\\SYSTEir,1error",MBJK)i
IPenduloApp PsnduloApp(MTran3ferTe5t", hlnstance, hPrevInstance,IpCadLins,
128
Pendulüftpp.Rundíreturn PendulcApp,Status;
// LLasadas a funciones desde el
void TPeíidulo&lindQH; ¡CHcopyClipboardíRTMessage}{
HDC hDC, hrieraDCjHBITHAP hBitaapj nPrevSitsap;int xNidthj ydepth;
xwidth= anchoVenti;;*dspth= al toVsntyjhBC= SetDCíH'riindowí; / t establecer el contexto de visualización t/hHeaDC= CreateCoap3tibleDC(nDC)¡ /í crear contexto visual, en ¡fieísoria í/hBitaap= /í crear sapa de bits í/
CreateCoiipatiblsBitsapthDCj swidth, ydepth);if (hBitsap) /í si el sapa de bits se crBÓ bien... í/
{hPrevBitísap= (HBITftóPJSelectübjectthíiEiiDC, hBitaap); / t selBccionar ¡sapa bits í/B i tB l t thHeBDCjOjO^wid th j ' /dep th jhOC.OjOjSRCCOPY) ; /? cargarlo }/OpenClipboaro'ÍHHindowJi /í abrir el portapapeles t/EraptyClipbaardí); /í liapiar B! portapapeles í/SetClipboardDataíCFJIThñP, hBi tmapJ; /í pasarle el gestor í/CloseClipboardd; l\r el portapapeles í/SelectObject(híief¡DCj hPrEvBitfflap); /í deseleccionar el aapa dB bits (/KessageBoxíHWindow,
"La pantalla actual fUB\n""copiada al portapapslas","Copiado" jHBJK))
} /I ÍIGTft; No libere B! gestor del sapa de bits después de pasarlo, í/ElS5
{ / t si existe algún Errorj mostrar un stensaje. . . í/Í1e55age8eep(0j;
HBSsagBBoxíHWindow/Ho hubo coso copiar al portapapeles VBrror'jHBJlK) í}
DeleteDC(hHeBDC); /í borrar si contexto de visualización en íSBaoria í/RBleasBDC(HHindow, hDC}; /í liberar el contexto de visualización i/
void iPEnduloNindowi'.CHiínprifiiirPantíRTHessagE]
HDC hOisplayDC;HDC hHeííioryDC; /i contexto de dispositivo en ¿BEinoria para sapa bits í/HBÍTHfiP hBitsiapj hPrevBitfaap; /í gestares de los aapas de bits í/
PRiNTDLS pd;
hDÍ5playDC=6EtDC{HWindoK]j
129
hHeeoryDO /t establecer contexto disp. en asnería para siapa de bits í/CreatBCQflpaLibleBCihDísplay'DOi
hBitaap^ CreateCoopatibleBitsapí /í crsar ¡napa de bits... t/hDisplsyOC, /í compatible con la pantalla í/anchoVenh, /í anchura í/altoVenty); /i alturs í/
HPrevBiUap= ÍHBITflAPíSelBctObjectíhHeaoryDCjheitaapli /t ...y seleccionarlo t/
Bit31t(hH5fñoryDC, /í copiar imagen de la pantalla al mapa de bits í/0,0j /í coords de ía esq, superior izquierda del destino í/anchoVentx, tt anchura í/altoVenty, /í altura t/hDisplayOC, /t raapa ds bits origen í/0,0, /í coords de la asq, superior izquierda del origen í/SRCCGPY); /t operación gráfica : copiar í;
/t Set all structure aissbers to zero. í/, O, sizeofíPRiNTDLS));
¡\e the necessary PRÍNTDL6 structure nesbers. t/
pd.lStructSize = sizpd.hvindO'.ínpr = HKindow;pd.Fiags = POJETURNDC;
/? Print a test page if successful í/li (PrintDlgííípd} != 0) (
Escapefpd.hDC, STARTDQC, 3, "Test-Doc", NUIL);
/i — copiar ¡sapa bits al contesto disp, en ¡seaoria para iapres, — í/StretchBitipd.hOC, /i destino M
0,0, /i esq. superior izquierda del rectángulo de destino í/anchoVentx, /í anchura del destino U.altoVenty, /í altura del destino í/hHeaoryDC,0,0, /í esq, superior izquierda del rectángulo ds origen ManchoVenh, /í anchura del origen ValtoVenty, /í altura del origen í/SRCCGPY}; /í operación gráfica = copiar í/
EscBpE(pd.hDC, HEHFRAHE, O, NUIL, NULL]jEscspsípd.hQC, ENQDQC, O, NUIL, NULL);DeleteDCÍpd.hQCl;if (pd.hDsvMode != NULL)
BlobalFreeípd.hDevílode};if (pd.hOevNanes ¡= NÜLLJ
BlobalFrBfi(pd.hDevNa»Bs)j}Bise
ErrorHandlerOj
130
Selec tGbjecUhHesoryDCjhPrevBi taap) ; tt deseleccionar el mapa de bits í/B e l e t e Q b J B c U h B i t n a p ) ; i\r si (sapa de bits ?/Q e l e t e D C Í h h e f f l o r y Q C ) ; /í borrar contexto disp, en síes, para sapa bits t/R e l e a s e Q C Í H W i n d o W j h D i s p l g y D C } ;
yoid TPendulo^indoK; ;CHRelaj(RJrlessage}
void TPsnduloWindow; ¡CHCalculadoraíRTHeEsage)
5
void TPenduloíí indoíí : ¡CMArchivostRTHssBsge)í
» i n E x e c ( " H Í n i i l e . B X E " , S H _ S H O H N O R H A L J i
void TPenduloHindoM: :CHdatosDeíecto(8THes5age}íiíit Re=pue5ta= 0; // resultado del cuadro de mensajes
"Quiere poner los datos prevÍ5tos?\n11"Sa perderán todos los datos ingresados","datos por delecto^
i-f (Respuesta ~ Í0ÍIO) // si el usuario pulsa Cancel,returnj
if (Respuesta == IDYES) // si el usuario pulsa Yes ({s t r c p y t P e n d u l o S t r u c t . H S t r i n g / i " } ;s t rcpy íPenduloSt ruc t .nS t r ing /O. i " ) ;strcpy(PenduloBtruct.LString,"0.842"};strcpyíPenduloStruct.JString., "0,012");
s t r c p y í P e n d u l o S t r u c t . g S t r i n g / V . S ' l i
s t r cpy(Rea iEs tS t ruc t .p iS t r ing , 1 1 -0 ,5 n ) js t r cpy íRea lEs tS t ruc t .p i iS t r ing ,^" ) ;s t r cpy(Rea lEs tS t ruc t .p2S t r ing í " -0 .5 ' t } jstrcpy{RealEstStruct,p3String,l l-0,4H).;5t-rcp l / (RaalEstStruct .pi3Str ingJ l '31 I ) is t r cpy íRe5 lEs tS t ruc t , p4S t r ing , " -0 ,4 u ) ;
s t rcpy(PropDErSt ruc t .? ínSt r ing j 1 '7" ) ;s t rcpyiPropOerStruct .S i taSt r ing/O.ü ' 1 ) ;
5 t r c p y ( T i B f l M í n S t r u c t , F u e r z a , l l 2 . 5 I f J i
131
EtrcpytCondlniStruct.dEsString,911);strcpytCondlniStruct.fiStririg/iO'')5trcpy(CandíniStrtict.díiString5atl);Defacto! );
void TPendulaHindoHí:CalculQsHenu(RTHB5sage}
{6ra-fiAniflaci= FALSE;6rafiEspacio= FALSE;BrafiVelocidr FALSE;8raíi_Angulo= FALSE;6rafiDeriAng= FALSE;GraficVario5= FALSE;6raficarftv5D= FALSE;6raficFuerza= FALSE;Inforfflac6raT= FALSE;Li»piarPantalIa[);if(CondidonesI==FftLSE)
"Las condicione
"NO pueden ser
"error de datos" ,
HBJCOHSTOP ! HB_QK);
return;
}if(CalculosRBst== TRUE)
RealisiEatadí J;
iiíCalculosPder- TRÜE)ProporDerivO;iííC3lculo=Tíin== TRUE)TisispohinisaEJ;
void TPBnduloHindoHi:Ani»acionMfinu(RTMe55ageJ(Brafiftniiaci= TRÜE;8rafiE5pacio= FALSE;6rafiVeIocid= FALSE;8rafi_Angulo= FALSE;SrafiDeriAng= FALSE;GraficVario5= FALSE;BraficarñV5D= FALSE;GraficFuerza= FALSE;Ííiíor!ft5c6raf= FALSE;LiapiarPantallaOjAniísacionO;
void TPenduloWindoM: ¡{BrafíAninaci= FALSE;6rafiE5pacio= FALSE;
132
GraüVelocid= FALSE;Grafi_ftngulo= FALSE;GraíiDeriAnq= FALSE;GraficVarios= FALSE;GraücarAvsQ= FALSE;6raficFuerz3= FALSE;InforaacGraf= FALSEjLiapiarPantallaUi
voití íPenduloSindaHüInforBafíenuIRTfiessage)
Grafifinis3ci= FñLSE;SrafiEspacio= FAL5E;6raíiVelDcid= FALSE;Grafijtagulo= FALSEjBrsfiDeriAng= FALSEjGraíicVario5= FALSE;SraficarftV5D= FALSE;GraficFuBrza= FALSEjínfonfi3cSraf= TRUE;ListpiarPantallaí J;
void TPenduÍQÍlindow: ¡GraíEspHfinuIRTHessagE)íiííCalculosHBch==FALSE){NoCalculosdjrsturn;
GrafiAninaci= FALSE;GrafiEspacio= TRUE;SraíiVelocid= FALSE;6rafi_Angulo= FALSE;SrafiDeriAng= FALSE;6raficVarios= FALSE;6ra-íicarAvsD= FALSE;GraficFuerza= FALSE;IníorsacGraf= FALSE;LiiapiarPantallaí);ívoid TPendulofeündow: ¡íií(Calcuio5Hech==FALSE]{NoCalculosOjrsturn;^
GrafiAniaaci= FALSE;GrafiEspacio= FALSE;5rafiVelocid= TRUE;Grafi_ftngulo= FALSE;6r3fiDeriftng= FñLSE;
o5= FALSE;
133
SraficarAvsü= FALBE;6raficFuerza= FALSE;InfornacGraf= FALSE;LiapiarPantallaOj5
void TPBndulo'íiindQw; ¡GrafAngHBnuíRTílEssagfi)
íii(CaiculüsHech==FALSE)/
N o C a k u l o s U jrelurn;}
6rafiAninad= FALSE;Eraf íEspacitp FALSE jBrsfiVelodd= FALSE;Srafi_Angulo= TRUE;6rafiDBriAng= FALSE;6rafkVarios= FALSE;GraíicarAvsi}= FALSE;6raficFuerza= FALSE;IniQrniacBraf= FALSE;LiíRpiarPantallat);
void TPenduloWindow;¡BraíVanMenuIRTMessageí{ifíCalculosHech==FALSE)(NoCalculosO;rsturn;í
SrafiAninaci= FALSE;GrafiE=pada= FALSE;6raíiVeiodd= FALSE;Sraíijngulo= FALSE;6ra-fiDeriAng= TRUEj6raficVarios= FALSE;6raficarAV5D= FALSE;SraficFuena= FALSE;InforaacSraf= FALSE;LiflipiarPantaliaO;
void ÍPenduloHindon: ¡GrsfFuaheniiíRTMeBsage){iítCalculosHech-FALSEÍ
tN o C a k u l o s í J jreturnj\= FALSE;
134
GrafiEspacio= FALSE;GrafiVelocid* FALSE;Graü_Angulo= FALSE;BraíiDeriAng= FALSE;Graíif:V3rio5= FALSE;SraficarAYsD= FALSE;6raficFuerza= TRUE;InforsacGraT^ FALSE;LiapiarPantallalJi
void TRenduloHindow; ¡Sraf DvfiMenuíRTfiessage)
{if(CalculDsKsch==FALSE)íNüCakulosííjrsturn
BraíiAnÍ3iaci= FALSE;Sr3fiE5pacio= FALSEjBrafiVelodd= FALSE;Brafi_Angulo= FALSEjSraíiDeriAng= FALSE;6raficVarios= FALSE;6raficarAY5D= IRUE;GraíicFtJBr2a= FALSE;Inforfiac6raf= FALSE;LiapiarPantaliaO1,i
V'QIO
I
anchoVBnfcx=MesssgB.LP.LojaltoVanty^tíessage.LP.HijUbicEjf iX=(altoVfinty-50)/2*4GjifíbCaldaaListas == TRÜE)
SBlectQbjfict(hPaginaOcuKaDC,hPrfiyBitaap2)jDBlBteObjf ictíhPaginaOcultaíiDeleteDC(hPaginaGcultaDC);SelectObJBct[hHapaDCJhPrsvBits3pi3;DeleteObject(hHapa);
D3lBtsDC(hHapaDC)i
ConstrCeldasO jX
void TPBnduloHindow!:WHRaÍDR(TMfi55age& HBSsagE
coordBnadaX=iÍBS&agB.LP.Lo;
if(6ra-ficVario5==TRUE),-Bturn;
135
if(GrafíEspacio== TRÜEJCoorEspaciüO;iflGrafiVeiocid- TRÜEiCGorVeiocidadUiif(6rafijngulo== TflUElCoorAnguioU;ifiGrafiDeriñng== TRÜ£)CoücVangularUiif(Grafic3rftv5D==TRÜ£)CcorVangYsftngí);if(GraficFi!Ens==TRÜEJCoordeFuerzaí);1
< / „.__ __________ _.„ __ _— __. ________ —_.,___
// código ds Í35 funciones utilizadas
void TPendulD'íJindoH; ;MoCalculo5(void)í
"Todavía no =B han hecho\n"
"Advertencia" ,MBJCOHSTOP í H B J K J j
^
voití T?BnduloÍM'indow; ; R B a I i{in t i , j j k , P r u e b a H ;in t H C S l ^ O j O j O ) ;int Flag[4]=ÍO,OiOJ0};
deltaT=tMax/1000i
i f ( (P i [0 ]==01 vU- í P i [ l ] = = o ) Jí
for( i=0; i<3; i44)
Í f { F l 3 Q [ Í 3 = = O J
íiííPr[i]==Pr[j]}
r
F!ag[J3=i i
136
PrusbaM=100tKCO]HOfH[i3*KC23i
5Hi tch[PruebahJi
C35B Oí
pi=Pr íG3ip2=Pr[!3;p3=Pr[23¡p4=Pr[3]¡CuatroPRDiferOjbreak ;
case ÍOO;pi=PrCO]¡
íif(Pr[lí3==PrCO]í
if(p2==0)p2=PrCk3jelssp3=Pr[k]j
DosPRDyDosPRlíiibreak;
case ÍO:p2=Pr[0};pí=Pr[13;
p3=Pr[33;elsep3=Pr[2]j'
DosPRDyDasPRIOibreak;
case í;pl=Pr[2Jjp2=Pr[0]¡
DosPRDyDosPRK);break j
case 200;pl=Pr[03;
if(Prífc3==Pr[0])k=kjel sep2=Pr[k]¡
CO
--
—i
O
I—
II O
_ 01
ai
u 11
iri
tu1(
1
—i
C-l
O
V
-ra
a
. m
. en -a
ra
o.
ex
r-i
o-
o
a_
a_
o_ a.
n n
il in
CX
C
L. d.
o_
a_
o_
o_u
u u
ii
íft
138
p2=Pr[2]jp3=Pi[13jDosPRiyünPCCoí);
pl=Pr[03;p2=Pr[I]sp3=?r[23jp4=Pi[!3;DasPRDyUnPCCof);
i f ( í f a b 5 ( P i [ 0 3 ) > 0 ) Jf& ( í ab5 (P i [ I3 )>0 ) )í
if( (Pr[0]==Pr[23) ft& tPiCO]==Pi[13) íípí=Pr[03;p2=Pi[03;DosPCCIgualesf);
ift (fab5(Pr[03-Pr[2])>G) ¡ (íabsíPi[0]-Pi[13)>OJí
pí=Pr[03;p2=Pi[0]¡
p4=Pi[13;DosPCCDistintííj
CalculosHech=TRÜEi}
void TPenduloHindoí í : ¡ e s t ado l íva id ){//para el espacieb£3]=-eo?g*k2/(LpíKJ - vot(g+k3/MJ/Lp - (fijiík«g/Lp í fid_otk3)/M¡bE23a-eoííg+k3/HJ/Lp - voífc4/(LpíH) - ííbCi3=eoí(k2-k4/Lpí/K+voib[03=eo;
void TPenduloHindQw: ;Estado2(void){/ /para t a velocidadb E 3 ] = B o í k l í g / ( L p í l i ) i
Í f i _ o í k 4 t g / L p f f i d _ o t k 3 ) / « ) ;
139*
b[i3=-(eoíki * voík4/Lp i f i j j f k S * í id_DÍk4) /H;
void TPenduloHindos: ¡estadoStvoidií// para e! ángu lo£3[33=(vom/Lp + f id j3 Ík í í /H ;b[23=UeQÍU * VQU2) /Lp + fi_oíki t Íidjjík2}/Hib[i]=ü_oíík2-k4/Lp]/h-f- í id_o;
void T{// para la derivada del ángulob[3]= fijjtkltg/ÍLpíHijb[23=íívoiki r fi_oígík2)/Lp + íid_oíki)/H;b [ í ) = í e o í k H - v o t k 2 ) / Í L p í H )b[0]=fid_o;
void TPendu lo t í indüH; :Haxiao5(vo idJ{
Te5p=fab5(es[ies]J;if (f iaxEspUespí11axE5p=TB5p; / / obtener el naxi io v a l o r del espacio
Tdesp=fab5[ss_d[ ie5]) jif ( H a x D e s p < T d e s p )1llaxDesp=Tdesp; // obtener el aiaxiso valor de l a velocidad
Tang=íabs(anües3)jií (íÍ3xñng<Tang)Hsxñng=Tang; / / obtener el eaxiao v a l o r del á n g u l o
T d a n g = f a b s ( a n j l C Í B s 3 J jií (HaxDang<Tdang)HaxDang=Tdang; // obtener el maxiíso valor de la vel angular
Tfue=fabs(fue[ies])jH íHa)!Fue<Tfue}HaxFue=ífuej // obtener el naxiao valor de la fuerza
)
l!\\n para realizar polos reales diferentes9
void TPenduloHindoí*; :Cuat roPRDiíer (void ííHDC hDC; /í gestor del contexto de visuslización í/HBRUSH hBrDchaCele, hPrsvBrochai; // brocha para 1a barraHBRÜSH hBrochaAzulj hPrevBrocha2; // brocha para la barraKPEN hCeles, hPrevij // pluaa para la barraHPEN hAzul, hPrev2; // piusa para la barra
•float porcentj
140
BQQL SiBarra= FALSE;char stringo[10],ístrptrQ;double aOjal ,a2,a3, t j
doubla aJijbMfijCMfi,d_fi,a_dfjbjíjcjf,d_df;int j=0j n=0, centraüj centraY, x iz^ j xder, yarr, ybaj, longitud;
hDC= BetOC(HHindo»)i l\r el contexto ds visualhación í/SetCapturBíHUindow); ft bloqUBO del ratón í/hPrevCur5or= SetCursorthHourGlaEs) j /? caabiar al cursor de espera í/centra)¡=anchoV6ntx/2-4tBicsntraY=3ltoVenty/3;
Í1(anchol/Bntx>=í50 kk altoVsnty>=i50)
CSiBarra=TRUE;TextOutlhDCjCentra^CBntraY, "esperar" ,7);
hfirochaCele=CrBatBSoIidBrush(R6B(0, 127,255)) ¡hCBlB5=CreatBPfiníPSJOL3DJiJR6B(0JI27J255});hPrsvBrochai=(HBRUSH)SBlfictObJBct(hDC,hBrochaCele)ihPrBví^HPENJSelectObjectíhDCjhCEles);
xizq=anchQVentx/4;
yarr=2UUoVfinfcy/3-10jybaj=2taltoVenty/3+lQi
TextQut(hDCJ(anchQVBnh/2íJyarr-17J"Or,2) iTBxiQutíf)DCJxder-i5Iysrr- i7J"IOOrJ4Jj
SelectQbJBrtíhOCjhPrevBrochai);DBÍBiBÜbjectíhBrGchaCeleJ;'
DslBteQbject(nCsles}j
// los p deben ser nsgativos
aO=pUp2tp3íp4¡
k2=-LpíMíai/g;
k3=-LpíH*ÍLpt30/g-í-g/Lp*a2Í¡k4=-LpíHMLptal/g+a3)i
ac[0][0]=ijac[03C13=liac[0]C23=l¡
a,
'o.
-ti u >e C
*Ji_
j
ce — 1>
-+,
II 11
>e
>e
co
•— -
ir" ir
J
c —». ti
!f< "O ' —
'
CO
lO
Ul
r~f
O
d.
c
oB
J -t".
n
• —t-í" ~~"
- DJ
— 1
BJ
*~ '
0- '-, M
>£
">J
1 1
n
cr
l_^
1*-
- i-.
ii
U>c
a<
f-O
t—i —
i i_
j
n^ l_^ ^—
-U •O 1 —
1
co t_-
rn n cu Q
m
^-U
l *^
UJ -d
O-
cuo -i
'>•)
nj
, —
.—
ru
is,
'o.
m u s< OJ
i — i
n
O-
B
'«, 'a
. 'c
ID
id
rII
11>e
>í
a
I-J
t—
í
" ^T
T1 Í
U!
f-1"
"Orn
cu
a<
u
ri
a-
-i'm
'»
'«
, '«
ii
n
a.
-i
-i
-i
nn
ri
nn
nn
nr
in
nr
i
n
u
u
uII
II
II
II
t_
i—.
i—,
ij
.rf.
"CJ
"O
"O
~O
1 —
(_
„(-_
"O
"O
"O
•es
-13
inO
-l
Ui-
J=-
142
hBrachañzul=CrB3taSGÍidBru5hfRSB{OíOJ129j};hAzuI=CreatBP8níPSJOLIDJl IRGB(0J0Jí29)JihPrevBrocha2=(HfiRUSH)SelectObjecfcthDCJhBrochaAzul)ihPrsv2=(HPEH)SelsctObjPct(hDC}hAzul);
* b_estexp( p2í t)-í- c_eslexp(p3U) + d_ssÍBXp(p4í t ) ¡
esJ[ÍBs3=ajBl:fixp(plU) + b_deíexp( p2ít )+ d_da fBxp {p4 í t } }
i cjiíexp(p3ít) + dJiÍEXpíp4ít);an_d[is5j=a_df?BXp(piH) + bJfíexp(p2H)
-f- cJffBXp(p3U) * dJf ÍBXpíp4t tJ i
// barra de porcBntaJEi1(SiBarra~TRUE)
j = 0 j // contador 100n=n+ljporcBnt=anchoVBntxt(0.25+0.05tn)j
5trptro=itoa(ntiOj stringo, 10);i ongitud=5 trlanl siringo)}TpxtOut(hDC)£anchoyBntx/2-16) íyarr-17J u ' , 4 ) }TextQut(hQC)íanchQVBntx/2+3-8ÍÍongitud),yarr-17,5trptro, longitud] ;xizq=(int)porcBntj
SelBctQbject(hDC,hPrBvBrocha2);DBlBtBabJBct(hBrochaAzul);SBlBctObjfictíhDCIhPrfiv2];DBletsObjsctíhñzulj j
SalCursorlhPrsvCursor); /í restablecer el cursor por ds-fecto í/RaÍBasaCapturBÍ); l\r eí ratón í/
TaxtQutíhBCjrentra^csntrsY, ' " ,14)5TEXtOut íhOCjCsntraXHOjCBntraY/L lSTÜ' jSJ iHassageBsepíO);RsleaseDC(HHindow,hDC)i /í libarar E! contexto de visualización í/
143
// Dos polos Reales iguales y los otros dos diferentesvoid TPenduloMindowíiDosPRDyBQsPRKvQid)
HDC hDC; /? gestor del contexto de visualización IIH8RUSH hBrochaCele, hPrBvBrocnai; // brocha para la barraHBRUSH hBrochaAzul, hPrsvBrocha2¡ // brocha para la barraHPEN hueles, hPrevI; // píusia para la barraKPEH hftzul, hPrsv2j // pluisa para la barra
íloat porcsnt;BOOL SiBarra= FALSE;char stringoüOjjístrptrojdouble 30,31,32,33,1;daab 1 e a_es, o_es, C_BS , d_es, a_de, b_de, c_de ¡ d Je jdouble a_í i,b_í i jc_í i ,d_f i,a Jf, b_df, c_df,d_dí;int j=0, n=0, centraX, centraY, xizq, xdsr, yarr, ybaj, longitud;
h0C= G e t D C ( H H i n d o v í J j tt establecer el contexto ds visualización í/SstCapturstHHindow); /í bloqueo dsl ratón í/hPrevCur=or= SetCursoríhHourSíass); / í caabiar al cursor de espera i/csntraj£=anchQl í íentx/2-4íSjcen t r aY=a l toVen ty /3 i
iftanchoVsntx)=150 && altoVenty>=i50]/
Si6arra=TííUEjTextOutíhDC, centrad jCentraY, "esperar", 7);
hCe lES=Crea t eP8n íPS_SOUD, i l RBB(0 J i 27 l 255J J ¡h P r e Y B r o c h a l = ( H B R U S H ) S e l e c t O b J B c t { h D C , h B r Q c h a C e l e ) ;h P r = v i = í H P E N 1 ) S E l e c t O b j e c t í h D C , h C e l B s 3 ;
x Í2q=anchoVsn tx /4 ;íder : :anchoVBntxí3/4)y3r r=2ta l tQVanty /3- iO¡ybaj=2íaltoVenty/3+10j
TextOutíhDCJ(anchoVentx/2)Jyarr-i7J uOr
Selec tObJ3ct (hDC,hPrev8rochal ) ;OeleisObJBctínSrochaCele);S e l e c t O b j e c t ( h D C , h P r B V Í ) ;D e l e t e Q b j e c t í h C e i e s j j
aO=piípiíp2tp3;ai=-plíplííp2-f-p3í-2tplíp2íp3;
«tj
cu
co
ro
—.
o.
n
—*,
—
u '-+.
*—*,
ui
ro
ro
m
ru
mII
n
cu -i
i—
-O
n
ui
ui
ui
*••>.
DJ
airo
10
iu
ro
tn
ti
u
n
o-
Ul
"O
"O
KJ
—
t~
* 1—
-O
i—
u—
-o
^~~
€^i
Í2-
o
<I>
f*rl
h-O
I—
C
>
CnJ
t-O
Í I
CN
II
II
II
U
II
II
II
II
K3
I—
O
- »J
1-0
II
II
II
II
II1
l—
I NJ
-t-
TD •>
•(
t~ <Íi
I—
.—-
.—
oj
oír~
i—
••—
•=>
T3
"O
•— --,
145
HaxE5p=Q,0; // inicializar a csro para que no se hagaMaxDesp=O.QjHaxAng=Q.Q¡ // tose costo siaxism sí valor anteriorr1axOang=0.0; // y no 58 escalan bisn los gráficosMniiCiis-fl ("| .MQAI UE-V • V J
95x1=1000; // hallar aaxino valor d» simulación
n8rochdñzui=Cr23t£SQÍidBriishífiGB(0J0)í29))jhñzul=CrsatePentPSJOL!DJiJR6B(0,Oíi29))iíiPravBrocha2=íHBRÜ£H)SslsctObJ2ct(hOCJhBrDrhaAzul);hPrev2=(KPENÍS3lectObJBct(hDC,hAzul)i
foríiBS=0¡ie5<=999¡ies*+í
+ c_esíexp(p2ít) -i- d_S5_d[is5]=ía_de + b_deít)ÍBXp(pnt)
* cJs¡sxp(p2U) + dJsÍBXp(p3H);anCi=5]=(a_fi + bJiít)texp(piH)
t c_fiíexp(p2U) i d_fi ísxp(p3ít);anJ[ÍBs]=(aJf -t bjíttjíespípiít)
i c_dTÍsxpíp2U) -f- djfíexp(p3ít);"
// barra ds porcBntajsifíSiBarra==TRÜE)
íj=0¡ // contador ÍOOn=n^i¡porcent=anchoVBntxU0.25+0,05ín)iRsctangleíhDCjXizqjyarrjíintJporcentjybaj);strptro=itoa(ntiO, siringo, 10);longitud=5trlBnístringoí;TextOutthDCjtanchoVBntx/Z-UIjyarr-iy," a,4J¡TextOut(hDCJ(anchoVBntx/2+8-8Hongitud)íyarr-17J5trptroJ longitud )jxizq=£intJporcBntj
SBlectObJBctíhDC,hPrsvBrocha2)¡DalEtsQbJ3ct(h3rochañzul)jSelBctOfajsciíhDCJhPrfiv2)iDslBteObjsctíhfizull i
DBiCursoríhPrevCursorí j /í rastabiecBr si cursor por defecto í/ííslasseCaptureO; /í desbloquear si ratón í/
ai
ja.
CU
d-
n
o-
cu
1:0
nj
~-.
li
li
>-.
ui
--,
-ti
—
*.
—1.
—
*.
Ul
i-*-
p—•
»-••
i— -
i— •
rn
a,
-ou
u
u
u
n
o.
oí
o.
n
o-
li
li
o.
o.
o.
ra
ra
ro
ro
mu
n
o-
-ix
C
O
tu
I -
I I
ra
u)
ru
IDu
it
u
il
i—
o-
o
--
—
o
o
n n n
ut
ai
O)
DJ
tw
OJn
n
n
n
ri n
II
11
II
II
II
II
ni
ru
UL>
cun
n
n
n
II
U
II
II
Jí-
O
'J
I-O
t—
II
U
II
IIl
il
ir~
r~
i—
i—
-o
-o
-o
nnZK
rz
; ra
: za
r
W
DJ
O>
DJ
••.'J
K
3
"—
•=>
II II
II
II
148
bjH=x(l ] jc j f=x[23jd_df=x[3];
HaxEsp=0,Oj // inicializar a cero para qus no =e hagaHaxD2Sp=G,0;H£üAng=0,Q; // tose coso (saxiso el valor anteriorHaxDang=0.0; // y no se sscaíen bisn los gráficasHaxFue=0,Oiítaxí=1000¡ // h a l l a r ffiaximo valor de sismlacion
h ñ i u l = C r e a t E P e r í ( P S _ S O L I D í l J R G B í O J 0 ) 1 2 9 ! ) ;h P r 2 v B r o c h a 2 = ( H B R U S H J S e l s c t O b j B c t ( h D C I h B r o c h a f t z u l ] jh P r B v 2 = : H P E N Í S e l e c t O b j e c t í h D C , h ñ z u l ) ;
íoríie5=Q;iss<=999;iss-H-)
=la^B5 + t i íb_es f t í c_e5 /2 J í í exp{pHt )
esJEÍB5]=(a_de + t í tbje * t t c je /2}} íexp(p l t t )+ d _ d E Í B X p ( p 2 í t ) ;
an[ÍB5]=(aJi + t t (b_ i i + t í c j i / 2 ) ) í e x p ( p l í t )f dJ i í sxp(p2U) ;
anJCÍB5]=(a_df * t í (bjf + t í c _ d í / 2 ) ) Í 6 X p í p l í t )i- d _ d í Í B X p ( p 2 U ) i
t=t*delta.T¡
// barra de porcentaJBi1ÍBiBarra==TRUE]{3=3+1;if(j==100]íj = 0 j // contador 100n=n-f-l jporcent=anchoVentxí (0 . 25+0. 0 5 í n í jR B c t a n g l e ( h O C j X i i q , y a r r } í i n t ] p o r c e n t j y b a j í ;s t rp t ro= i toa (nnO J s t r i ngo j 10);iong i tud=s t r l en(5 t r ingo j jTextOi í t (hDC i íanchoyentx /2-16í J yar r -17 J ! l ' , 4 ) ;Tsx tOut (hOCj(ancnQVBntx /2 i8-8 í longitud J j y a r r - l J j S t r p t r O j l o n g i t u d ) ;x i z q = ( i n t ) p o r c B n t ;
SelsctObJBctíhDCíhPrevBroch32) ;DsleteQbjectíhBrochaAzulí;
149
SelectGbject(bOC,hPrev2);DelfiteübjectfhflzuDí
SetCursoríhPreYCursor); /t restablecer el cursor por defecto í/BeleaseCaptureOi /i desbloquear el ratón í/
TextOut(hDC,cen traX(centraY¡B ", 14) jTBxtOutíhOCjcantraX+IOjCentraY/LISTQ'^JiMessageBeep(0)jReleaseDC(HHindoWjhDC); /( liberar el conisxto de visualización t/
void TPenduJQfeíindoví; iCuatroPRIgusl {YDÍ
{
HDC hOCj /í gestor del contexto de visualizado!! íHBRUSH hBrochaCeís, hPrevBrochai; // brocha para la barraHBRUSH hBrochaAzulj hPrevBrocha2; // brocha para la barraHPEN hCsleSj hPravij // piusa para la barraHPEN bAzul, hPrev2; // pluisa para la barra
float porcent;BOQL SiBarra= FñLBE;char 5tringo[iO]jÍ5trptrojdouble aOjai,a2,a3,t;doubls a_es,b_esJc_e5,d_BSJa_deíb_deícjleJdjlB;doubíe 3_íijbji,c_fijd_fija_dfjb_df,c_df,d_ofjint j=0, n=0, centraX, centraY, xizq, xdsr, yarr, ybaj, longitud}
hDC= 6etDC(HHindQB)i /í Bstablecer el contexto de visualización t/SetCapturelHrlindoK}; /í bloqueo del ratón t/h,PrevCursor= SetCursoríhHourSlassíi /i casbiar al cursor de espera t/centraX=anchoyentx/2"4í8;centraY=3ltoyenty/3;ifísnchoVentxMSO Si altoVanty)=i50){SiBarra=TRUE¡TEXtOutíhDCjCentra.^cEntraYj" esperar",/);
ñBrochaCele=CreateSolidBrush(R6B(0Ji27J255Í3;hCele5=Cre3tePeníPS_SOLIDJiIí?S8(0J}27J255));hPrevBrocha^tHBRUSHJSelectGbJEctíhOCjhBrochaCsls);hPrev^tHPEfíjSelectObjectíhDCjhCEles);
xizq=anchoVentx/4;xder=anchoVentxí3/4;yarr=2íaltoVsnty/3-IO¡ybaj=2íaltoVenty/3+10i
TextOut(hDCIxizq)yarr-i7}"Orí2J;TB«tOut(hDCJ(anchoVsntx/2íJyarr-i7,HOrJ2í;
SelfictObjfictíhDC, hPrevBrochai í jDeleteObjectífiBrochaCBleíj
*»•;'
i—
-o
n_
.
ODJ
>>J
Oí
a,
d.
a,
o.
ui
.-*•
m
m
ro
IB
rn
cu[l
ii 11
u ri
a.
o-
n
trr
oí
co
ru
-—
li
li
i—
m
-•»
10
ro
ro
ru
ui
rr
^p
ui
ui
ui
ui
m
tu
PJil
11
11
it
n
ex.
-i
OJ
QJ
EU
tt
i U
Jn
n n n n
-• -• —
•—
o
i—
i -a
n n n
i—•
i—
-C>
C>
JO
(~
- O
»4
r-
J
l— O
tl
M
hJ
I—
[1
II M
II
II
It
II II
II
II>
J O
«O
H—
I
-O
-O
-C?
tu
UJ
UJ
DJ
I C
r-
I -O
-o
i— -
o
UJ
•-•
ai o
151
c_fi=xE2]¡d_fi=x[3];
// para la derivada del ánguloestada4f}jSisEcuacionesí);ají=x[0]¡b_dí=x[i};c_df=x[23¡
ítaxEsp=0.0; // inicializar a caro para que no se hagaHaxDesp=0.0;í!axAng=Q.O; // tose COÍSQ aaxiso e! valor anteriorMaxDang=0.0; // y no se escalen bien los gráficosr1axFue=0,0;Haxl=1000¡ // hallar (Baxiao vaior de sismladon
hBrochafizul=CreatsSoIid8rush(RBB(0, 0,129) l jhAzubCreatePeníPSJOLID, 1^68(0,0,12911 jhPrfivBrocha2=tHBRÜSHlSelectObject(hDCíhBrochaAzull j
hPrev2={HPEN)SelBctObJEctíhDCIhA2uU;
foríis5=0jie5<=999;iss-ff]
e5[ÍBS] = (3_S5 "f- t í (b_65
+ tMc_es/2 + tídB5_d[ies3=(aje + tííbje
i- t?(*c_de/2 + t td_de/é) ) ) íexp(p i í t ) jan[ies]=(aji + títbji
+ ttícJi/2 ^ t¥d_f i /6)) ) t8xpíp l í t ) ;anJCÍBs3=(a_df + tí(b_df
+ t* (c_df /2 + t td j f /ó)))?expípl í t )¡íue[ÍB5]=-(kUBs[ies]-H;2ÍBS_d[ie5]H3tanCies]-Ki4íanJ[ies]í;
t=t+deltaTj
// barra de porcentajBii(5iBarra==TRUEí
if(j==1001íj=0j // contador ÍOOn=n-f-i;porcEnt=anchoyentxí(0,25+0.05tn);RsctangleíhDCjXizqjyarrj (intjporcentjybajj j5trptro=itoa(nílO, siringo, 10);longitud=5trlBn(5trlngoJiTe>!tOut[hDCí(anchoysntx/2-i¿)J)'arr-17J11 a , 4 ) jTsxtCut(hDC,(anchoyBntx/2+8-8ílongitud)Jyarr-17;5trptroJ longitud);
SElectflbject(hDC,hPrevSrocha2)¡DeJBÍBGbjectlhBrüchaftzuDjSeiectGbjsct(hDC,hPrev2);DsletEÜbjectíhAsul);
SetCursoríhPrBvCursor); /í restablecer el cursor por dsfscto t/RslBassCapturEf}; /i dEsbloqusar si ratón í/
TBxtOutíbDCjCentraXjCentraY,1 "^íiTsxtOutíhDCjCsntraUiOjCBntraY, "LISTO" j5);MessageBeepfO);
/í libsrar E! contBxto de visuaíiíación t/
void TPenduloSindoHüDQBPRIyDosPRHvbidJ{HDC hDCj /í gBstor del contexto dB visualización t/H8RÜSH hBrochaCBlB, hPrEvBrochaij // brocha para la barraHBRÜSH hBrochaAzulj hPrevBrocha2¡ // brocha para la barraHPEN hCslBSj hPrevij // pluaa para la barraHPEN hAzulj hPrEv2; // pluaa para la barra
íloat porcsnt;BOOL 5iBarra= FALSE;char 5tringoEiO]fístrptro¡dQUblB 30,31,32,33,1]
doubls a_E5,b_B5Jc_esJd_E5,ajiejb_dEjC_dB,d_dE;double a-íijb_fijc>_fi,d_fi,3_di ,b_df ,cjif ,djJí¡int j=0j n=0j centraX, csntraYj xizq, xdsr, yarr, ybaj, longitud}
hDC= 6etDC(HHindoH)¡ /í Bstablecsr el contsxto de visualización í/SBtCapturBÍHHindoH)) ' /I bloqueo ds! ratón í/hPrevCursor= SetCursor(hHour61ass); /í castbiar al cursor dB espera i/CBntraX=anchoVentx/2-4tS;centraY=altoVenty/3;if[anchoVentx>=i5G && altoVenty>=150J/
SiBarra=TRUE;TextQutfhDC,centra*,centraY,"esperar",7)j
hBrochaCele=CreatBSolidBrush(R6B(0,127,255))jhC3le5=CreateP6n(PS_SOLIOJl,R6B(0J127J255)hhPrevBrochal=(HBRUSHJSelectObjectíhDC,hBrQchaCBle]¡hPrBVl=(HPENJSfilectObJBct(hDC,hCeles)i
xizq=anchoVEntx/4jxder=anchoVBntx?3/4;yarr=2taltüVenty/3-iO;ybaj=2talfcoVBnty/3+10j
-153
Rec tangís
ÍBxtOut (hDC 3 (anchoyen tx /2 ! J ya r r - i7 /0 / : ' 1 J 2 ] ;Tsx tGut (hDC J xder - í5 J ya r r - i7 ! H iOO) : • ' ,<!} j
S B U c t Q b j e c t t h O C j h P r s v B r Q c h a i ) ;De í s i sObJBc t (hSrochaCBÍe ) ;S e l e c t O b J E c t i h D C j h P r e v i J iD e l e t e O b j B c t i h C e l e s J j
// los p deben ser negativos
aQ=pUpltp2íp2¡a i = ~ 2 í p i í ( p 2 í p 2 + p U p 2 ) ;
ki=-Lpt«íaO/g;
ac[0][0]=l;ac[0][13=0¡ac[0][2]=ija c C O ] C 3 ] = O j
3CÜ3ÜH;ac[i][23=-2tpi-p2;
•ac[i][3]=í;ac[2][0]=p2í(p2+2ípi);3c[2][Í]=-2íp2;acE2J[2]=pi !{p i+2tp2) ¡ac[2J[3]=-2tpi;ac[3][0]=-plíp2lp2;3C[3]Ei]=p2tp2;3c[3][2]=-pitpiíp2;3c[3][3]=pltpij
/ /para el espaciaestadolOiSÍ5EcuacionBs( J ;a_es=x[03;
d_BS=x[3];
/ / pa ra la VEloc idadfi3tado2()jSisEcuacionesOjajE=x[0]j
155
j=0j // contador 100n=nU;porcent=anchoVentxí(0.25*0.05ín);RectangleíhDCJxÍ2qJyarrJ(int)porcent,ybaj)i5trptro=itoa{nUOj siringo, 10);longitud=s trien (siringo);
TBXtQut(hOC,EanchoVBntx/2i-8-8ílongitijd)Jyarr-17J5trptrOj longitud);xizq=(intjporcentj
3electGbJEcUhDC,hPrevBrDcha2);DeleteObjectí hBrochaAzul);SelectGbjectíhDC,hPrev2);DelsteQbjsctíhAzui);
SBtCursor(hPrevCur5or); /í restablecer el cursor por defecto \ReleaseCaptureUj /í desbloquear el ratón t/
TextQutfhDCjCentraXjCentraY,' ",14);TextOutíhDCIcentr3.UIOJcentraY(HLiSTOB,5)jMessageBeeplOJjReleassDCÍHWíndoWjhDC); /í liberar el contexto de visuaiización t/
void TPenduloWindoH: ¡DasPRIyUnPCCo(void)(HDC hOC; /í gestar de! contexto de visuaüración i/HBRUSH hBrochaCslej hPrevBrochai; // brocha para la barraHBRUSH hBrochaAzul, hPrevBrocha2j // brocha para la barraHPEN hCeleSj hPrevl; // pluna para la barraHPEN hñzul, hPrev2; // pluaa para la barra
float porcent;SOOL SiBarra= FñLSE;char stringoCiOljtstrptro;doublB aO}al,a2,a3jt;double a_es,b_es,c_B5íd_fiSJa_de,b_dBJc_dp)d_de;double ajijbjijcjijdjijajfjbjdf jC_df ,d_df;int j=0, n=0, centraX, centraY, xizq, xder, yarr, ybaj, longitud;
hDC= SetDC(HHindQw); /í establecer el contexto de visualizadón (/SetCaptureíKHindowíj /í bloqueo del ratón í/hPrevCursor= SetCursoríhHourBlass); /í cafsbiar al cursor dB Bspera í/CBntraX=anchoVsntx/2-4í8;centraY=altüVenty/3iif(anchoVBntx>=150 *t altoVenty>=150)íSiBarra=TRUE;TBxtOut{hDCJcentraj(ícBntraYj"B5pBrar!'j7);
herQchaGBlE=CrBataSolidBrush(RSBÍOJ127}255)íjhCeÍ65=CrBatBPeníPSJGLIDJl)R6B(0!127J255));
«r.
cr
iw1
I
i—
•=>
r»
—
•—
o
iii
cu
cu
uj
ni
in
n n
n
n
II
II
II
II
H
|| u
U
II
II-
-O
| t—
NJ
f-
O
C-J
N
J
QJ
QJ
JJj
<=•
<=•
o
•=>
<>j
r-o
i—
•o
— -
—
- w
. ._
.
.TS-
:re
- 3-r
a-
t--*
- O
-J
KJ
1—II
II
II
[]II
II
II
U
CI
CTJ
C
3
LD
(O
IH
lU
(D
ro
ra
ID
IDil
n
n
n
-U
i>J
—-
PJ
^-
—=3
1-J
>e
n ja
t-
.Z
J-
—
t-J
O
•*<
J3
•<:
oj f
ID -i
*-;
n -i
cu
i-*-
l -i
>e
t— -i
^~.
~~j -
hJ -
S
<•
u
Q,
—
CD
rD
f-O
O
J C
U
o
o
-e:
•<:
ül
Oi
157
cj!s=x[2]¡dj?s=x[33;
//para la velocidad
estado2[)}
SisEcuacionesOj
bje=x[13;c_de=x[2j;
d_de=x[33;
// para el ángulo
25Íado3{) ;SisEcuadonest);aJi=xEO];b_fi=x[I3;cji=x[2]¡dJi=xE31;
// para la derivada del ángulo
estado4();SisEcuacionesO;ají=x[0]jb_df=x [ I3 ic_df=x[23;dj f=x[3] j
MaxEsp=O.Oj // inicializar a cero para que no se haga
Maxñng=0,0¡ // tose coso saxiao el valor anteriorHaxD3ng=0,0; // y no =e escalen bien los gráficosHaxFue=0.0;Haxl=1000¡ // hallar saxifao valor de sisulacion
hBrochañiui=CrsateSoIidBriish(R6BÍOJ0JI2?));hAzul=CreatePen(PS_SOLlD, i ,RGBÍOJ0J i29)í ihPrev8rocha2={HBRÜSH}SelectQbject(hDC!hBrochafizul)jhPrev2={HPEN)Selectübject(hDCJhñzul);
a_es + b_est t ) íexp(pi t t ) + (c_esícos(p3ít)+ d_e5Í5Íníp3U)]íexp(p2ít);
e5_d[ies3=ía_de t b_oeít}fexp(pi i t) -i- {cjeícos(p3tt)-f d_deís in(p3t t ) ) íexp(p2í t ) ;
anEÍB53s(aJi t bJiít)ÍExp(piUí * (cJiícosIpStt)-í- djií5in(p3lt]]?exp(p2tt)i
an_dües3=ía_df t b_df í i ) fexp(p i t t ) + (cjfkosípoít)-í- d j7ts in£p3í t ) ) íexp(p2í t ) j''
t=t-f-dBlíaT;
158
H a x i f l r o s [ ) j
/ / barra dB p o r c a n f c a J Bi f{SiBar ra==TRUE)
j=0; // contador 100n=n+i;porcenbanchoVentx i iO .25m.05 in ] ;R e c t a n g l a í h D C j X i z q j y a r r j í i n t J p o r c e n t j y b a j ] ;s t rp t ro=i toa{nUQ } stringo, Í 0 ) jl o n g i t u d = s t r l B n { = t r i n g o ) jT e x t Q ü t ( h D C J í a n c h D V 2 n t x / 2 - i ¿ ) 3 y a r r - 1 7 J " " , 4 ) ;TextOut(hDC,íanchoVBntJ!/2í8-8í longitud | jyarr-iyjStrptro, longi tud);x i zq=( in t )po rcen t ;
SelectObJEct(hDC,hPrevBrocha2)jDeleteGbJBctíhBrochaAzul};SeiectQbject{hDCjhPrev2);DBlEteGbjectíhñzul);
SetCursoríhPrsvCursorlj /í restablBcer e! cursor por defecto \RslBaseCapturBÍ); /? desbloqUBar el ratón í/
ÍEXtQutíhDCjCentraX+iQjCsntraY/USTQVM;
/i liberar el contexto de visualización Í7
void T P e n d u l o N i n d o w ü D o s P R D y U n P C C o í v o i d J{
HDC hDCj /( gestor 'del contexto de yisualización í/HBRUSH hBrochaCBlgj hPrevBrochal; // brocha para la barraH8RUSH hBrochañzul, hPrevBrocha2j // brocha para la barraHPEN hCeles, hPrevi; // pluma para la barraHPEN hAzul, hPrev2; // pluma para la barra
iloat porcent;BOOL SiBarra= FñlSE;char stringoCKOjfstrptro;double 30,31,32,33^;double a_as í b_es j c_es j d_e5 j a j le j b_de j c j le j d_dejdouble a_ í i J b_ f i ,C M f i J d_ f i J a_df ,b_df , c_d í } d M d í ;int j=0j n=0, centraX, centraY, xiiq, xder, yarr, ybaj, longitud;
hDC= 6etDC(HHindoiíJ; /í establecer el contexto de visualiíadón t/SetCaptureíHkindoH); /t bloqueo del ratón UhPrBvCursor= SetCursoríhKourSlassJj /I cambiar al cursor de espera í/centraX=3nchoVentx/2-4t8¡
159
centraY=altoVenty/3|if(anchoVentx>=150 filt altoVenty>=15.0)íSiBarra=TRÜEjTextQut(hDC, centra* ¡centraY, "esperar", 7) ;
hCeles^CreatePeníPSJQLlDjí 68(0,127, 255)];hPrevBrochai^HBRUSHJSeiEctGbjectíhDCjhBrochaCele);hPrevHHPENJSelectÜbjectíhQCjhCeles);
xirq=anchoVentx/4;xder=anchoVentxf3/4;yarr=2íaltoVenty/3-iOjybaj=2íaltoVenty/3HO;
T e x t Q u t [ h D C J í a n c h o V e n t x / 2 } , y a r r - i 7 / f l O r , 2 ) ;T e x t Q u t í h D C í x d e M 5 ) y a r r - i 7 ) i I O O r í 4 ) ;
SelectObjectthDCjhPrevBrochaiJiOeleteObjectíhBrochaCele);SBlBctObject(hDC,hPrBVÍ);DeleteQbject(hCeles)j
// los p deben ser negativos
aO=piip2í(p.3íp3+p4*p4);ai=-2ípiíp2íp3-íp3tp3+p4tp4)í(pitp2
a3=-(pi-tp2+2tp3};
ki=-LpíhtaO/g;
k3=-Lp»HI(LptaO/g+g/Lp+a2Jik4=-LplHI(Lp»ai/g+a3}¡
ac[0]CO]=i;ac[03ClMi
ac[03C3]=0;ac[i][0]=-p2-2íp3;3c[l][i]=-pi-2íp3;ac[13C2]=-pi-p2-p3iac[13[3]=p4;ac[2][03=2íp2íp3+p3tp3+p4tp4;ac[23[i3=2ípiíp3-f-p3íp3ip4íp4;acE2][2]=piíp2+pÍíp3-frp2íp3;ac[23[3]=-pi-p2j
160
ac[33[23=-pltp2tp3;ac[3]m=plíp2tp4;
//para el espacioestadoií);SisEcuacionesO;
a_es=x[03jb_es=xü3;c_es=xC23id_es=x[33;
/ /para la velocidadestsdo2();SisEcuacionesO;a_de=s[0];
bJe=x[Í3;c_de=x[2] j
djÍ2=x[33}
// para el ánguloestado3U;SisEcuaciones[)j
aji=x[0]i
c_fi=s[23idji=x[33j
// para la derivada del ángulo
estadoMJjSisEcuacionesOj
cjf=x[23¡
t--0
HaxEsp=0.0; // inicializar a cero para que no se hagaHaxDesp=Q.Q;MaxAng=0.0; // toie CDÍJO ataxiao el valor anteriorHaxDang=0.0¡ // y no se escalen bien los gráficosHaxFue=0,0;Haxí=iOOO; // hallar aaxiío valor de siaulacion
hBrochañiul=CreateSolid8rU5híRSB{OjO(i29)} jhAzul=CreatePen(PSJOLlD,l lRBB(0J0,í29))ihPrevBrocha2=(H8RÜSH)SeísctObject(hOCJh8rochaAzul);hPrBv2=(HPEN)SBlectObject(hDC,hft:ul) ;
for(iss=0jie5<=999;iesif)
í
es[ies3=a_e5ÍexpípUt) i b_esíexp(p2ít)+ (cj25tcos{p4ít) i dMe5Ísin(p4H))íexp(p3H);
esj[ie5]=a_detexp(piít) + bjeíexp(p2tt)
161
* (cJe*cos(p4U) * dJeísin(p4H)}íexpíp3H)jan[ies]=aJiisxpípiH} + bjiíexp(p2it)
t Ícjiíco5ip4ít) + d_fií=iníp4Umexp(p3H)jan_d[ies]=a_dílBXp(plÍt) * b_dftexp(p2Uí
+ (c_dttcos(p4ít) + dJÜ5Íníp4ít)} Í2Xp(p3tt) j
t=t+deltaTjílaxisosí);
// barra de porcentajeií(SiBarra==TRUE)íj-jtl;if(j"iOOJíj=0¡ // contador 100n=n+i;porcsnt=aíichoVBntxí(0,25+0.05ín);RsctanglBÍhOC,xÍLq,yarr , ( int)porcent,ybajJ istrptro=UDa(nflO, stringoj 10);longitud^strlEnlstringo);TBXtOut(hDCJ(anchoyentx/2- i¿)Jyarr- i7J M B } 4 J ;TextOut(hDC,(anchoVentx/2+8-8Uongitud)Jyarr-17í5trptro, longitud) jxizq=(int)porcent;
SfilBctObJEct(hDC,hPrevBrocha2íiDeleteObJECtíhBrochaAzuDjSBlectObjectíhDCjhPrevSJ;DsistsQbjEctfhñzul);
SeiCursorfhPrevCursor); /í rastablBcer el cursor por defecto t/ReleaseCaptureí); !\r el ratón í/
TEXtGutthDCjCBntraXjCEntraY,' V4);TextOutlhDCjCentraX+iOjCEntraY/LiSTO'jSJj
RelEaseDC(HHindoHjhDC); /í liberar B! contexto de visualización í/
void TPenduloWindow::DosPCCDistint(void){
HDC hDC; /í gestor del contexto de visualizaciónHBRUSH hBrochaCeíSj hPrevBrochaij // brocha para la barra
HBRUSH hBrochaAiul, hPrBvBrocha2; // brocha para la barra
HPEN hCslsBj hPrevl; // pluma para la barra
HPEN hAzu l j hPrev2; // pluna para la barra
float porcentj
BOOL SiBarra= FALSEj
char stringoCiOjjístrptro;
double a O j 3 Í j 3 2 , a 3 , t ;
162
double a_B5,b_es J c_es J d_Es I a_de ( b_de J c_de J d_deidoub l s a j i j b j i j c j i j d j i j a j f j b j j f j c j i f j d j f jin t j=0, ÍFQ, cfi í i t raX, cent raY, x i z q j x d e r j yarr , y b a j , l ong i tud ;
hOC= B e t D C I H H i n d o s l i l\r el contaxto da visualiíación t/SetCapture(Ht í indoK): /í b loqueo d e l ratón t /hPrBYCursor= Sa tCursor lhHourBlass ) ; /í caabiar al cursor de espara t/cen t raX=anchoVentx /2-4 íB;csntray=3UoVenty/3¡
i f ( a n c h D V e n t x > = i 5 0 f t& a l toVenty>=150}{SiBsrra=TRUE;TextQutfhDCjCBntraXjCentraY, "esperar" j7)j
hBrochaCelB=CraateSolidBrush(RBB(Oíi27J255J)¡hCBlB5=CraatePen(PS_SOL!DíiíñSBÍÓJi27J255));hPrsvBrochaíMHBRUSHJSelactQbjectthDCjhBrorhaCele);hPrBvi=íHPENíSelectObJBct(hDC,hCBle5Íi
xiiq=anchoVfintx/4¡
yarr=2íaHoVenty/3- iO;y b a j = 2 f a l t o V e n t y / 3 - f i O ;
R a c t a n g l 3 Í h D C , x Í 2 q , y a r r , x d a r j y b 3 J ) ;T B X t O u t ( h D C I x i z q J y a r r - 1 7 , " O X " J 2 ) i
Tex tOu t ihDC J xde r - i5 J ya r r " i7 I 1 1 iOOr í 4 ) ;
5e lec tObjec t (hDC,hPrev8roch5Í ) ;D e l e t e O b j e c t í h B r o c h a C e l e ) ;S e l E c t O b j e c t í h D C j h P r B Y l ) ;D B l e t E O b j e c t í h C e l s s ) }
// los p deben ser negativos
a Ü = ( p U p H p 2 t p 2 ) t ( p 3 í p 3 + p 4 J p 4 ) ;a l = - 2 t ( p U ( p 3 t p 3 i p 4 í p 4 } i p 3 M p i í p i + p 2 t p 2 ) ) j
Ri=-LpíHíaO/g;
3c[0j[0]=i;ac[0][i]=0jacfO][2]=ijac[0][3]=0;ac[l3[0]=-pi-2tp3;
164
hPrevBrocha2=(HBRUSHJSElectObjectíhDC,hBrochaftzul)jhPrev2=(HPEHJSElectObjectíhOClhftzul)j
B5[ies3=íaj is tcQs[p2t t í + b _ e 5 Í 5 Í n ( p 2 í t ) l í e x p ( p l H )+ (c_estcos(p4nj + d _ E s t B Í n ( p 4 i t ] } Í E X p { p 3 U ) ;
E5_d[ ÍE5j=[a j Je ÍcQs íp2 í tS + bJeUin{p2t t )HexplpUt)-i- (c_deícGs[p4Ui i d j s í s in (p4 í tn texp(p3 í t ) ;
an[ies3=íajiko5(p2tt) + b J i t s i n í p 2 U ) í > e x p í p i n }i (c_fi ícQ5(p4ít í + d_f i í s in (p4H)) texp(p3U) j
anJCÍBs3=taJ f t cos (p2UJ + b J í Í 5 Í n ( p 2 í t ) J t e x p ( p H t )+ ( c_df i ros [p4 i t ) 4 d J f t s i n ( p 4 H ) ) t e x p ( p 3 í t ) i
t= t+de l t aT ;
// barra ds porcantaJEif(SiBarra==TRUE)
íj=0; // contador 100n=n-fi;porcent=anchoVentxt (0.25+0. 05ín);
s t rp t ro=i toa(n t lO, siringo, 10);iongHud=s t r lEn(s t r ingo) ;TBÚOut (hDC J (anchoyEntx /2 - iM J ya r r -17 J 1 ' , 41 ; •TextQut(hDC,(anchol /sntx/2-í-8-8t longi tud ),yarr-17, strptro, longi tud };x i zq=( in t )po rcBn t ;
SE lec tObJEc t (hDC,hPrBV8rocha2 ) ;D e l E t B O b j e c t t h B r o c h a f t z u l l iS e l B c t O b J B c t ( h D C , h P r e v 2 J ¡D E l e t B O b J E c t f h f l z u l J ;
SEtCursor thPrevCursor ) ; /t res tablECEr E! cursor por defec to í/RslsaseCaptursO; ' l\r E! ratón í/
T E X t Q u t t h D C , centra*, c en t r aY , 1 " , 14 ) ;T e x t Q u t f h D C j C e n t r a X + i O j C a n t r a Y j ' L I S T Q 1 1 ^ ) ;f l s s s a g e B E E p í O ) ;R B . l E a s E D C ( H H i n d o H , h D C } ; /t l ibsrar E! contexto de v isua l izac ión t/
void TPenduloWindo»;¡DosPCCIgualesívoid)
165
HDC hDC; /í gestar dsí contexto de visualización í/HBRUSH hBrocháCeíe, hPrsvBrochaij // brocba para la barraHBRUSH hBrochaftzul, hPrevBrocha2¡ // brocha para la barraHPEN hCeles, liPrevij // plusia para la barraHPEN hAiul, HPrev2j // piusa para la barra
fioat porcent;BQQL SiBarrs= FALSEjchar stringo[10],ístrptro;double aO,al,a2,33,cjdouble a_B5,b-e5Jc_B5Jd_B5,a_dBJbjÍE,cjle,djIejdoubíe a-fi,b_fi,c_fi,d_fi,a_d-f,bjf,c_df jdjf;int j=0j n=0, centra)!, centraY, xizq, xder» yarr, ybaj, longitud;
hDC= SetDC(H^indow); /í sstablscer el contexto de visualización í/SetCapture(HWindow); /> bloqueo del ratón í/nPrevCursor= SstCursor(hHourSlass); /í casbiar al cursor de espera í/centraX=anchoVentx/2-4*8jCBnfcraY=altoVenty/3¡ií(anchoVentx>=150 && altoVenty>=150){SiBarra=TRUE¡Tex tOut (hDC,cen t ra ! ( j cen t r3Yj"espBra r 1 ' , 7 ! ;
hBrachaCs!e=CreateSolid8ru5h{fíBB(0Ji27,255)};hCBles=CrBatePeníPS_SOL10, 1^68(0,127,255)1;h P r B v 8 r o c h a l = ( H B R U S H í S e í e c t O b j e c t í h D C , h B r o c h a C e l e ) jhPrevlsíHPEHÍSelectObjectthDC^CelesJj
x i z q = a n c h o V s n t x / 4 jxdsr=anchoVent) ! Í3 /4 jya r r=2 ta l toVenty /3 - iOjybaj=2íaHoyenty/3+iO;
R B c t a n g l e í h D C , x izq , ya r r , xder , y b a j ) jTBxtOutíhDCjXizq/yarr-n/Or^);T e x t O u t í h D C , [ a n c h o V B n t x / 2 ) J y a r r - 1 7 , n O r j 2 ) ;
SelsctGbject(hDC,hPrevBroch3lljOeleteObject(hBrochaCele);3electübjBct(hDC,hPrevl)jDeleteObjectfhCelesJ;
// los p deben ser negativos
aO={pUpi+p2íp2)t(pltpi+p2íp2)ja l = H t p I Í ( p l í p i * p 2 t p Z ) }
k i = - L p t H í a O / g j
166
k2=-LpíHíal/gjk3=-LpíHt[LpíaO/g+g/Lp+a2);
ac[0][0]=i;acEQ3U3=-3tpi iac[0][2]=3tpUpi+p2tp2jac[03[3]=-p i*(p l*p í*p2íp2) iac[13E03=Ojac[l}[i3=p2;3c[13E23=-2tpiíp2¡a c [ 1 3 [ 3 3 = p 2 t ( p U p i + p 2 t p 2 ) iac[23C03=0¡
acC2j[2]=íj
ac[3]C03=0;ac[33[13=0¡ac[3][23=0i
//para el aspadoestadoi í ) ;SisEcuacionesílj
/ /para la Velocidadsshdc2UíSisEcuacionesO;a_dE=x[0]jbje=x[13ic_de=.xC23id_de=.x[33;
// para el ánguloB5tado3{ ) }SisEcuacionesf) ja_fi=x[03;
cji=x[23¡dji-x[33;
// para la derivada del ánguloS5tado4();SisEcuacionesOja_df=x[03¡
d_df=x{33 j
167
HaxEsp=0.0} // inicializar a cero para que no se hagaMaxDesp=0.0;HaxAng=0.0; // tose cono aaxiao el valor anteriorMaxüang=0.0j // y no ss escalen bien los gráficosHaxFue=O.OjMaxI=10QOi // hallar saxirao valor de sinulacion
h8rQchaAzul=Cr5atsSoüdBrU5híRSB(0J0Ji2?J);hAzul=CreatsPen(PS_SQLlDíi,RBB{0J0Ji29}JjhPrEvSrocha2=íHBR!JSH)SeÍEctQbjectíhDCJhBrochaAzulJ;h?rBv2=ÍHPEH)Se]ectübJBCÍÍhDC,hftzul};
í
es[ies]=l3j?síco5Íp2U) í- b_esísin(p2n) ++ d_esí[s in[p2n}-p2ít ícosíp2ft íJÍO,5/(p2?p2íp2]} tHxpípin)}
BsJ[ies3=Í3je*cos(p2tt) + b_deisin{p2ít) t c_deítÍ5Ín{p2ít)ÍO,5/p2+ d_dsíísin[p2U)-p2Utcas(p2tt))t0.5/(p2íp2tp2))íexp(pUt)í
an[ie5]=(a_íiíco5Íp2tt} + b_fiÍ5Ín(p2tt) -í- c_íiUísin(p2ít)í0.5/p2+ dJit[sin(p2n)-p2H*cos(p2tt))t0.5/(p2lp2tp2})texp(pinji
anj[ie53=(a_díícos(p2it) 4 bJ1tsin(p2H) 4 cjí»*sinlp2ftjt0.5/p2+ d_dfí{s inip2ttJ-p2mcosíp2(: tJ}t0.57(p2tp2tp2l ]*exp(plUJi
t=t4dEltaTjMaxiaosOj
// barra de porcentajeif(SiBarra==TRÜEJ{J=J4i;i f ( j== iOOIíj=0; // contador 100n=n4i;porcent=anchoVentxt{0,2540,05?n)í
5trptro=itoa(ntiO) stringoj 10);longitud=strlen(stringo)j
TextOut(hDCj(anchoVent>!/248-8í longitud J,yarr-Í7,strptro, longitud);xizq=íint)porcent;
SfilBctübJEct{hDC,hPrBvBrocha2)iDeleteObjectíhSrochafizul);SelectQbject(hDCíhPrev2);DslsteObject(hñzul);
SetCursorfhPrevCursor}; /í restablecer el cursor por defecto í/RsleaseCaptureOj /í desbloquear el ratón (/
169
íor{j=iH;j<njj-H-J{[ í 3=a [n ro* [ j33 [ i3 / a [n roN[ i ]3 [i];
k < = n j k - H - ]a [n row[J33[k ]=a [n raw[333[k3- f f l [n roH[ j ] ] [ i3 í a [n row[ i33 [ í ' . 3 ;
x tn - i 3=aEnrQH[n - i33Cn3 /a [n ro» i [n - i 33 [n -13 iíor(i=n-2;i>=0¡i--){
sima = 0;f o r í J = i - H j j < n ; j - H }
x [ i 3 = ( a E n r o w C i 3 3 [ n 3 ~ 5 i i a a ) / a [ n r o w [ i ] 3 [ i 3 ;i
//I Función para realizar cálculos del control proporcional derivativo |
void TPenduloHíndow::ProporDeriv{void)íHPEN PlusaBarra;HBRUSH BrochaBarra;
char 5tringo[10],ístrptro;int j=0, fi=0, xizq, .xder, yarr, ybaj, centraX, centraY, longitud;double KpjKdjajb.Bjf,tjSiq,r,rinvJari,ar2)ai!x,coIjdouble ci,c2jfloat porcent;BOOL SiBarra= FALSE;
HDC hDC= 6etDC[HWindow); /( establecer el contexto de visualhación í/SetCapture(HHindow}i /t bloqueo del ratón í/hPrevCur5or= SetCursoríhHourBlass) ; /( cambiar al cursor de espera t/centraX=anchaVentx/2-4t8;centraY=altoVenty/3;ií(anchoVentx>=150 U- altoVenty>=I50JíSiBarra=TRUEjTextQutíhDCjCentraX, centraY, "esperar",?);
BrochaBarra = (HBRUSHJSslectObjectíhDCj CrBateSolirfBrush(R6B(0, 127,255))] ;PluiaaBarra = (HPENJSelectobjectthDC, CreatePen(PS_SOLID, 1^68(0,127,25511)5
xizq=anchoVentx/4¡
.yarr=2taltoVenty/3-iO¡ybaj=2íaltoVenty/3HO;
170
T e x t Q u t ( h 0 C J x d e r - i 5 J y a r r - 1 7 J f l i G Q r j 4 ) j
DeleteObjectíSelectQbjectíhDC, BrochaBarra));Deie taGbjec t [Sa!ec í :üb jac t (hQC f P l u s a B a r r a ) ) }
//I4n, Si, iij], f id j3j son datosKp=HMHn*HníLp+gí¡K d = [ 2 t S i H i n l L p « l ) / K p ia = ( K p * K d ) / i L p í « ) ¡b=(Kp-g t«J / (Lp t« ) jSiq=SiíSijr=sqrt í i -Siq);í=atan(r/Si))r i n v = i / r j
c e s i = K p M a M a / b - K d ) - l ) / ( b í M Í ¡c s 5 2 = K p í t K d - a / b í / í b t H ] ices3=KpMKd-a/b)/H;
Max I =1000 iÍ5=10/(SiíWn)j // tieipo de Bstableciaiantot=0¡de3taT=Ts/1000;
HsxE5p=0,0; // inicializar a csro para que no se hagaMaxDesp=Ü..O¡MaxAng=0.0| // toas cono maxiao el valor aníeriorMaxDang=0.0; // y no 5B escalen bien ios gráficosHaxFue=0,0;
BrochaBar ra = (HBRUSHJSe lBc tObjsc t í t iDC, Crea t f iSoHdBni sh (R6BÍO J 0 J 129} ) ) ;PIus taBarra = ( H P E N J S e l e c t Q b j e c t í h Q C , CreatePBníPSJOLÍD, 1^56(0,0,129]));
íar i=Si(Hnt t ;e = ( e x p ( - a r í ) ) jaux=wnrít;ar2=aux-f;
anCies ]= r inv íe t ( coUs in [aux) - f i_o í s in (3 r2J ) ianj í [ Í25]=r inyte t t (coUwnrí eos ( a u x J - f i j J Í K n r í cosí ar2) )
-S i íWnt (co i t s in (3UxJ- f i_o í s in (a r2 í )} ifua[ ies]=Kpí{an[ÍBS]- í -} ;d?an_d[ÍBs]) ;
ci=vo-CBs3tan[0]+ces4f an JtO] ;es2ían d[0]j
171
es[ies]=cfislían[Í2s]-CEs2tan_d[ie53*clH*c2i
HaxinosU;
// barra ds porcentajeif(SiBarra~7RÜ£)
j=0; // contador 100n=nHjporcEnt=anchoVentxtí0.2540,G5Jn);Rectangra!hDC,xiz{ j ,yarr , ( int)pQrcent }ybaj) ;strptro=itoa(nílO, stringo, 10);langitud=5trl en { siringo ljTextOutíhDCjtanchoVentx^-UJ^arr- i?, ' ",41;TfixtOut(hDCJíanchoVBntx/2-f-8-8ílongitud)Jyarr-17J5trptroJ longitud);x i 2 q = ( i n t ) p o r c e n t ;
t=Uds i t aT j
DBleteQbJBctíSBlectQbjectíhDC, BrochaBarra))¡DBletBQbjactíSelactQbject ihDC, PlusaBarra));
SBtCursorihPrfivCursorJj /í restablecer el cur=or por defecto í/ñsleasaCaptureí); l\r el ratón \l
TextOutíhDCícentraU10)CBntraVI f lLíSTQ'( I5);
flfissagaBeepíOJ jReleasBDC[HHindo*)íhDC)i /í liberar el contsxto de visualización tiCalcuIosHech=TRUEj
// funciín para nacEr cflículos del Tifiapo H^niao
vpid TPenduloHindQH! :TiespohiniíBo(void)
double fO=0.07j fdO,F2JauxiJaux2,aux3íA!B,Ai jBl j !J j t ,antBst ,adtea;doubls Tesp jTdssp jTang jTdang;int i j j j iasj
// curva de conautaciínF2=fOÍ(gí-fO/Lp i 2ífuenaTH)/{Lpífí);if[F2<=0)return;
172
auxl=0.5MfijH-ptfusrzaTH/g);aux2=0.5mdjrtLpMsqrt(H/g])¡A=auxl-aux2;B=auxH-aux2j
AÍ=-aux3iA;
MaxEsp=G.OiMaxBe5p=0.0;Maxftng=0,0iHaxDang=Q.OjHaxFue=O.Oi
deltaT=0,005;
í
u=aux3ttian[i)=Aíexp(-u)-i-BÍBXpiu)-fLpí-fUEr2aTÍ1/gian_d[i]=Aiíexp(-u)iBIíexpíu]j
esJ[i3=2ífuerz3THU/H;
TB5p=iabs{e5Ei]í iif (íiaxEsp<TeEp)
// obtener el staxiio valor del espacioTde5p=fab5(e5_d[ i ] ) jif (HaxDesp<Tdesp)MaxDe5p=Tdssp¡ // obtener el siaxiisQ valor de la velocidadTang=íabs(an[ i ] ] ji1(Haxñng<=Tang)haxAng=Tang;Tdang="fab5(an_d[Í ]) ;i f(MaxDang<=TdangI
F2=anCi]t(gían[i]/Lp + 2í fuenaTH)/ íLptHJjfdO=-sqrt(íabs(F2J)¡
adten=fab5(an_d[ i ] - f dO) ;ias=i;if(adtea<=0.02)
{auxÍ=0,DÍ(an[ia5]-Lpt(~fueriaTf1)/g);3Ux2=0,5íanJ[ias]tLpÍ(sqrt(H/gí}jA=auxi-aux2¡
173
t=0¡HESsageBeepíQ))
u=aux3í t ;3n[j]=Aíexpí-uJ*BÍBí;p(uHptfuBrzaTíi/g;anJ[j]=Aiíe!ipí-u)t8UEXpíu)jBS[J3=(-fuerzaTMttme5j[ias3ítt+es[ias3ies_dEJ]=-2tfusrzaT«H/H+es_d[ias3i
t = t - t - d e l t a T jantsí i=íabs£an[ j3) ji í íantB»<=Q.04)
Haxl=j;i=1000j
t=Udel taTi
CalculQsHech=TfiLIE;
7/3 Función para crear los sapas de bits para la aniíaaciont
void TPenduloWindow:¡ConstrCBldasívoid)í
HDC hDisplayDC; • /í contaxtü de visualizadón í/HBRUSH hBrochaRojaj hPrsvBrU5h2; /t brochas para la esfera í/HPEN HPluiaRojaj hPrevPen2; /t piusas para la esfera (/
UbicPistaX = ( in t ) [0 .25tanchoVentx) iíinchoPista = ( int ) {Q,5íanchoVentx) ;ÍJblcPistaY = [ in t ) [0 .6>aI taVenty) jAlturaPists = (int)(0,062790697taltoi;efity};AnchoHapa = ünt).(O.Q93¿50793tanchGVentx}jAlturaHapa = AlturaPista;EsqDerX = AnchoHapa-ijEsqDerY = AlturaHapa-ijñíturaCarro = (int)í0.592592572lñlturahapa);xruedal = ( int)(0,06779óéí?AnchoHapa)¡?¡ruedali = (int)í0.4067796óiíñnchoMapa)jxrueda2 = EsqDerX-xruedaüj>!rueda22 = EsqDerX-xruedai;yruetíal = (int)(0.222222222tAlturaHapa)j
175
HDC hOCj /i contexto de visualizado?! í/KPEN hRed, hPrsv2; /í piusas para el péndulo!/HPEH hühi te , hPrevi; /í piusas t/in t a c t í J a c t 2 = 0 ) j ) l ) P e n d u l ü S u p , n j Y i J X 2 J Y 2 jlong k j ü n R jf ioa t ang=i .3j
char sir[25];int sig = ¿j // dígitos significativosint longitud;
if (bCeldasLisias " FALSE) returnj /í cancelar si celdas no preparadas i/hDC= BetDC(HHindoM); /í establecer eí contexto de visualización í/SetCapture(HHindüw)} II bloqueo del ratón í/hPrsvCursor= SetCursoríhHourGlassJj /i caisbiar al cursor de espera í/acU=(int)(imsin(an[Q]))i
i S p h e r e i X = í i n t ) í a n c h o V e n t x í 0 . 5 ) iPendu loSup = | int) í0.332558i39tal toVentyj i
// D I B U J O DE LA PÍSTfi
«ovBTolhDC^UbicP i s t aX+AnchoPi s t a í jUb icP iB taYl iL i n e T o ( h D C , ( U b i c P i s t a X + A n c h o P i s t a ) j ( U b i c P Í 5 t a Y * A l t u r a P Í 5 t a ) ) ;L i n e T Q t h D C j ü b i c P i s t s M j í ü b i c P i s t a Y + ñ l t u r a P i s t a ) ) ;LineíothDCjübicPistaX-ijUbicPistaY-i);
for ( i an= 0; ian <= " a x l j i a n + - f j( /í cofaisnzo del bucle de aninación í/
/mUBQRRAR EL PÉNDULO* tí U/hHhi te^ rea tePen tO^jOxOOFFFFFFL) ;h P r e v i = ( H P E H ) S e l e c t O b J B c t í h D C , h H h i t e ) ;M o v e T o ( h D C J í i S p h e r e 2 X ) J { U b i c P i s t a ' M ) ) |LineToíhDC,{iSphere2](iact2)JPenduloSup}jS e l e c t O b j e c t f h D C j h P r e v l J ;De ie teObjec t (h fc íh i i e ) ;
DIBUJO DEL PÉNDULO »«/tíRed=CreatePen(0,1,868(255,0,0));h P r E v 2 = ( H P E N ) S e l e c t O f a j e c t ( h D C f h R e d ) ;MoveTo íhDC, ( iSphe re iX) , (üb i cP i s t aY-1 ) ) ¡LineTo ( n D C j f i S p h e r e i X - t - a c t i ) , PenduloSup ] jS e l e c t O b j e c t ( h D C f h P r e v 2 ) } •D e l s t e O t i j s c t ( h R e d ) |
/í . d ibujar la v iñe ta actual • í/P a t B l f c i h P a g i n a O c u U a D C j O j O j ñ n c h o P i s t a j A l t u r a P i s t a ,
W H 1 T E N E S S ) ; /í de ja r en b l a n c o la página ocu l t a ?/Bi tB l t íhPaq inaOcuHaDC. t iSphere iX-UbicP i s t aX-AnchoMapa^) ,
176
i S p h e r e i Y j f t n c h o M a p a j A l t u r a H a p a , h H a p a D C . O j O j S R C A N D ) ;/ í copiar el carro i en ia página acu i t a i/
B i t B l t t h D C j U h i c P i s t a X j U b i c P i s t a Y j A n c h o P i s t a ^ l t u r a P i s t a ,h P a g i n a O c u l t a D C j O j Q j S R C C Q P Y ) ; / í copiar la página ocul ta a la ventana í/
iSphsre2)í=iSphereiX;act2=actl;
LSphereiX = ( i n t ) ( a n c h o V e n t x M 0 . 5 + ( E s t i a n ] l t 0 . 4 J ) ia c t l = ( i n U ( U 7 í s i n ( a n [ i a n 3 í ) i
gcv t ( e s [ i an ] , 5ig, s t r ) ;l o n g i t u d = B t r l s n í s t r J jíex tQut íhDC^Q," " , 2 5 J jT s x t ü u t t h D C , 0 , 0 j s t r , l o n g i t u d J j
//retardo
íinR=ratardoí2]for{k=Q¡k<finR}k+*)
// choque 3 la derecha del carroif{B5[ian] >= 0,51
Yl=PanduIoSupjX2=intí(UbicPÍ5taY-l-PenduloSup)ícDSÍangí)^iSphere2XjYZ=UbicPÍ5taY-i-int((UbicPistaY-i-PenduloS!ip)Í5ÍníangJ)i
ior
// BORRAR EL PÉNDULOhHbitasCreatePeníOjijOxOOFFFFFFLíihPrevl=(HPEN]SelBctObject(hDC,hWhiteJjfioveTüíhOC, (iSphere2X) , (UbicPistaY-i ) ) ¡
SelectObject(hDC}nPreviJiDeleteObjectfhHhite};
// DIBUJO DEL PÉNDULOhRed=CreatePen{0,i 66(255,0,0)};
HovEÍothDC, (iSphere2X J , (UbicPistaY- ) 1 j
SelectObJBct(hDC,hPrev2};DBlateQbjactthRadJj
// retardo
177
ang=0,13í{8-j);X2=int[(übicPistaY-i-PenduIoSupjtco3Íangí)tiSphsre'2X¡Y2=UbicPistaY-i-int(tübicPÍ5fcaY-l-PsnduloSupJísiníangí)i
tan =
// choque a la izquierda del carroi f t s s C i a n ] <= -0,5}{
XÍ=iSphere2X+act2;Yi=PenduloSup;
X2=iSphere2Mnt f{UbicP i s t aY- I -Pendu loSup) ícos (ang)} ;Y2=UbicPis taY- l - in t ( (üb icPÍ5 taY- l -Psndu laSupJ t s in (ang)J j
fo r ( j = 0 ; j ü O j j - H }í// BORRAR EL PÉNDULO
h P r s v ^ í H P E N J S e l e c t D b j e c t t h D C . h W h i t e J iM o v e T o t h O C j t i S p h e r e Z X l j í ü b i c P i s t a Y - l J ) ;
S e l s c t O b j e c t l h D C j h P r e v D íD e l E t e O b j e c t í h W h i t E ) ;
/ / D I B U J O DEL PÉNDULOh R e d = C r f i a t B P B n t O , i í R 6 B ( 2 5 5 l O l O n ih P r e v 2 = Í H P E H ) S f i l B c t O b j a c t t h D C , h R B d ) iH Q v e T o ( í i 0 C J í i S p h B r B 2 X } J ( U b i c P Í 5 t a Y - i ) ) iL i n e T o { h D C ; X 2 J Y 2 ) ;S e ] e c t Q b j B c t ( h D C , b P r B v 2 ) iD e l e t s Q b j e c t ( h R e d ) ;
// retardof o r ( k = O j k < f i n R ¡ k + + )fo r{ ]=0 ; l<20 ¡m} ;
X i = X 2 ;Yi=Y2;ang=0 . i3 í (8 - j ) i
X 2 = i S p h e r e 2 ) t - i n t ( ( U b i c P i s t a Y - i - P B n d u l o S u p ) t c o s í a n g ) ) iY2=UbicPis taY-i - in t [ ÍUbicPis taY-i -PenduloSup)*s in(ang)) ¡
ian = f t a x I H j
} !\r al principio del bucle y dibujar la siguiente viñeta,,, í/
SetCursaríhPrevCursorJi /í restablecer el cursor por defecto I/ReleaseCaptureOj /í desbloquear el ratón í/
178
R e l e a s e D C t H H i n d o K j h O C ) ; / í i ibBrar al contexto de visualizadón i/
void TPendu ioWindow: ; L i í a p i a r P a n t a i l a ( v o i d )
I f t V a l i d a t e R e c t l H W i n d Q W j N U L L J R U E l j
// funciln para dibujar los ejssvoid TPenduloKindQH¡:6raficaEJB5(void){HDC hDC; // contexto de visualizauónHPEH hNegrOj hPrsvíj // pluna para los ejes•float idivXj ÍdivY,inTÍBB!X;int i,j,5ig=6jchar 5tr[25];
pXíaax=anchoVBntx-20 ; // aaxisao valor de puntos en el E J E x
i f ( N a x ! > = p X i f i a x )i n c X = h 3 X Í / p X f f l a í ! i / / va lo r de escaíaaiento del tietpo
eUeinc¡C=l j
i f ( M a x K p X f i a x )• j n c í = p x a ) a x / H a x I ;
eUe
hDC= GetDC(HWindow); // establecer el contexto dE visualización
// dibujo de los ejeshNegro=CreatePeníO,ljOxOOOOOOOOÍjhPrevHBPENJSe lec tQb jecUhDCjhNegro ) ;« o v B T o ( h D C , 1 0 , U b i c E j e x ) iL i n e T o í h D C j t a n c h o V e n t x - l O l j U b i c E J E x ) ;
LinfiToíhOCjlOjUltoVenty-lQ]);5Blectabject(hDCrhPrBVl);DeletsObJBctíhNegro);
í o r ( j = j n c ) ! ; j < p x f f i a x ; j = j í j n c j ( í j
J=J - jncX¡i d i v X = í í l o a t ) j / 1 0 . 0 ji d i v Y = ( f l o a t ] ( a l t o V e n t y - 5 0 ) / 2 0 . 0 ¡
179
j = ( i n t } [ Í O + i d i v X l i ) iH Q V e T o í h D C J j t U b i c E j e x - i M ;L i n e T o ( M ) C í j l l U b i c E j e ) ! + 2 ) ) i
3
ÍQr{i=0;i<21)i-H)(j=íintJÍ40+idÍYYti)j
H ü v e T o í h D C j S j U b i c E j e x ! ;U n e T o ( h D C , i 2 , U b i c E j s x J ;
}else{
HaveTo(h0C,8, j ) ;
ReleaseDCEHHindoH,hDC); /í liberar el contexto de visualización í/
inTisfflX= deltaTíidivXtincX/jncX:
strcpytDeTiBBX, "í'ljstrcatíDeTiesiX, strjjstrcatíDeTisaX, H seg/div)")}
//J Función para graíicar el Espacio versus el Tieapo
void TPenduloHindow: :6rafEspacio(void)í
HDC hDC; /t contexto de visualización í/HPEN hRojo, HPrev2; /í pluaa para 1a curva í/int ic, jj Iongij5ig=6;double y, escYjinEspaY;char str[25]j
char cadenL20]jístrptro;int longitud, cuent=0;long endTisBjdelayTicks=5i
.sndTise = biostioeíO, OLÍ + delayÜcRs;«hile (biostiae(0, OL) < BndTiae)
5trptro=itoa(ciíent, csden, 10) }longitud=sfcrlen{cadení¡
180
inEspaY=HaxEsp/10;gcvt(inE5paYjSÍg,str);strcpyfDeEspaY, "(");strcatíDeEspaY, str];strcatíOeEspaY, u a/div)1
BscY=(aUoVBnty-5QÍ?G.5 / í !axEsp i// factor de escala en el eje y
hOC= S e t D C ( H H i n d Q N ) ; // establecer E! contexto de visual izar ían
O/^ s",25í¡
SetTextColorthDC, OxOOOOOOFF);langi=5trleníOeíisaX);TextOut{hDC)i40J0JDBTieaJ(JlongiJ;langi=5trlen(DeEspaY)jTextQutíhDCj 140,20 jDeEspaYjlongi);TsxtOutíhOC^BOjOj'aspacio vs f,!?);
TextOutfhDC, 140. 40 jStrptro, longitud);
// dibujar 1a figurahRDJü=CreatePeníQ,l,0):OÜOOQOFF);hPrBv2=(HPEN)SelectDbjectíhDClhRojo)¡
J=Í5y=(doub]e)UbicEje .x-es[03íe5cY;H o v e T o í h B C j i O j í i n t J y J if o r í i c = i n c X , j = j n c X ; j < p X ( s a x ; i c : : i c + i n c X , j = j - í - j n c ] ( ){
y = ( d o u b l B ] U b i c E j e x - e s [ i c 3 t e s c Y j
Be}ectObJEct(hDC,hPrev2)íDslBtaObjectíhRojo);
ReleaseDCÍHNindoWjhDC); !\r el contexto de visualiíación \
//I Función para graficar la Velocidad versus el Tieapovoid TPenduloHindow;:6rafyelocidad(void)íHDC hDC; // contexto de visualizaciónHPEH hRojo, hPrsv2; // pluma para la curvaint le, j, longi,sig=6jdouble yj sscY,inVsloY;char strt253i
inVEloY=MaxDfisp/iOigcvtíinVeloY,5Íg,5tr);strcpyíDfiValoY, 'í'JistrcatíDeVsloY, str);strcatíDeVeloY, " U/sJ/divJ")i
181
escY=íaltoVenty-50!í0.5/HaxDs5p;// factor de escala en el eje y
hDC- SetDC{H!ündow}; // astablscer aí contexto de visualización
TextOut(hDCI3J20í"y=SetTextColorlhDC, 860(255,0,255))}longi=stríen(DeTÍEfflX)jTextOutí hDC, 140,0 jDeTieffl
longi=strlBn(DeVeloY)i
TextüutthDCjSSOjO/vel vs t " ,B) j
// dibujar la figurahRojo^reatePenlOjljRBBÍ 255,0,255) )jhPrBv2=(HPENJSBlBctObJBct(hDC,hRojo)i
J=i¡y=ídDUble)UbicEjex-esJ[0]Íe5cY;
KoveToíhDCj iO^int íy i i1oríic=ind,j=jnc3íjj<pxuaxiic=iciincXJj=j+jncX)
SelectflbJBct{hDC,hPrev2)jDaíatBGbjsct(hRQJa)i
/í liberar el contexto de visualización
//j Función para graíicar el Ángulo versus el Tie¡spovoid TPendulüKindo»!:BrafAngulo(void)
íHDC hDC; // contexto de visualiíadónHPEN hAzul, hPrev2; // piusa para la curvaint ic, j, íongijSicpójdoubíe y, escY,inAíiguY;char strt253;
inAnguy=MaxAngti8/PI¡gcvt(inAnguY,5ig,5tr];etrcpyíDeAnguYj "{"JistrcatEDeftnguY, strjjstrcatíDfiflnguY, a g/div)")¡
sscY=(altDVsnty-50)í0.5/haxAngi// factor de escala en el eje y
hDC= BstDC(HHíndoH); // establecer si contexto de YisuaUzacion
182
Tex tOu t fhOC,5 ,0 , "x= sVSJjTextOiiUbDC^^O/ys g r d s f l í 2 S ) jSe tTextColor íhDC, 868(0 ,0 ,255) )?l o n g i = s t r Í e n ( D e T Í B ! B X ) ;T e x t O u t ( h D C , i 4 0 , 0 J D e T i e a X J ] o n g i ) il o n g i ^ s t r í s n í D a A n g u Y ) ;
TsxtOutíhDCjZaQ^O/ang vs
// dibujar U figurahñzulsCreatePBnlGjijRGBIQjh P r B v 2 = ( H P E N Í S e l e c t Q b J B c t ( h D C , h A z u l ) i
J= i iy = U b i c E j e x - a n E O ] i e s c Y jHavsTo{hDCjiOj(int)y)j• f o r ( i c = i n c ] ( J j : : j n c ) [ ; j < p X B a x j i c = i c - f i n c X í j = j + j n c X ){
y=UbicEjex-an[ ic ) ÍB5Ci ;
SBÍectObJEct{hDCJh?rBv2);OslstaObjectíhAiulJi
HelsaseDCIHHindoWjhDCJj /í libarar el contfixto de visualización M\n para graíicar la Velocidad Angular versus el Tiespo
void TPenduloHindow; :SrafVAngular(void3(HDC hDC; // contfixto de visualizaciónHPEN hVsrdej hPrev2; // pluma para la curvaint ic, j, longijSÍg=¿¡double y, escY,inVangY;char 5tr[25]j
inVangY=MaxDangUB/PI¡
strcpyíDeVangY, "fíi5trcat(DeVangY,
e s c Y = ( a l t o V e n t y - 5 0 ) t 0 . 5 / H a x D a n g ;// factor ds sscala en el ejs y
hDC= G e t D C í H H i n d o w ) ; // establecer si contexto de visual ización
T e x t Q u t ( h D C J 3 I 0 J B x = 5 H , 2 5 ) ;Tex tOut lhDCjS^O/ys gr/s ' ,28);SetTextColor íhDC, O x O O O O F F O O ) ;
l G n g i = s í r Í e n í D e V a n g Y Í ;
183
T e x t Q u t í h D C j S B O ^ O / v e l - a n g vs t" ,12);
// d ibujar la f igurahVf i rde=CrEa tePen(O , i ,OxOOOOFFOO);h P r e v 2 = ( H P E M J S e l B c t O b j e c t . í h D C I h V B r d B J i
y=UbicEjex-anJ[G]ÍB5cY;H o v e T Q ( h D C , 1 0 , ( i n U y ) jf o r í i c = i n d , j = j n c X ; j < p X f 8 3 X ¡ i c = i c * i n c ] ( , j = j - f r j n c X )íy=UbicEJBX-an_d[ic3ÍB5cY¡LineToíhDCjíiO+jJjdntJy)}
SslBctObJBctlhDC,hPrBv2íiDeleteObjectíhVerdeli
Rele3s.BDC{HNindaw,hDC); /í libBrar el contexto de visuaiización t/
void T P e n d u l o W i n d o M í i B r a f i c a F u e r z a i v o i d )/
HDC hDC; // contexto OB visual izaciónHPEN hCslESj hPrev2j // pluiea para la curvaint i c j j , longijBig^é;doub le l / j BscYj ínFusrY;char str[25]j
gcv t ( i nFue fY ( s ig í s t r J is t rcpy(DaFuerY, " ( M is t r c a t ( D f i F u e r Y , s t r) ;s t r ca t íDeFuerY, u n e K / d i v ) " ) ;
e s c Y = ( a l t o V e n t y - 5 0 ) t 0 . 5 / M a x F u e ¡// factor de Escala en el* eje y
hDC= BetDC(HHindow); // Bstablecsr el contexto de visualización
Tex tQut thDC^O/x- 5 a J 2 5 ) ;TBxtOut(hDC } 3 ( 20 J M y= nB»." ,2B) iSetTextColor íhDC, R S B ( 0 } 2 5 5 J 2 5 5 ) ) jl o n g i = s t r l e n ( D e T i e f B X J }Tex tQu t fhDC,140 ,OjDeTieaXjUng í ) ;l o n g i = s í r l e n ( D e F u e r Y ) ;
za vs tVl);
// dibujar la figura
hPrev2=iH?ENJSelactObject(hDCJhCeles)i
184
H o v e T o í h D C j i G j í i n U y ) ;
y=UbicE jex - fuE[ i c ] í e scY;U n e T o í h D C j U Q + j J j t i n t í y l i
S B l e c t Q b j e c t ( h D C J h P r e v 2 ) jD e i e c e O b j e c U h C e l e s ) ;
; /í l i bBra r e] contBxto de v i sua l i í ac ión í/
/ /3 función para obtener las coordenadas del espacio ju r 3
void TPf induloHindtw; :CoorEspac io(void){
HDC hDisp l ayDC; /í contexto de v isual izac ión í/HPEH h B l a c f c P e n , hPrevPen; /* pluisas í/double xEspjyEsp;char stringaüOljístrptro;
char str[253iint sig = 6; // nusero de dígitos significativosint longitud;
hDisplayDC= BetDCÍHHindoH); /í establecer el contexto de visualiíación I/hBlackPeiF CreatBPBníPSJOLIDjijRGBÍOjO^)); /» craar piusa I/hPrevPen= (HPENlSelsctObjectthDiBplayDCjhBUcfcPenJi /í seleccionar pluisa í/
//ancho y largo da la ventanastrptro=ítoaíanchoVBntXj siringo, 10);longitud=5trlBn(stringo);íextOutfhDisplayüCjóOOjiiO,11 u,7); //borrar el dato anteriorTextaut[nDisplayDCjíó24~8tlongitud)IiiOJstrptrQ,longitud);
5trptro=itoa(aitoVenty, stringo, 10);longitud=5trlenístringo);TextOutíhDÍBplayDCjóOOjlSO," u,7); //borrar el dato anteriorTextaut(hDisplayDC,(ó24-8tlongitud),130jstrptro,longitud);
xEsp= (coordenadaX-lOídeltaTtincX/jncXjyEsp= (UbicEjex-coordenadaY)ÍHaxEsp/(UbicEjex-40);
//coordenadas x and y del cursor
gcyt(xEsp, sig, str);long i tud=s t r l en (5 t r} ;T e x t O u t ( h D i s p l a y D C J 2 0 , 0 J " %22) ; / /bor ra r e l dato anteriorTextOutthDisplayOC^OjOjStr, longitud);
g c v t t y E s p , 5Íg; s t r j j
185
longitud=strlen(str);TextOut(hDisplayDCJ20l20,"TextOut(hDÍ5playDCJ20J20Jstr,longitud)j
,22); //borrar el dato anterior
íHDC hDisplayOC;HPEN hBlackPen, hPrsvPen;double
SelectQbjectínDísplayDCjhPrevPsn); l\r piusa í/DeleteGbjectíhBlackPen); /I borrar piusa (/ReleaseQCíHtíindo'rijhDisplayDC}; l\r el contexto de visualización */
// función para obtener las coordenadas de la velocidadid TPenduloWindovf: :CoorVelocidad(void)
/í contexto de visualización í/l\s í/
c'nar 5tr[253;int sig = 6; // nuaero de dígitos significativosínt longitud;
hDisplayDO SetE)C(HHindüw); /t establecer el contexto de visualización í/hBlackPen* CreatsPentPSJOLIDjIjRGBtOjO.O)); /í crear pluisa MhPrevPen= (HPEN)SeiectObjectíhOÍ5playDC,hBlackPen); /í seleccionar piusa \l
xDasp= (coordenadaX-IO)ídeltaTtinc!(/jncX;yDesp= (UbicEjex-coordenadaY)íhaxDesp/(UbicEjex-40);
//coordenadas x and y del cursor
gcvtfxDesp, sig, str);longitud=5trlen(str);TextOut(hDÍ5playDC,20,0,"TextüuUhQisplayDC^QjQ, str, longitud);
gcvttyDesp, sig, str);longitud=strlen(str]jTextOutfhDisplayDC^O^O,'TextOutíhDisplayDC,20,20,str,longitud);
,22); //borrar el dato anterior
',22); //borrar e! dato anterior
SelectOfaject(hDispiayDC,hPrEvPen); /f deseleccionar plu*a MDeleteObjectfhBlackPen); /í borrar piusa t/RBleaseDC(HHindoH,hDisplayDCí; /í liberar el contexto de visualización í/
// función para obtener las coordenadas del Bngulovoid TPenduioHindow: ¡CoorAnQUloívoid)
HDC hDisplayDCjHPEN hBlackPen, hPrevPen;double xAng,yAng;
/í contexto de visualización í//í piusas \
186
char str[25]jint sig = 6; // nusero da dígitos significativasint longitud;
hDispUyDC= BstDC(HHindaw); ¡\r al contexto de visualización í/hBlackPen= CreatePenfPSJOLlDjijíiSBÍOjGjOJ); /t crear pluaa í/hPrsvPBiF (HPEN}SeÍectObjectíhDisplayDC,heiackPen); /í seleccionar piusa \
yftng= (Ub icE jes -coordenadaY)Wa3( f lng*180 / ( (Ub icE jex -40J tP I ) ¡
//coordenadas x and y del cursor
gcvtíxAng, síg, str);longitud=strien(strí;TextQut[hDisplayDC}20,Oj" Mj22); //borrar el dato anteriorTsxtQutthDispUyOC^OjQj str, longitud);
gcvtíyflng, sig, str);longitud=strlen[str);TBxtOut(hDisplayDC,20J20," H,22); //borrar el dato anteriorTextQutínOispiayDC^Oj20,5^, longitud);
SeJectObjectthDisplayDCjhPrevPen); /( deseleccionar pluia í/DeleteObjectíhBlackPen); /í borrar pluaa MRelesseDCÍHÜindoWjhDisplayOCJ; /t liberar el contexto de visualización i/
// función para obtener las coordenadas de la velocidad angularvoid TPenduloHindow; :CoorVangular(voidJíHDC hDisplayDC; /í contexto de visualización MHPEN hBlackPen, hPrevPen; /* pluinas \double
char str[25]jint sig = 6; // nueero de dígitos significativosint longitud;
hDisplayDC= BetDC(HHindonlj /( establecer el contexto de visualización t/hBlaci;Pen= CreatfiPeníPSJOLIDjljRBBÍOjOjO)) j !\r piusa \bPrevPen= íHPEN)SelectObjectíhOisplayDC,hBlackPen]; /t seleccionar piusa t/
g^ {coordenadaX-iOJÍdeltaTtincX/jncA;yDang= ÍUbicEje)(-coordBnadaYJÍMaxDangU80/[íUbicEJBX-40JtPI)¡
//coordenadas x and y del cursor
187
gcvtíxDang, sig, str);longitudestrlBn(sfcr)jTBxtQuUhflisplayDCjZQjO/ H,22); //borrar al dato anteriorTExtOut(hDispIayDC,20,Q,5tr,longitud);
gcvtfyDanq, sig, str);longitud=strlen(str);TextQutíhDisplayDC^O^O,' ",22); //borrar el dato anteriorTextÜutíhDispIay00,20,20,str,longitud);
SBlectObJBctlhDisplayDCjhPrfiYPBn); /i deselEccionar piusa í/DeletBQbjectthBlackPenJ; /i borrar pluaa t/RelBasBDC(HHindow,hDisplayDC)j ft liberar el contfixto de visualisación (/
void TPanduloHindow;:CoordfiFufirza{Yoid)iHDC hDisplayDCj /t contexto de visualización t/HPEN hBlackPen, hPrevPen; /í piusas í/double xFue,yFue;
char str[25];int sig = ó; // nusero ds dígitos signiücativosint longitud;
bDisplayDC= BBtDCíHHindoNÍ; /t establEcsr el contexto dE visualización í/hBlackPEn= CrEatEPenEPS_SQUD,l)RG8ÍOJ0JG)); /t crBar pluisa MhPrevPen= (HPEN)SelectObJBct(hDisplayDC,hBlackPBn); /t seíeccionar pluaa í/
yFuB= (UbicEJEX-coordEnadaY)íl1axFuB/(UbicEJEX-40)i
//coordEnadas x and y dsl cursor
gcv t (xFue , sig, str);long i tud=s t r lBn(5 t r ) ;T B X t O u t t h D i s p l a y D C ^ O j O , " " , 2 2 ) ; / /borrar B! dato anteriorT E X t Q u t ( h 0 Í 5 p l a y D C J 2 0 , O l s t r í l o n g i t u d ) ;
g c v t í y F u f i , sig, s t r ) ;longit i id=str len{s-tr) ;T s x t O u t í h D i s p l a y D C ^ O ^ O , " M , 2 2 ) ; / /bor ra r E! dato anter iorT e x t O u t í h D i s p U y Q C , 20,20, str, l o n g i t u d ) ;
SBlBctQbjectíhDisplayQCjhPrevPEn); /í dssBlEccionar piuca t/DeieteObjectíhBlackPen); /í borrar piusa t/
/i liberar si contexto de visualiíación t/
188
III Función para graficar la velocidad angular versus elvoíd TPenduloWindow:¡SrafflngvsDangívoid)
HDC fiDCj // contexto de visualizaciónHPEN hNsgro, hPrevi; // piusa para los ejesHPEN hAzul, hPrev2; // pluma para la curvaint k,i,j,longi,5Íg=6jdouble x } y, esd, 8scY,inftnguY,inVangYif loat dsHXjdeHYjchar str[25];
inAnguY=HaxAngíl8/PI;
BtrcpylDeftnguY, Tíj5trcat(DeAnguY, str);strcatíDeAnguY, " g/div)")j
inVangY=HaxDangílS/PI;gcvtíinVangYjSigjStrljstrcpyíDeVangY, "(")}5trcat(DeVangr, str]j5trcat(DeVangYj " (g/s)/div)B)i
sscX=íanchQVefitx-20JÍ0.5/MaxAng¡ // factor de escala en ei eje xescY={altoVenty-5GH0.5/MaxDangj // factor de escala en el eje y
delU=ifloaUíanchoVentx-i9)/20.0;deltY=(floatJíaltoVBnty-50)/20.0i
hDC= 6etDC[HWindow); // establecer el contexto de visualización
TextOut(hDCJ3,0JBx= grü,26);TextOut(hDCJ3J20J"y= ' gr/5%28);SetTextColoríhDC, 888(0,0,255)))longi=strlen{DeAnguY);TextOut(hDC,140,0,DeAnguY,longi);longí=5trlen(DeVangY)jTextQut(hDCíi40J20,E)eVangYílongi]}TextQutíhDC^BOjO/vel. ang. vs, ang/,18);
// dibujo de los ejeshHegro=CreatePeníO,1,0x00000000);hPrevi=(HPEN)SelecíObject(hDC,hNegro)iHoveToíhDCjlOjUbicEjexí;LinBToíhDCjíanchoVentx-iOíjUbicEjexJj«oveTo{hDCJ(anchoVentx/2)340J;LineToíhDCJ(anchoVentx/2)/(altoVenty-10})jSalectObject(hDC,hPrevi)iDeleteObject(hNegroJ;
189
f a r ( i=0 j i<=20 j i -n - ]íj = ( i n t ) { i O . O t d e l t X t i í ii f ( i = = 1 0 ) ;SÍSE
í
H o v B T o ( h D C j j , ( l i b i c E j e x -2 ) ] jL i n e T a í h D C j j j d l b i c E j B X + 2 J ) ;
íoríi=0;i<=20;iHj/
j = (ini)HO.(HtíeltYíi);ifíi==íO);elssíBoveTo(hDC,íanchoVBntx/2-2),j)¡LineTQÍhDCf{3nchoVentx/2f2)Jj}5
/ / d ibu j a r la - f igurahAzul sCrea tePen íQ, 1 ,868(0 ,0 ,255) ) ;h P r B v 2 = ( H P E H ) S B Í e c t a b j e c t ( h D C í h A z u l ) j
y = ( d o u b l s ) U b i c E j e x - a n _ d E 0 3 t e s c Y jx = ( d o u b l e ) ( a n c h o V B n t x / 2 ) + a n t O ] Í B 5 c X i
H o v e T o ( h O C } i i n t ) x , { i n t ) y ) iíor{ ic=I ; ic<haxI ; ic -<- t -}í
y = í d o u b l s ) l J b i c E J B X - a n _ d [ i c ] t e s c Y jx={doub lE) (anchoVEnt> : /2S+an[ i c ] tEsc3 ( ;
S e l e c t O b j e c t ( h D C , h P r E v 2 ) iD e l e t e O b j e c t í h A z u i ) ;
R e l e a s e D C ( H H i n d D W , h D C ) ; / t l ibsrar el contEXto de visual ización t/
// funciín para obtener las coordenadas del Sngulo vs, vel. angular//void TPsndulot i i r idoM: ;CoorVangvsAng(vo id){
.HDC H D i s p l a y D C j /í contexto de visual izadón \HPEN hBlackPen , hPrevPen j /í p l u n a s t/d o u b í e
charint 5Íg = áj // numero de dígitos significativos