Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRESENTA:
ASESORES:
Av. Ticomán No. 600, Col. San José Ticomán, Del. Gustavo A. Madero, México CDMX. Junio 2021
Autorización de uso de obra
Atentamente
______________________________ ______________________
Rodríguez Claudio Fernando Timoteo Urzúa Toledano Oscar Uriel
Índice
Simbología ...................................................................................................................... I
Abreviaturas.................................................................................................................. VI
Resumen ....................................................................................................................... 1
Abstract ......................................................................................................................... 1
Introducción ................................................................................................................... 2
Antecedentes ................................................................................................................. 3
Alcance .......................................................................................................................... 4
Justificación ................................................................................................................... 5
Metodología ................................................................................................................... 7
Capitulado ..................................................................................................................... 8
Motor .......................................................................................................................... 9
Hélice ....................................................................................................................... 18
Despegue ................................................................................................................. 29
Recorrido horizontal .............................................................................................. 30
Ascenso ................................................................................................................... 34
Techos ..................................................................................................................... 36
Descenso ................................................................................................................. 39
Aterrizaje .................................................................................................................. 42
Alcance .................................................................................................................... 49
Autonomía ................................................................................................................ 50
Conclusiones ............................................................................................................... 53
Anexos ......................................................................................................................... 54
Anexo D. Código para calcular la variación de la potencia del motor por la altitud
(opción 1) ................................................................................................................. 59
Anexo E. Código para calcular la variación de la potencia del motor por la altitud
(opción 2) ................................................................................................................. 65
Anexo Ñ. Código para calcular el alcance y la autonomía del avión. ...................... 104
I
μd Coeficiente de fricción a la rodadura en
la pista de despegue
n Régimen de giro máximo 1/min
W Peso del avión N
T0 Tracción inicial N
Td Tracción de despegue N
Ff0 Fuerza friccional inicial N
Ffd fuerza friccional al momento del N
despegue
CL β max Coeficiente de sustentación cuando la
fineza es máxima
CD β max Coeficiente de arrastre cuando la fineza
es máxima
F0 Fuerza neta de tracción cuando la N
velocidad es cero
Fd Fuerza neta de tracción cuando la N
velocidad es igual a la velocidad de
despegue
Fm Fuerza de tracción media N
rt Radio de transición m
HR Altura del avión sobre la pista al concluir m
la transición
hr Altura reglamentada, obstáculo m
imaginario (15.24 m)
HA Altura para sobrepasar la altura m
reglamentada
XT Recorrido total (despegue) m
Va Velocidad de ascenso. m/s
Vva Componente de la velocidad vertical m/s
(ascenso)
II
Vha Componente de la velocidad horizontal m/s
(ascenso)
ta Tiempo de ascenso s
Vvd Componente de la velocidad vertical m/s
(descenso)
Vhd Componente de la velocidad horizontal m/s
(descenso)
H Techo absoluto m
z Altura a la que está volando el avión m
Vvmax Velocidad vertical máxima m/s
CL Coeficiente de sustentación para cada
ángulo de ataque
CD Coeficiente de arrastre para cada ángulo
de ataque
S Superficie alar m2
θd Ángulo de descenso rad
Vde Velocidad de descenso en planeo m/s
Vap Velocidad de aproximación m/s
Vtd Velocidad media de aproximación m/s
Vf Velocidad promedio m/s
Vs Velocidad de desplome m/s
CLa Coeficiente de sustentación (aterrizaje)
Cfe Coeficiente de fricción superficial
equivalente
CDa Coeficiente de arrastre (aterrizaje)
Da Arrastre en el aterrizaje N
La Sustentación en el aterrizaje N
θp Ángulo de planeo rad
rn Radio de nivelación m
CLr Coeficiente de sustentación (en
rodadura)
III
CDr Coeficiente de arrastre (en rodadura)
Dr Arrastre durante la rodadura N
Xha Distancia de rodadura (aterrizaje) m
Xa Distancia de aproximación (aterrizaje) m
Xta Distancia de nivelación o m
enderezamiento (aterrizaje)
Xra Distancia de aterrizaje con rodadura sin m
frenos
Xfa Distancia de aterrizaje con rodadura con m
frenos
Xtas Distancia total sin frenos (aterrizaje) m
Xtaf Distancia total con frenos (aterrizaje) m
μa Coeficiente de fricción a la rodadura en
la pista de aterrizaje (sin el uso de
frenos)
μf Coeficiente de fricción a la rodadura en
la pista de aterrizaje (con el uso de
frenos)
Vtv Velocidad tangencial (viraje) m/s
ϒp Ángulo de peralte (inclinación lateral del rad
avión)
V Velocidad a la que va el avión m/s
rv Radio de viraje m
Cons Consumo de combustible horario kg/h
PMC Potencia máxima continua HP
Wi Peso inicial del avión N
Wf Peso final del avión N
Wini Peso bruto del avión N
Wcu Peso de combustible usable del avión N
IV
Wfa Peso del combustible a bordo (en N
tanques del sistema de propulsión) del
avión
Wfr Peso del combustible de reserva N
φc Densidad del aire en crucero kg/m3
CS Cualidad sustentadora
ω Factor de aproximación de la potencia al
freno en condiciones atmosféricas
promedio
V
Glosario de términos
Administración Federal de Aviación: (FAA de sus siglas en inglés Federal Aviation
Administration) es aquella agencia gubernamental de los Estados Unidos de América
encargada de regular los aspectos de la aviación en dicho país.
Interfaz gráfica: (IG) es un programa informático que actúa de interfaz de usuario, la cual
utiliza conjuntos de imágenes y objetos gráficos.
Abreviaturas
AG: Aplicación gráfica.
VI
Lista de tablas
Tabla 1. Atmósfera estándar, tomada de Aerodinámica Tomo IV Carlos Ordoñez ....... 12
Tabla 2. Coeficientes de fricción a la rodadura ............................................................ 31
Tabla 3. Coeficiente de fricción superficial equivalente (obtenido del libro de Raymer) 43
Lista de imágenes
Figura 1. Curvas de desempeño a diferentes altitudes para un motor Lycoming IO-540-
AC. .............................................................................................................................. 10
Figura 2. Portada de la AG en Matlab (appdesigner). .................................................. 11
Figura 3. Opciones para escoger y así obtener los datos de la potencia del motor. ..... 11
Figura 4. Ajuste polinómico para valores de σ a diferentes altitudes ............................ 13
Figura 5. Solicitud de datos después de haber seleccionado la opción 1 (ejemplo). .... 15
Figura 6. Visualización de la potencia corregida por altitud (ejemplo, opción 1). .......... 16
Figura 7. Solicitud de datos después de haber seleccionado la opción 2 (ejemplo). .... 17
Figura 8. Visualización de la potencia corregida por altitud (ejemplo, opción 2). .......... 17
Figura 9. Parámetro de similitud J contra la eficiencia de la hélice. .............................. 19
Figura 10.- Uso de Grabit usando una gráfica tomada del libro de Ordoñez sobre el
rendimiento de una hélice 5868-9 Clark-Y de tres palas (ejemplo). ............................. 20
Figura 11. J vs ƞ, obtenida por el usuario utilizando la aplicación Grabit de acuerdo al
ángulo de inclinación de las palas de la hélice (ejemplo). ............................................ 21
Figura 12. Potencia disponible (con datos de ejemplo). ............................................... 23
Figura 13. Gráfica de potencia disponible a diferentes altitudes (ejemplo). .................. 24
Figura 14. Ventana que muestra la aplicación para graficar la potencia disponible vs la
potencia requerida. ...................................................................................................... 26
Figura 15. Gráficas que muestran la comparación de la potencia disponible vs la potencia
requerida a diferentes altitudes (ejemplos). ................................................................. 28
Figura 16. Recorridos parciales durante el despegue.. ................................................ 29
Figura 17. Uso de Grabit para obtener los valores de los coeficientes de tracción para la
hélice seleccionada (ejemplo). ..................................................................................... 30
VII
Figura 18. Ventana de la aplicación que muestra las distancias de despegue para cada
altitud. .......................................................................................................................... 33
Figura 19. Tabla de algunos de los coeficientes de fricción a la rodadura que se mostraría
si se presiona el botón "Tabla de coeficientess". ......................................................... 33
Figura 20. Ventana de la aplicación que muestra las distancias de despegue para cada
altitud (ejemplo). .......................................................................................................... 34
Figura 21. Interfaz que permite obtener las hodógrafas de ascenso. ........................... 35
Figura 22. Gráfica de hodógrafas de ascenso (ejemplo). ............................................. 36
Figura 23. Ventana para calcular los techos. ............................................................... 37
Figura 24. Ventana con la visualización de las velocidades verticales máximas con su
altitud correspondiente y el techo absoluto y de servicio. ............................................. 38
Figura 25. Gráfica del tiempo que tarda el avión en subir cierta altitud (ejemplo)......... 39
Figura 26. Ventana para obtener las hodógrafas de descenso. ................................... 40
Figura 27. Hodógrafas de descenso (ejemplo con una polar con más valores). .......... 41
Figura 28. Hodógrafas de descenso (ejemplo con una polar con menos valores). ....... 41
Figura 29. Recorridos parciales durante el aterrizaje. .................................................. 42
Figura 30. Ventana para calcular las distancias de aterrizaje a diferentes altitudes. .... 46
Figura 31. Ventana con las distancias de aterrizaje a diferentes altitudes (ejemplo). ... 47
Figura 32. Representación de un viraje coordinado alrededor del eje z. ...................... 47
Figura 33. Ventana para calcular la velocidad tangencial y el radio de viraje. .............. 48
Figura 34. Ventana con los resultados de la velocidad tangencial y el radio de viraje
(ejemplo). ..................................................................................................................... 49
Figura 35. Vista de la ventana para calcular el alcance y la autonomía del avión. ....... 51
Figura 36. Cálculo del alcance y autonomía del avión (ejemplo). ................................. 52
VIII
Resumen
El presente trabajo muestra el desarrollo de una aplicación gráfica con ayuda de Matlab
App Designer, para calcular los rendimientos y las actuaciones de un avión monomotor
de combustión interna con hélice. Esto con el fin de hacer más didáctico y educativo el
cálculo de los parámetros antes mencionados.
Los tópicos están basados en algunos de los temas del plan y programa de la asignatura
de Mecánica de Vuelo que se imparte especialmente en las aulas de la ESIME Ticomán,
debido a que el objetivo general se centra en los estudiantes y profesores de dicha
escuela.
La aplicación está subdividida en varias interfaces seriadas, para tener una mejor
visualización y acomodo de los resultados.
Abstract
This paper shows the development of a graphical application using Matlab App Designer,
to calculate the performance of a single-engine internal combustion aircraft with a
propeller. This in order to make the calculation of the parameters previously mentioned
more didactic and educational.
This work is based on some of the topics of the flight mechanics program which is taught
at ESIME Ticoman classrooms, because the general objective is focused on the students
and teachers of said school.
1
Introducción
El presente trabajo muestra el desarrollo de una aplicación gráfica en Matlab que realiza
algunos cálculos de un avión monomotor de combustión interna con hélice que usa un
motor (para ejemplificar) Lycoming IO-540-AC, relacionados a la mecánica de vuelo
(rendimientos y actuaciones), enfocada en los temas vistos en la unidad de aprendizaje
con dicho nombre en la ESIME Ticomán.
Esta aplicación es de uso didáctico, pero podría funcionar como base para el desarrollo
de otra aplicación más detallada que considere otros datos del avión.
La aplicación gráfica está hecha con varias interfaces gráficas, las cuales son
consecutivas y deben usarse en orden, como lo marca el temario, puesto que son
dependientes. La AG arrastra resultados y valores de IG anteriores, por ello, hay IG que
no solicitan algún dato puesto que ya cuenta con ellos. Para pasar de una a otra, el
usuario debe de dar clic en el botón de “siguiente paso” o “siguiente” para así pasar a la
IG consecutiva.
Las fórmulas utilizadas por la AG se muestran en cada tema, las cuales fueron
investigadas en diversas fuentes y fueron programadas por los integrantes del equipo de
este trabajo. Para la realización de las operaciones, se observará que se le solicitan
datos al usuario, dichos datos solicitados tienen una combinación de sistemas de
unidades (pero los programas ya cuentan con la conversión respectiva de unidades para
que se obtenga el valor correcto), por la siguiente razón: la ley mexicana indica que el
sistema de unidades y medidas que debemos usar es el Internacional, pero como bien
se sabe, tenemos cierta interdependencia con EUA, por lo que nos precisa a usar el
sistema inglés, y más si está enfocado a la industria aeronáutica.
Con el paso de los años se ha generado una jerga, un lenguaje técnico y una simbología
particular del entorno aeronáutico. Dicho esto, los datos ingresados por el usuario en la
AG están en las unidades más usadas en nuestro lenguaje técnico aeronáutico,
2
combinando las unidades y cantidades más reconocidas y usadas, sin importar el
sistema.
Antecedentes
El desarrollo y uso de herramientas tecnológicas como los lenguajes de programación y
el diseño de aplicaciones gráficas orientadas a la aplicación en ingeniería cada vez es
mayor, sin embargo, el desarrollo de software por parte de estudiantes es un área de
investigación y desarrollo que no ocurre con tanta frecuencia.
Por lo tanto, estudiar, entender y controlar el cúmulo información que participa en dicho
proyecto se convierte en una tarea tan laboriosa que puede resultar onerosa.
3
Las hojas electrónicas y las bases de datos son herramientas muy útiles para facilitar el
trabajo, sin embargo, consideramos que esta situación se puede mejorar.
Alcance
Esta es la versión 1 de una aplicación gráfica que realiza el cálculo, en una primera
aproximación, de los rendimientos y actuaciones de un avión en régimen subsónico, de
ala fija, con un motor de combustión interna sin sobrealimentación y con una hélice de
paso fijo.
Tiene un enfoque didáctico que se apega a los temas del programa de la unidad de
aprendizaje de Mecánica de Vuelo de sexto semestre de la carrera de ingeniería
aeronáutica por lo que se perfila como una propuesta que se pone a consideración de
profesores y alumnos de la ESIME Ticomán.
La aplicación servirá para un avión que cumpla y se desempeñe bajo las siguientes
características:
4
• El usuario cuenta con la polar del avión en su ‘zona útil’ de un coeficiente de
levantamiento igual a cero hasta el máximo.
• El usuario cuenta con la ficha técnica del motor, así como las gráficas
representativas de la hélice tales como: la gráfica de eficiencia contra parámetro
de similitud y coeficiente de tracción contra parámetro de similitud.
• La velocidad de rotación de la hélice será igual a las rpm del motor, no hay un
sistema de reducción o ampliación de rpm.
• No se toman en cuenta ciertos datos estructurales como lo es el factor de carga
(relación entre fuerzas normales al plano y el peso).
• La dirección del viento siempre es opuesta a la dirección del avión.
• El avión no realiza vuelos acrobáticos.
• Las condiciones meteorológicas son normales y permiten la operación del vuelo
en todo momento.
• El avión se encuentra en perfectas condiciones, sin alguna falla en cualquiera de
sus componentes.
Justificación
5
Por otro lado, Matlab es un lenguaje de programación diseñado especialmente para
ingenieros y científicos, superando en mucho las capacidades de cálculo del Excel. Con
ayuda de códigos de programación, el Matlab puede realizar cálculos, obtener los
resultados en tablas y gráficas y realizar las operaciones de manera más sencilla y
rápida, además, con la programación orientada a objetos podemos desarrollar una
aplicación gráfica para realizar los cálculos de manera intuitiva, rápida y precisa teniendo
conocimiento de los cálculos que se están realizando con el código escrito por nosotros
mismos.
Con este proyecto se realizará una aplicación gráfica, para la academia de Aerodinámica,
con la cual alumnos y profesores pueden hacer uso de ella tanto para fines didácticos
como para implementarla en distintas fases del cálculo de algunos de los rendimientos y
actuaciones de un avión con la finalidad de mostrar de una manera tangible cómo es que
los rendimientos del avión se ven afectados al momento de seleccionar un cierto sistema
de propulsión o por la variación de la densidad, además de ahorrar tiempo, ser más
productivo, comparar resultados y tener la opción de simular cambios, por ejemplo, al
elegir el sistema de propulsión para cierto avión.
Objetivo general
Desarrollar una aplicación gráfica con enfoque didáctico que realice el cálculo preliminar
de los rendimientos y actuaciones de un avión monomotor de combustión interna con
hélice, partiendo de su aerodinámica básica para determinar en una primera
aproximación sus capacidades de cumplir cierto perfil de misión.
Objetivos específicos
Identificar las ecuaciones que gobiernan a la física del avión para la obtención de las
actuaciones y rendimientos de este.
6
Utilizar la sintaxis correcta del lenguaje de programación (MATLAB) para hacer un uso
eficaz de los recursos del ordenador.
Metodología
Se afirma lo anterior por considerar la gran importancia que tienen los tiempos para el
desarrollo del proceso institucional de titulación curricular del IPN, dentro del cual se
realiza este proyecto, y en donde se impone un calendario para el cumplimiento de cada
etapa del proyecto.
En este capítulo se realizan las interfaces gráficas para los cálculos de algunos de los
rendimientos de un avión monomotor de combustión interna propulsado con hélice, como
lo son: corrección de potencia, potencia disponible, potencia requerida y las gráficas de
potencia disponible contra la potencia requerida.
Capítulo 2. Actuaciones
En este capítulo se realizan las interfaces gráficas para los cálculos de las actuaciones
de un avión monomotor de combustión interna propulsado con hélice, como lo son:
ascenso, tiempo de ascenso, techos, aterrizaje, viraje, alcance y autonomía.
8
Capítulo 1-. Rendimientos
Sistema de Propulsión
El sistema de propulsión lo integran dos componentes primarios: un motor y un elemento
mecánico que convierte la energía del motor en una fuerza de empuje o tracción, en este
caso, una hélice.
Motor
La AG está desarrollada para aviones de ala fija propulsadas con un motor de combustión
interna alternativo no sobrealimentado con el uso de una hélice de paso fijo. El usuario
debe contar con la ficha técnica del motor que piensa utilizar y deberá ingresar algunos
valores que se mostrarán en el desarrollo de este tema para que se realicen los cálculos
correspondientes, también deberá contar con la gráfica de eficiencia de la hélice J-n.
Conforme la altitud a la que opera el motor cambia, también lo hacen las características
del aire con el cual se realiza la mezcla aire-combustible, cambiando por lo tanto su
rendimiento y su potencia.
9
Figura 1. Curvas de desempeño a diferentes altitudes para un motor Lycoming IO-540-AC.
La AG permite al usuario elegir entre dos opciones para obtener la potencia del motor y
rpm a diferentes altitudes. Una vez iniciando la aplicación se observa una interfaz como
en la Figura 2.
10
Figura 2. Portada de la AG en Matlab (appdesigner).
Una vez pulsando el botón “INICIAR” la aplicación despliega dos opciones para escoger
y así obtener los datos de la potencia del motor, como se observa en la Figura 3.
Figura 3. Opciones para escoger y así obtener los datos de la potencia del motor.
11
OPCIÓN 1.
La primera opción permite al usuario únicamente ingresar la potencia del motor a nivel
del mar con sus respectivos regímenes de giro (rpm), el libro “Theory of flight” de Richard
Von Mises desarrolla una fórmula con un factor de aproximación de la potencia al freno
en condiciones atmosféricas promedio, expresada de la siguiente forma:
p ϒ 𝑝
h [ft] θ [°F] σ
[in. Hg] [lb. / ft.3] 𝑝0
12
Para que en la AG el usuario pueda ingresar cualquier altitud se realizó una función de
𝜎 con respecto a la altitud, donde se obtuvo un polinomio de segundo grado dado por la
ecuación (2).
Con la cual se realizó un gráfico comparativo entre los datos de la Tabla 1 y los valores
para la función obtenida como se muestra en la Figura (4).
Una vez que se tiene el valor de sigma, se puede calcular el factor de corrección de
potencia por altitud y multiplicarlo por la potencia especificada en la ficha técnica a nivel
del mar. Como ejemplo se utiliza la ficha técnica del motor Lycoming IO-540-AC.
Una vez conocida la potencia del motor al nivel del mar a diferentes revoluciones por
minuto se hace uso de la siguiente ecuación para el cálculo de la potencia requerida por
la variación en la altitud.
13
El usuario debe ingresar los datos requeridos (como lo especifica la AG). Para
ejemplificar como trabaja la aplicación, se ingresan todos los datos de potencia y sus
correspondientes rpm del motor que se está usando de ejemplo.
El usuario es libre de elegir las altitudes a las que desea hacer la corrección de potencia.
Las altitudes son ingresadas en pies debido a que en las fichas técnicas de los motores
encontraremos estos datos en esas unidades, sin embargo, cuando se realicen los
cálculos de potencia estas altitudes se mostraran en metros, y la potencia en HP debido
a que es más tangible leer en términos de ingeniería estas unidades, agregando también
que la aplicación, una vez realizados los cálculos guardará un archivo en Excel con los
datos en el sistema internacional y el sistema inglés.
Los datos ingresados en la aplicación (habiendo escogido la opción 1), son los solicitados
por la interfaz, como lo son: las rpm; la potencia correspondiente a cada rpm
correspondientes al nivel del mar; las altitudes a las cuales se desea realizar la corrección
de potencia (mínimo seis, puesto que son necesarias para hacer otros cálculos más
adelante); las rpm de máxima eficiencia que el fabricante del motor debe proporcionar y;
la altitud de crucero inicialmente propuesta. Estos últimos dos datos deben de coincidir
con alguno de los datos ya ingresados que están entre corchetes en la AG, como se
muestra en la Figura 5.
14
Figura 5. Solicitud de datos después de haber seleccionado la opción 1 (ejemplo).
Una vez llenado lo solicitado, se debe dar clic en el botón “OBTENER GRÁFICA”,
después de esto, la AG realiza los cálculos y muestra los resultados como en la Figura
6.
15
Figura 6. Visualización de la potencia corregida por altitud (ejemplo, opción 1).
“OPCIÓN 2”
La otra opción será que el usuario ingrese la potencia del motor en 2 diferentes altitudes:
nivel del mar y la altitud máxima permitida por el motor, correspondiente a cada rpm. El
programa realizará una regresión lineal con los puntos dados.
16
Figura 7. Solicitud de datos después de haber seleccionado la opción 2 (ejemplo).
Los valores obtenidos están limitados a la altitud en donde realmente el motor puede
producir potencia a un cierto número de rpm y no como en la primera opción, en donde
17
la fórmula teórica seguiría dando valores para todas las altitudes y distintos valores para
las rpm aunque en la realidad el motor no tenga la capacidad de operar.
Hélice
Como se mencionó anteriormente, la AG está desarrollada para que los cálculos
realizados sean aplicados a una aeronave monomotor con una hélice de paso fijo.
El tomo 4 de los libros de C. Ordoñez contiene un compendio de hélices de paso fijo que
utilizan los perfiles aerodinámicos Clark-Y y RAF-6, de entre las cuales se toman
ejemplos para este proyecto. Sin embargo, existen otros perfiles para hélices tales como
el USA-35B y los N.A.C.A. 2R2003, 6400, 4400 (para la mitad interior) y 2400-34 (para
la mitad exterior), los perfiles Eppler entre otros más.
En los ensayos efectuados con los perfiles Clark-Y y el R.A.F.-6 se ha visto que el
rendimiento máximo, con el primero llega a ser alrededor de un 3% mayor que con el
segundo. Para propósitos de ejemplificar el funcionamiento de la aplicación usamos una
hélice Clark Y de tres palas y con un ángulo de paso de 30°.
El usuario previamente debe hacer la selección de la hélice que tiene pensada utilizar
para la aeronave, la aplicación gráfica le permitirá al usuario obtener los datos de la
gráfica de parámetro de similitud J contra eficiencia de la hélice, esto con la finalidad de
utilizar esos datos para el cálculo de la potencia disponible, mediante el uso de una
aplicación desarrollada por Matlab: “Grabit”. Cabe resaltar que cada vez que se utilice
Grabit, los valores obtenidos serán un aproximado a los valores reales, puesto que
18
dependerá de la precisión que tenga el usuario para colocar los puntos en el lugar
correcto.
19
Figura 10.- Uso de Grabit usando una gráfica tomada del libro de Ordoñez sobre el rendimiento de una hélice 5868-9
Clark-Y de tres palas (ejemplo).
Potencia Disponible
El sistema de propulsión motor–hélice utilizado será capaz de producir cierta potencia
dependiendo las condiciones en las que opere. Como ya se había visto anteriormente,
el motor que se está utilizando de ejemplo junto con la hélice de paso fijo, sólo puede
utilizar toda la potencia del motor para una determinada velocidad. A velocidades
inferiores la hélice frenaría el motor, y a velocidades superiores sería preciso reducir la
potencia del motor, para evitar una excesiva aceleración.
Por esto, tal tipo de hélices no se utiliza actualmente más que en aviones civiles lentos,
de poco peso y baratos.
20
Si llamamos P a la potencia del motor y ƞ al rendimiento del propulsor (variable para
cada ángulo de las palas y para los distintos valores de J y de Cs), la potencia disponible,
Pd, será:
𝑃𝑑 = 𝜂 𝑃 (4)
Una vez que se cargan los datos de la gráfica, el código generará un polinomio de grado
8 con un ajuste aceptable para su utilización en el cálculo de la eficiencia, η, en función
del parámetro de similitud J de la hélice. Cabe señalar que este ajuste es una
aproximación a la curva real, la precisión dependerá de varios factores como la curva
utilizada y la precisión del usuario para extraer los datos de la gráfica.
Figura 11. J vs ƞ, obtenida por el usuario utilizando la aplicación Grabit de acuerdo al ángulo de inclinación de las
palas de la hélice (ejemplo).
𝑉
𝐽= (5)
𝑛ℎ 𝐷
21
Donde nh es la velocidad de rotación de la hélice, D es el diámetro de la hélice el cual se
mantiene constante (este parámetro a su vez se relaciona con la eficiencia η y otros
coeficientes como el coeficiente de tracción 𝐶𝑇 , coeficiente de potencia 𝐶𝑃 , entre otros),
y V es la velocidad del avión (se calcula despejándola de la formula general de
levantamiento).
2𝑊
𝑉=√ (6)
𝜑 𝑆 𝐶𝐿
Donde:
φ es la densidad del aire para la cual se cargaron los datos con ayuda del anexo A, esto
con la finalidad de que el usuario pueda ingresar cualquier altitud y la aplicación pueda
obtener la densidad a dichas altitudes.
La aplicación considera que la hélice esta acoplada directamente al motor, por lo tanto,
velocidad de giro de la hélice será igual a las rpm del motor
Una vez realizados los cálculos para J dentro del rango de velocidades establecidos por
la polar del avión, se usará el polinomio establecido para calcular 𝜂 y posteriormente se
empleará la ecuación 4 para el cálculo de la potencia disponible.
22
En esta parte, la aplicación tiene un diseño como se muestra en la figura 12, en donde
aparecen los datos que el usuario debe ingresar como lo son: el peso del avión; superficie
alar; diámetro de la hélice; el nombre del archivo de la gráfica de rendimiento de la hélice
y la polar de la aeronave.
Así mismo, permite elegir al usuario entre las dos opciones mencionadas con
anterioridad para la potencia del motor debido a la altitud, debe seleccionar la opción
que eligió en un principio ya sea la corrección de potencia por altitud mediante el factor
de corrección o por los datos de la ficha técnica.
Y los resultados se mostrarán en una gráfica de la velocidad horizontal del avión contra
la potencia disponible del motor para todas las altitudes ingresadas previamente por el
usuario y la gráfica se ve como la siguiente Figura 13.
23
Figura 13. Gráfica de potencia disponible a diferentes altitudes (ejemplo).
Potencia requerida
Para que el avión opere a diversas altitudes y velocidades, así como efectuar diferentes
maniobras, dependerá del excedente de potencia, el cual resulta de restar a la potencia
disponible la potencia requerida.
24
Si la potencia disponible fuese menor que la requerida y se requiere conservar la
velocidad, entonces la aeronave tendría que descender.
La aplicación abre una ventana como se muestra en la Figura 14, en donde los datos
que se requieren ya fueron ingresados por el usuario con anterioridad, como lo es: la
polar de la aeronave; las altitudes y; el cálculo de la potencia disponible, para mostrar las
gráficas comparativas de potencia disponible y potencia requerida en función de la
velocidad. Así como en la interfaz de la potencia disponible, el usuario debe seleccionar
la opción que eligió en un principio: por factor de corrección o por datos de ficha
técnica.
𝐷𝑑 = 0.5 𝜑 𝑉 2 𝑆 𝐶𝐷 (7)
Y después lo multiplica por la velocidad para obtener unidades de potencia (Watts) y así
poder hacer la conversión de (Watts) a HP, se utiliza un factor de corrección, el cual se
demuestra a continuación para poder realizar la conversión de unidades.
𝑃 = 𝐷𝑑 ∗ 𝑉 ∗ 0.001341 (8)
𝑁𝑚 0.2248 𝑙𝑏 3.28 𝑓𝑡 1 𝐻𝑝
1[ ][ ][ ][ ] = 0.001341
𝑠 1𝑁 1𝑚 𝑙𝑏𝑓𝑡
550 𝑠
25
Figura 14. Ventana que muestra la aplicación para graficar la potencia disponible vs la potencia requerida.
26
27
Figura 15. Gráficas que muestran la comparación de la potencia disponible vs la potencia requerida a diferentes
altitudes (ejemplos).
28
Capítulo 2. Actuaciones.
Despegue
Según la RAE, el despegue se define como la acción y efecto de despegar (separarse
un vehículo, que en nuestro caso es una aeronave, del suelo, agua o cubierta de un
barco al iniciar el vuelo).
El despegue está compuesto por tres recorridos parciales (que son las proyecciones de
la trayectoria de despegue sobre el suelo), como se observa en la Figura 16:
29
Recorrido horizontal
Para calcular el recorrido horizontal, hay que tener ciertos elementos, el primero de ellos
es obtener la tracción inicial cuando la velocidad es igual a cero:
𝑇0 = 𝜑 𝑛ℎ 2 𝐷 4 𝐶𝑇0 (9)
Y la tracción de despegue cuando la velocidad sea igual a la velocidad de despegue:
𝑇𝑑 = 𝜑 𝑛ℎ 2 𝐷 4 𝐶𝑇𝑑 (10)
Donde los coeficientes de tracción se obtendrán de una gráfica que el usuario tiene
disponible de acuerdo con el tipo y número de hélices seleccionadas, usando la
aplicación de Grabit, como se muestra en la Figura 17:
Figura 17. Uso de Grabit para obtener los valores de los coeficientes de tracción para la hélice seleccionada
(ejemplo).
𝐹𝑓0 = 𝜇𝑑 𝑊𝑖 (11)
Los coeficientes de fricción (para el caso del despegue, se deben usar los coeficientes
de fricción a la rodadura sin frenos) se obtienen de tablas como la siguiente, en la cual
se muestran algunos ejemplos:
30
Tabla 2. Coeficientes de fricción a la rodadura (típicos valores)
𝐹𝑓𝑑 = 𝜇𝑑 ( 𝑊𝑖 − 𝐿𝑑 ) (12)
Donde:
1 2
𝐿𝑑 = 𝑉 𝑆 𝜑 𝐶𝐿 𝛽 𝑚𝑎𝑥 (13)
2 𝑑
Donde:
𝐹0 = 𝑇0 − 𝐹𝑓0 (15)
La fuerza neta de tracción cuando la velocidad es igual a la velocidad de despegue:
𝐹𝑑 = 𝑇𝑑 − 𝐹𝑓𝑑 − 𝐷𝑑 (16)
Donde:
1 2
𝐷𝑑 = 𝑉 𝑆 𝜑 𝐶𝐷 𝛽 𝑚𝑎𝑥 (17)
2 𝑑
Ya que se obtuvieron las fuerzas netas, se calcula la fuerza de tracción media:
31
𝐹0 − 𝐹𝑑
𝐹𝑚 =
𝐹 (18)
ln (𝐹0 )
𝑑
𝑊𝑖 ∗ 𝑉𝑑 2
𝑋ℎ = (19)
2 ∗ 𝑔 ∗ 𝐹𝑚
Recorrido de transición
El ángulo de transición esta dado por:
𝑇𝑑 − 𝐷𝑑
𝜃𝑡𝑠 ≈ (20)
𝑊𝑖
Y el radio por:
𝑉𝑑 2
𝑟𝑡 = (21)
0.44 𝑔
La fórmula para calcular el recorrido de transición es:
𝑋𝑡 = 𝑟𝑡 ∗ 𝜃𝑡𝑠 (22)
Recorrido de subida
La fórmula para calcular el recorrido de subida es:
𝐻𝐴
𝑋𝑠 = (23)
𝜃𝑡𝑠
Donde:
𝐻𝐴 = ℎ𝑟 − 𝐻𝑅 (24)
Donde:
𝑋𝑡 ∗ 𝜃𝑡𝑠
𝐻𝑅 ≈ (25)
2
Recorrido total
Es igual a la suma de los tres recorridos anteriores:
𝑋𝑇 = 𝑋ℎ + 𝑋𝑡 + 𝑋𝑠 (26)
Visto en la aplicación, tiene una visualización como en la Figura 18.
32
Figura 18. Ventana de la aplicación que muestra las distancias de despegue para cada altitud.
Como se puede observar, solo pide el nombre del archivo que se obtuvo con la aplicación
Grabit para calcular los coeficientes de tracción. La AG está programada para
seleccionar los valores correspondientes sin necesidad que el usuario los ingrese de
manera manual.
Figura 19. Tabla de algunos de los coeficientes de fricción a la rodadura que se mostraría si se presiona el botón
"Tabla de coeficientess".
33
Al ingresar estos dos datos, el usuario tiene que dar clic en “OBTENER DATOS”.
Después de darle clic, se podrá observar una tabla del lado derecho, esta tabla mostrará
las distancias totales (redondeadas) de despegue a las diferentes altitudes que el usuario
ingresó anteriormente, como se observa en la Figura 20.
Figura 20. Ventana de la aplicación que muestra las distancias de despegue para cada altitud (ejemplo).
Ascenso
El ascenso es la operación que realiza una aeronave para ganar altura combinando
adecuadamente la potencia y actitud de dicha aeronave.
Hodógrafas de ascenso
Para graficar las hodógrafas de ascenso se debe de calcular las componentes de las
velocidades verticales y horizontales a las cual va el avión a cierta altitud.
34
𝐸𝑥𝑐𝑒𝑑𝑒𝑛𝑡𝑒 𝑑𝑒 𝑝𝑜𝑡𝑒𝑛𝑐𝑖𝑎 𝑃𝑑 − 𝑃𝑟
𝑉𝑣𝑎 = = (27)
𝑃𝑒𝑠𝑜 𝑊𝑖
Como bien se sabe, el excedente de potencia será diferente para cada altitud, por lo
tanto, la aplicación arrastrará cada una de las potencias disponibles y requeridas y
calculará su excedente de potencia.
No es necesario solicitar algún dato, puesto que ya se tienen los valores calculados con
interfaces utilizadas con anterioridad.
35
la gráfica tendría una línea recta que va del último valor positivo al cero y no sería una
buena presentación, es por eso por lo que se gráfica con los círculos.
Para fines didácticos, las hodógrafas de ascenso ayudan a visualizar mejor los valores
de las componentes de velocidades verticales, desde la mínima a la máxima para cada
altitud.
Techos
Techo absoluto
Es sabido que la velocidad de ascenso y la densidad del aire disminuyen cuando
incrementa la altitud de vuelo, cuando la velocidad de ascensional sea nula, se puede
decir que esa es la máxima altitud que puede alcanzar una aeronave, es decir, llega al
techo absoluto. A esta altura el vuelo debería de ser horizontal y a una única velocidad.
36
Techo operacional
Cuando las condiciones meteorológicas no son favorables o el vuelo se realiza sobre
terreno montañoso, para los aviones comerciales o militares en formación, se utiliza el
techo operacional, donde la velocidad ascensional es algo mayor. Para estos casos, se
utiliza una velocidad vertical estándar de 90 a 150 metros por minuto. Por estas razones,
la aplicación no calculará el techo operacional.
Lo único que hay que hacer es darle clic en “OBTENER DATOS”, como se presenta en
la Figura 23.
Después de haberle dado clic, mostrará una tabla donde se presenta la altitud y su
velocidad vertical máxima correspondiente; también le dará al usuario el techo absoluto
y el techo de servicio del avión, como se muestra en la siguiente Figura 24.
37
Figura 24. Ventana con la visualización de las velocidades verticales máximas con su altitud correspondiente y el
techo absoluto y de servicio.
Tiempo de ascenso
El tiempo que tarda un avión para subir, desde una altitud igual a cero hasta otra menor
al techo absoluto se calcula con la siguiente ecuación:
𝐻 𝐻
𝑡𝑎 = ln ( ) (29)
𝑉𝑣 max 𝑒𝑛 ℎ=0 𝐻−𝑧
Donde z es la altitud a la cual se desea calcular el tiempo para llegar a ella.
La gráfica del tiempo para cada altitud se obtendrá con la ayuda de la interfaz que calcula
los techos del avión.
38
Figura 25. Gráfica del tiempo que tarda el avión en subir cierta altitud (ejemplo).
Descenso
Hodógrafas de descenso
En las hodógrafas de ascenso y descenso, es necesario obtener las componentes de las
velocidades verticales y horizontales, donde la componente de la velocidad vertical en
descenso se obtiene como:
2 𝑊𝑖 cos 𝜃𝑑
𝑉𝑑𝑒 = √ (32)
𝜑 𝑆 𝐶𝐿
Y:
1
𝜃𝑑 = 𝑎𝑡𝑎𝑛 (
𝐶𝐿
) (33)
⁄𝐶
𝐷
39
Los coeficientes de sustentación y de arrastre se obtienen de la polar del avión. La
aplicación arrastra esos valores para cada ángulo de ataque y realiza la operación.
Se recomienda usar una cantidad suficientes de valores en la polar del avión, puesto
que, si se usan muy pocos especialmente en la zona próxima a ángulos de ataque
pequeños, las hodógrafas tendrían una visualización como en la Figura 28, pero si se
usan los correctos, las hodógrafas tendrán una mejor visualización como en la Figura 27.
40
Figura 27. Hodógrafas de descenso (ejemplo con una polar con más valores).
Figura 28. Hodógrafas de descenso (ejemplo con una polar con menos valores).
41
Donde el eje de las ordenadas representa las componentes de las velocidades verticales
(de descenso) y el eje de las abscisas las componentes de las velocidades horizontales
(de descenso).
Aterrizaje
Al igual que para el despegue, existen tres distancias (proyecciones sobre el suelo) para
realizar el aterrizaje, los cuales podemos visualizar con la siguiente Figura 29.
42
Distancia de aproximación
Primeramente, se calculan ciertas velocidades:
1. La velocidad de aproximación:
𝑉𝑓 = 1.23 𝑉𝑠 (36)
Con estos datos, se puede calcular el 𝐶𝐿𝑎 , en el primer tramo de la carrera de aterrizaje,
se utilizará la velocidad de aproximación 𝑉𝑎 :
2 𝐿𝑎
𝐶𝐿𝑎 = (37)
𝜑 𝑉𝑎𝑝 2 𝑆
Teniendo el coeficiente de levantamiento podemos obtener el coeficiente de arrastre
total:
𝑆𝑤𝑒𝑡 𝐶𝑙𝑎 2
𝐶𝐷𝑎 = 𝐶𝑓𝑒 + (38)
𝑆 𝜋𝐴𝑅𝑒
El coeficiente de fricción de piel equivalente se obtiene de la Tabla 3.
43
Como se puede observar, para los aviones ligeros monomotor (para los cuales la AG
está programada), el coeficiente de fricción superficial equivalente tiene un valor de
0.0055, con el cual se calcula el coeficiente de arrastre parásito al cual se le suma el
coeficiente de arrastre inducido para obtener el CDa del avión y con él, determinar la
fuerza de arrastre total.
1
𝐷𝑎 = 𝜑 𝑉𝑎𝑝 2 𝑆 𝐶𝐷𝑎 (39)
2
Y con los resultados anteriores, finalmente se encuentra la distancia de aproximación:
𝐿𝑎
𝑋𝑎 = ℎ𝑟 (40)
𝐷𝑎
Y el ángulo de planeo:
𝐷𝑎
𝜃𝑝 ≈ ( ) (41)
𝐿𝑎
𝑉𝑓 2
𝑟𝑛 = (42)
0.2 𝑔
Por lo tanto:
𝑋𝑡𝑎 = 𝑟𝑛 𝑠𝑒𝑛 𝜃𝑝 (43)
44
Para el primer caso, donde no hay aplicación de los frenos en la rodadura, se calcula el
coeficiente de sustentación:
2𝐿
𝐶𝐿𝑟 = (44)
𝜑 𝑉𝑠 2 𝑆
Para así poder calcular el coeficiente de arrastre:
𝑆𝑤𝑒𝑡 𝐶𝑙𝑟 2
𝐶𝐷𝑟 = 𝐶𝑓𝑒 + (45)
𝑆 𝜋𝐴𝑅𝑒
Y posteriormente el arrastre:
1
𝐷𝑟 = 𝜑 𝑉𝑠 2 𝑆 𝐶𝐷𝑟 (46)
2
Finalmente, se obtiene la distancia de rodadura (sin la aplicación de los frenos en la
rodadura) con la siguiente ecuación:
𝑉𝑠 2 𝐿 𝑎 𝜇𝑎
𝑋ℎ𝑎 = 𝑙𝑜𝑔 ( ) (47)
𝐷 𝐷𝑟
2 𝑔 (𝜇𝑎 − 𝐿 𝑟 )
𝑎
Para este caso donde existe la aplicación de los frenos en la rodadura, primero se calcula
la distancia donde el avión toca el piso y sigue sin accionar los frenos durante 3
segundos:
𝑉𝑠 2 𝐿 𝑎 𝜇𝑓
𝑋𝑓𝑎 = 𝑙𝑜𝑔 ( ) (49)
𝐷 𝐷𝑟
2𝑔 (𝜇𝑓 − 𝐿 𝑟 )
𝑎
45
𝑋𝑡𝑎𝑠 = 𝑋𝑎 + 𝑋𝑡𝑎 + 𝑋ℎ𝑎 (50)
La distancia total de la carrera de aterrizaje con la aplicación de los frenos sobre la
rodadura será:
Figura 30. Ventana para calcular las distancias de aterrizaje a diferentes altitudes.
46
Figura 31. Ventana con las distancias de aterrizaje a diferentes altitudes (ejemplo).
En la realización del cálculo del viraje solo se obtendrán la velocidad tangencial y el radio
de viraje del aeroplano, puesto que, como se mencionó en el alcance de este trabajo, no
se centra en cuestiones estructurales y por lo tanto está limitada a no utilizar otras
variables como lo es el factor de carga.
47
Considerando que la aeronave cuenta con instrumentos que indican el ángulo de
inclinación lateral llamado peralte (también conocido como ángulo de banqueo) y la
velocidad a la cual va el avión, se puede calcular la velocidad tangencial con la siguiente
formula:
𝑉
𝑉𝑡𝑣 = (52)
√cos (𝛾𝑝 )
Y el radio de viraje con:
𝑉2
𝑟𝑣 = (53)
𝑔 tan (𝛾𝑝 )
Mostrando una interfaz como en la Figura 32.
48
Figura 34. Ventana con los resultados de la velocidad tangencial y el radio de viraje (ejemplo).
Alcance
La distancia que una aeronave es capaz de recorrer volando a una velocidad crucero se
le conoce como alcance. El alcance máximo se determina considerando el uso de todo
el combustible en tanques (mantenido la cantidad de reserva), y volando con fineza
máxima.
𝜂 𝐶𝐿 𝑊𝑖
𝐴𝑙𝑐𝑎𝑛𝑐𝑒 = ln ( ) (54)
𝐶𝑜𝑛𝑠 𝐶𝐷 𝑊𝑓
𝑃𝑀𝐶
𝐶𝑜𝑛𝑠
es el consumo específico de combustible el cual resulta de relacionar el peso de
𝑃𝑀𝐶
49
PMC (potencia máxima continua) la cual corresponde a la mejor eficiencia de
funcionamiento del motor.
𝐶𝐿
𝛽= (57)
𝐶𝐷
Autonomía
El tiempo que una aeronave puede permanecer en vuelo con cierta cantidad de
combustible se le conoce como autonomía.
Al igual que el alcance, se hace hincapié que el avión realiza un vuelo con una altitud
crucero. La expresión matemática que utilizar es la siguiente:
𝜂 1 1
𝐴𝑢𝑡𝑜𝑛𝑜𝑚í𝑎 = 𝐶𝑆 √2 𝜑𝑐 𝑆 ( − ) (58)
𝐶𝑜𝑛𝑠 √𝑊𝑖 √𝑊𝑓
𝑃𝑀𝐶
50
Figura 35. Vista de la ventana para calcular el alcance y la autonomía del avión.
Donde se le pide al usuario ingresar los valores de: velocidad de crucero (para calcular
la altitud de crucero y a su vez, su densidad la cual es utilizada en las fórmulas antes
mencionadas); el consumo de combustible y; el peso del combustible a bordo.
51
Figura 36. Cálculo del alcance y autonomía del avión (ejemplo).
52
Conclusiones
Se desarrolló una aplicación gráfica que realiza el cálculo de algunos de los rendimientos
y actuaciones de un avión monomotor de combustión interna con hélice, para obtener en
una primera aproximación “rápida y económica”, una serie de parámetros que permitan
cuantificar la factibilidad de que el avión pueda cumplir con cierto perfil de misión.
Se perfila como una AG que, acompañada con el documento escrito de este trabajo, de
apoyo didáctico y eventualmente como una herramienta de cálculo conceptual de la
mecánica de vuelo de utilidad en la primera fase de diseño de un avión.
La tecnología avanza muy rápido, por lo tanto, no se puede quedar estancado con el uso
de ciertas aplicaciones u hojas de cálculo (como lo es Excel), para realizar trabajos o
proyectos de capacidad ingenieril.
53
Anexos
Anexo A. Propiedades de la atmosfera a grandes altitudes (Tabla A-16 del libro de
Cengel, página 933, 7ma edición).
54
Anexo B. Código para la portada de la AG
classdef Portada_uno < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
INSTITUTOPOLITCNICONACIONALLabel matlab.ui.control.Label
Image2 matlab.ui.control.Image
Image3 matlab.ui.control.Image
Label matlab.ui.control.Label
AlumnosRodriguezClaudioFernandoTimoteoLabel matlab.ui.control.Label
INICIARButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: INICIARButton
function INICIARButtonPushed(app, event)
open(opciones)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [-3 177 648 185];
app.Image.ImageSource = 'Skylane.png';
% Create INSTITUTOPOLITCNICONACIONALLabel
app.INSTITUTOPOLITCNICONACIONALLabel = uilabel(app.UIFigure);
app.INSTITUTOPOLITCNICONACIONALLabel.HorizontalAlignment = 'center';
app.INSTITUTOPOLITCNICONACIONALLabel.FontSize = 16;
app.INSTITUTOPOLITCNICONACIONALLabel.FontWeight = 'bold';
app.INSTITUTOPOLITCNICONACIONALLabel.Position = [37 386 567 64];
app.INSTITUTOPOLITCNICONACIONALLabel.Text = {'INSTITUTO
POLITÉCNICO NACIONAL'; 'ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y
ELÉCTRICA '; 'UNIDAD TICOMAN '};
% Create Image2
app.Image2 = uiimage(app.UIFigure);
app.Image2.Position = [-11 361 108 114];
app.Image2.ImageSource = 'ipnlogo.png';
55
% Create Image3
app.Image3 = uiimage(app.UIFigure);
app.Image3.Position = [566 382 67 73];
app.Image3.ImageSource = 'esimelogo.png';
% Create Label
app.Label = uilabel(app.UIFigure);
app.Label.HorizontalAlignment = 'center';
app.Label.FontSize = 16;
app.Label.FontWeight = 'bold';
app.Label.Position = [64 96 503 36];
app.Label.Text = {'ACTUACIONES Y RENDIMIENTOS DE UN AVIÓN; '
MONOMOTOR DE COMBUSTION INTERNA CON HÉLICE'};
% Create AlumnosRodriguezClaudioFernandoTimoteoLabel
app.AlumnosRodriguezClaudioFernandoTimoteoLabel = uilabel(app.UIFigure);
app.AlumnosRodriguezClaudioFernandoTimoteoLabel.HorizontalAlignment =
'center';
app.AlumnosRodriguezClaudioFernandoTimoteoLabel.Position = [37 9 206 42];
app.AlumnosRodriguezClaudioFernandoTimoteoLabel.Text = {''; 'Rodríguez
Claudio Fernando Timoteo'; 'Urzúa Toledano Oscar Uriel'};
% Create INICIARButton
app.INICIARButton = uibutton(app.UIFigure, 'push');
app.INICIARButton.ButtonPushedFcn = createCallbackFcn(app,
@INICIARButtonPushed, true);
app.INICIARButton.BackgroundColor = [0.0157 0.3059 0.502];
app.INICIARButton.FontSize = 16;
app.INICIARButton.FontColor = [1 1 1];
app.INICIARButton.Position = [251 50 139 39];
app.INICIARButton.Text = 'INICIAR';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = Portada_uno
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
56
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
Anexo C. Código para calcular la variación de la potencia del motor por la altitud
classdef opciones < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel
matlab.ui.control.Label
OPCION1Button matlab.ui.control.Button
OPCION2Button matlab.ui.control.Button
Label matlab.ui.control.Label
Label_2 matlab.ui.control.Label
Image matlab.ui.control.Image
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: OPCION1Button
function OPCION1ButtonPushed(app, event)
open(potencia_del_motor_por_altitud_factor_de_correccion)
end
% Button pushed function: OPCION2Button
function OPCION2ButtonPushed(app, event)
open(potencia_del_motor_datos_de_ficha)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel =
uilabel(app.UIFigure);
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel.HorizontalAlignme
nt = 'center';
57
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel.FontSize =
16;
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel.FontWeight
= 'bold';
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel.Position =
[43 435 556 22];
app.VARIACINDELAPOTENCIADELMOTORPORLAALTITUDLabel.Text =
'VARIACIÓN DE LA POTENCIA DEL MOTOR POR LA ALTITUD';
% Create OPCION1Button
app.OPCION1Button = uibutton(app.UIFigure, 'push');
app.OPCION1Button.ButtonPushedFcn = createCallbackFcn(app,
@OPCION1ButtonPushed, true);
app.OPCION1Button.BackgroundColor = [0 0.4471 0.7412];
app.OPCION1Button.FontSize = 15;
app.OPCION1Button.FontWeight = 'bold';
app.OPCION1Button.FontColor = [1 1 1];
app.OPCION1Button.Position = [510 325 119 56];
app.OPCION1Button.Text = 'OPCIÓN 1';
% Create OPCION2Button
app.OPCION2Button = uibutton(app.UIFigure, 'push');
app.OPCION2Button.ButtonPushedFcn = createCallbackFcn(app,
@OPCION2ButtonPushed, true);
app.OPCION2Button.BackgroundColor = [0.302 0.7451 0.9333];
app.OPCION2Button.FontSize = 15;
app.OPCION2Button.FontWeight = 'bold';
app.OPCION2Button.FontColor = [1 1 1];
app.OPCION2Button.Position = [500 82 119 56];
app.OPCION2Button.Text = 'OPCIÓN 2';
% Create Label
app.Label = uilabel(app.UIFigure);
app.Label.BackgroundColor = [0.0745 0.6235 1];
app.Label.VerticalAlignment = 'top';
app.Label.FontSize = 13.5;
app.Label.Position = [20 321 467 60];
app.Label.Text = {'Obtener la corrección de la potencia del motor debido a la
altitud, por '; 'medio del uso de un factor de aproximación de la potencia al freno'; 'en
condiciones atmosféricas promedio, esta opción es una aproximación '; 'teórica y los
resultados deben ser comparados con la gráfica del fabricante.'};
% Create Label_2
app.Label_2 = uilabel(app.UIFigure);
app.Label_2.BackgroundColor = [0.302 0.7451 0.9333];
app.Label_2.VerticalAlignment = 'top';
app.Label_2.FontSize = 13.5;
app.Label_2.Position = [18 82 469 56];
app.Label_2.Text = {'Obtener la corrección de la potencia del motor debido a la
altitud, por medio '; 'de la ecuación de una recta usando como datos el punto mínimo y
58
máximo '; 'de la potencia del motor a sus altitudes mínima y máxima para distintas
rpm'};
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [153 137 336 189];
app.Image.ImageSource = 'Lycoming2.png';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = opciones
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
Anexo D. Código para calcular la variación de la potencia del motor por la altitud
(opción 1)
classdef potencia_del_motor_por_altitud_factor_de_correccion < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image2 matlab.ui.control.Image
POTENCIADELMOTORPORVARIACINENLAALTITUDLabel
matlab.ui.control.Label
Image matlab.ui.control.Image
Label3 matlab.ui.control.Label
rpmEditFieldLabel matlab.ui.control.Label
rpmm matlab.ui.control.EditField
Label4 matlab.ui.control.Label
59
PNMHPEditFieldLabel matlab.ui.control.Label
pnmm matlab.ui.control.EditField
AltitudftEditFieldLabel matlab.ui.control.Label
hh matlab.ui.control.EditField
Label4_2 matlab.ui.control.Label
ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel
matlab.ui.control.Label
rpmdemaxeficienciaEditFieldLabel matlab.ui.control.Label
rpmmef matlab.ui.control.NumericEditField
OBTENERGRFICAButton matlab.ui.control.Button
SiguientepasoButton matlab.ui.control.Button
altitudcruceroftLabel matlab.ui.control.Label
altc matlab.ui.control.NumericEditField
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: OBTENERGRFICAButton
function OBTENERGRFICAButtonPushed(app, event)
alt=app.altc.Value;
x=app.rpmm.Value
rpm=[]
b=erase(x,{'[',']'})
x=split(b,{' ',','})
y=app.pnmm.Value
pnm=[]
c=erase(y,{'[',']'})
y=split(c,{' ',','})
z=app.hh.Value
hu=[]
d=erase(z,{'[',']'})
z=split(d,{' ',','})
i=1;
while i<=length(x)
rpm=[rpm,str2double(x(i))]
pnm=[pnm,str2double(y(i))]
i=i+1;
end
j=1;
while j<=length(z)
hu=[hu,str2double(z(j))]
j=j+1;
end
%----------------------------------------
h1=0:2500:20000;
h2=25000:5000:50000;
h=[h1,h2];
60
sigma=[1 0.9288 0.8616 0.7982 0.7384 0.6821 0.6291 0.5793 0.5327 0.448
0.374 0.308 0.2447 0.1926 0.1517];
p=polyfit(h,sigma,2)
s=polyval(p,hu) %Esta línea nos da el valor de sigma
%para cualquier altitud ingresada
phi=1.176.*s-0.176; %factor de corrección
rpmef=app.rpmmef.Value; %rpm de máxima eficiencia o la que se desee
c=1;
while c >= 1
if rpmef == rpm(c)
rpmef=c
break
else
c=c+1
end
end
for i=1:length(s)
for j=1:length(pnm)
pbr(i,j)=phi(i)*pnm(j);
%Corrección de potencia por altitud
end
end
huft=hu;
hu=hu/3.281;
for l=1:length(s)
hn=round(hu(l))
txt=['altitud (m)= ', num2str(hn)];
plot(rpm,pbr(l,:),'DisplayName',txt), hold on
xlabel ('rpm'), ylabel('P_{br} [HP]'), grid minor
title('Potencia corregida por altitud')
legend show
end
pmc=pbr(:,rpmef) %Potencia a las rpm de maz eficiencia potencia max continua
rpmmax=rpm(rpmef)
save('potencia_del_motor_por_altitud_factor_de_correccion','alt','pmc','hu','rpmmax','rp
m')
PW=pbr*745.7;
Plfs=pbr*550;
rpm=rpm';
T=table(pbr,PW,Plfs, "VariableNames",{'rpm','Potencia
[HP]','Potencia[Watts]','Potencia[lb-ft / s]'})
writetable('txt',T(l),'Potencia_FC_.xlsx')
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(J_contra_eficiencia_de_la_helice_con_grabit)
61
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image2
app.Image2 = uiimage(app.UIFigure);
app.Image2.Position = [145 -39 350 234];
app.Image2.ImageSource = 'Lycoming2.png';
% Create POTENCIADELMOTORPORVARIACINENLAALTITUDLabel
app.POTENCIADELMOTORPORVARIACINENLAALTITUDLabel =
uilabel(app.UIFigure);
app.POTENCIADELMOTORPORVARIACINENLAALTITUDLabel.FontSize = 16;
app.POTENCIADELMOTORPORVARIACINENLAALTITUDLabel.FontWeight =
'bold';
app.POTENCIADELMOTORPORVARIACINENLAALTITUDLabel.Position = [95
432 451 22];
app.POTENCIADELMOTORPORVARIACINENLAALTITUDLabel.Text =
'POTENCIA DEL MOTOR POR VARIACIÓN EN LA ALTITUD';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [32 383 28 26];
app.Image.ImageSource = 'a.png';
% Create Label3
app.Label3 = uilabel(app.UIFigure);
app.Label3.FontSize = 13;
app.Label3.FontWeight = 'bold';
app.Label3.Position = [76 380 580 30];
app.Label3.Text = {'La potencia mostrada en la gráfica deberá ser verificada
con la ficha técnica del fabricante '; 'para conocer sus limitaciones'};
% Create rpmEditFieldLabel
app.rpmEditFieldLabel = uilabel(app.UIFigure);
app.rpmEditFieldLabel.HorizontalAlignment = 'right';
app.rpmEditFieldLabel.Position = [40 290 26 22];
app.rpmEditFieldLabel.Text = 'rpm';
% Create rpmm
app.rpmm = uieditfield(app.UIFigure, 'text');
app.rpmm.Position = [111 290 489 22];
% Create Label4
app.Label4 = uilabel(app.UIFigure);
62
app.Label4.FontWeight = 'bold';
app.Label4.Position = [40 322 537 22];
app.Label4.Text = 'Ingresa las rpm del motor entre corchetes y separadas por
un espacio [rpm1 rpm2 ... rpmn]';
% Create PNMHPEditFieldLabel
app.PNMHPEditFieldLabel = uilabel(app.UIFigure);
app.PNMHPEditFieldLabel.HorizontalAlignment = 'right';
app.PNMHPEditFieldLabel.Position = [34 209 69 22];
app.PNMHPEditFieldLabel.Text = 'P.N.M. (HP)';
% Create pnmm
app.pnmm = uieditfield(app.UIFigure, 'text');
app.pnmm.Position = [118 209 482 22];
% Create AltitudftEditFieldLabel
app.AltitudftEditFieldLabel = uilabel(app.UIFigure);
app.AltitudftEditFieldLabel.HorizontalAlignment = 'right';
app.AltitudftEditFieldLabel.Position = [33 113 57 22];
app.AltitudftEditFieldLabel.Text = 'Altitud (ft)';
% Create hh
app.hh = uieditfield(app.UIFigure, 'text');
app.hh.Position = [111 113 483 22];
% Create Label4_2
app.Label4_2 = uilabel(app.UIFigure);
app.Label4_2.FontWeight = 'bold';
app.Label4_2.Position = [40 250 616 22];
app.Label4_2.Text = 'Ingresa la potencia correspondiente a cada rpm entre
corchetes y separadas por un espacio [p1 p2 ..pn]';
% Create ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel
app.ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel =
uilabel(app.UIFigure);
app.ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel.FontWeight
= 'bold';
app.ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel.Position =
[40 165 475 22];
app.ingresalasaltitudesalasqueserealizarlacorreccindepotenciaLabel.Text =
'Ingresa las altitudes a las que se realizará la corrección de potencia [h1 h2 ... hn]';
% Create rpmdemaxeficienciaEditFieldLabel
app.rpmdemaxeficienciaEditFieldLabel = uilabel(app.UIFigure);
app.rpmdemaxeficienciaEditFieldLabel.HorizontalAlignment = 'right';
app.rpmdemaxeficienciaEditFieldLabel.Position = [29 49 122 22];
app.rpmdemaxeficienciaEditFieldLabel.Text = 'rpm de max.eficiencia';
% Create rpmmef
app.rpmmef = uieditfield(app.UIFigure, 'numeric');
app.rpmmef.Position = [40 20 100 22];
% Create OBTENERGRFICAButton
app.OBTENERGRFICAButton = uibutton(app.UIFigure, 'push');
63
app.OBTENERGRFICAButton.ButtonPushedFcn = createCallbackFcn(app,
@OBTENERGRFICAButtonPushed, true);
app.OBTENERGRFICAButton.BackgroundColor = [1 0 0];
app.OBTENERGRFICAButton.FontSize = 15;
app.OBTENERGRFICAButton.FontWeight = 'bold';
app.OBTENERGRFICAButton.FontColor = [1 1 1];
app.OBTENERGRFICAButton.Position = [455 52 170 52];
app.OBTENERGRFICAButton.Text = 'OBTENER GRÁFICA';
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [1 0.4118 0.1608];
app.SiguientepasoButton.FontSize = 15;
app.SiguientepasoButton.FontWeight = 'bold';
app.SiguientepasoButton.FontColor = [1 1 1];
app.SiguientepasoButton.Position = [470 9 139 33];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Create altitudcruceroftLabel
app.altitudcruceroftLabel = uilabel(app.UIFigure);
app.altitudcruceroftLabel.BackgroundColor = [1 0.4118 0.1608];
app.altitudcruceroftLabel.HorizontalAlignment = 'center';
app.altitudcruceroftLabel.FontColor = [1 1 1];
app.altitudcruceroftLabel.Position = [222 49 104 22];
app.altitudcruceroftLabel.Text = 'Altitud crucero [ ft ]';
% Create altc
app.altc = uieditfield(app.UIFigure, 'numeric');
app.altc.Position = [222 20 100 22];
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = potencia_del_motor_por_altitud_factor_de_correccion
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
64
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
Anexo E. Código para calcular la variación de la potencia del motor por la altitud
(opción 2)
classdef potencia_del_motor_datos_de_ficha < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
POTENCIADELMOTORPORVARIACIONENALTITUDLabel
matlab.ui.control.Label
EstaopcionLabel matlab.ui.control.Label
table matlab.ui.control.Table
IniciarButton matlab.ui.control.Button
agregar matlab.ui.control.Button
ObtenerGrficaButton matlab.ui.control.Button
Image matlab.ui.control.Image
SiguientepasoButton matlab.ui.control.Button
IngresalasaltitudesparacalcularlapotenciadisponibleLabel matlab.ui.control.Label
huu matlab.ui.control.EditField
rpmmaxeficienciaEditFieldLabel matlab.ui.control.Label
rpmmax matlab.ui.control.NumericEditField
altitudcruceroftLabel matlab.ui.control.Label
altc matlab.ui.control.NumericEditField
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: IniciarButton
function IniciarButtonPushed(app, event)
datos={'','','','',''}
app.table.Data=datos;
end
% Button pushed function: agregar
function agregarPushed(app, event)
datos=app.table.Data;
fila=size(datos,1);
fila=fila+1;
datos(fila,:)={''}
app.table.Data=datos
end
% Button pushed function: ObtenerGrficaButton
65
function ObtenerGrficaButtonPushed(app, event)
valores=app.table.Data
alt=app.altc.Value;
rpm=str2double(valores(:,1))
rpm=rpm'
h=str2double(valores(:,2:3))
p=str2double(valores(:,4:5))
rpmef=app.rpmmax.Value;
c=1;
while c >= 1
if rpmef == rpm(c)
rpmef=c
break
else
c=c+1
end
end
%-------%
[m,n]=size(p)
for i=1:m
hu=polyfit(h(i,:),p(i,:),1)
he(i,:)=linspace(h(i,1),h(i,end),50)
pu(i,:)=polyval(hu,he(i,:))
end
zz=app.huu.Value
hus=[]
d=erase(zz,{'[',']'})
zz=split(d,{' ',','})
i=1;
while i<=length(zz)
hus=[hus,str2double(zz(i))]
i=i+1;
end
pp=polyfit(h(rpmef,:),p(rpmef,:),1);
pbr=polyval(pp,hus);
he=he/3.281 %ft a m
for j=1:length(rpm)
rpms=rpm(j)
txt=['rpm= ', num2str(rpms)];
plot(he(j,:),pu(j,:),'DisplayName',txt),grid on
grid minor, hold on
xlabel ('Altitud (ft)'), ylabel('P_{br} [HP]')
title('Potencia por altitud')
legend show
end
hu=hus;
66
pmc=pbr;
rpmmax=rpm(rpmef);
save('potencia_del_motor_datos_de_ficha','pmc','hu','rpmmax','rpm','alt')
pbrd=transpose(pbr);
Plfs=pbrd*550;
PW=pbrd*745.7
rpmd=rpm';
T = table(rpmd, pbrd,Plfs,PW, 'VariableNames', {'rpm', 'Potencia [HP]' , 'Potencia
[lb-ft/s]','Potencia [W]'} )
% Write data to text file
writetable(T, 'Datos_de_potencia.xlsx')
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(J_contra_eficiencia_de_la_helice_con_grabit)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create POTENCIADELMOTORPORVARIACIONENALTITUDLabel
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel =
uilabel(app.UIFigure);
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel.HorizontalAlignment =
'center';
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel.FontSize = 16;
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel.FontWeight =
'bold';
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel.Position = [73
447 496 22];
app.POTENCIADELMOTORPORVARIACIONENALTITUDLabel.Text =
'POTENCIA DEL MOTOR POR VARIACION EN ALTITUD';
% Create EstaopcionLabel
app.EstaopcionLabel = uilabel(app.UIFigure);
app.EstaopcionLabel.HorizontalAlignment = 'center';
app.EstaopcionLabel.FontWeight = 'bold';
app.EstaopcionLabel.Position = [-1 388 644 50];
app.EstaopcionLabel.Text = {'Obtener la potencia del motor a diferentes
altitudes y rpm mediante la ecuación de una línea recta con los'; 'puntos máximos y
67
mínimos de la gráfica del fabricante, estos resultados están mejor apegados a la
realidad.'};
% Create table
app.table = uitable(app.UIFigure);
app.table.ColumnName = {'rpm'; 'altitud min (ft)'; 'altitud max (ft)'; 'potencia max
(HP)'; 'potencia min (HP)'};
app.table.RowName = {};
app.table.ColumnEditable = true;
app.table.Position = [45 158 551 176];
% Create IniciarButton
app.IniciarButton = uibutton(app.UIFigure, 'push');
app.IniciarButton.ButtonPushedFcn = createCallbackFcn(app,
@IniciarButtonPushed, true);
app.IniciarButton.BackgroundColor = [0.302 0.7451 0.9333];
app.IniciarButton.Position = [45 352 116 37];
app.IniciarButton.Text = 'Iniciar';
% Create agregar
app.agregar = uibutton(app.UIFigure, 'push');
app.agregar.ButtonPushedFcn = createCallbackFcn(app, @agregarPushed,
true);
app.agregar.BackgroundColor = [0.0745 0.6235 1];
app.agregar.Position = [477 352 119 37];
app.agregar.Text = 'AGREGAR DATOS';
% Create ObtenerGrficaButton
app.ObtenerGrficaButton = uibutton(app.UIFigure, 'push');
app.ObtenerGrficaButton.ButtonPushedFcn = createCallbackFcn(app,
@ObtenerGrficaButtonPushed, true);
app.ObtenerGrficaButton.BackgroundColor = [1 0 0];
app.ObtenerGrficaButton.FontSize = 14;
app.ObtenerGrficaButton.FontWeight = 'bold';
app.ObtenerGrficaButton.FontColor = [1 1 1];
app.ObtenerGrficaButton.Position = [251 10 139 43];
app.ObtenerGrficaButton.Text = 'Obtener Gráfica';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [271 320 100 100];
app.Image.ImageSource = 'Lycoming2.png';
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [1 0.4118 0.1608];
app.SiguientepasoButton.FontSize = 14;
app.SiguientepasoButton.FontWeight = 'bold';
app.SiguientepasoButton.FontColor = [1 1 1];
app.SiguientepasoButton.Position = [502 15 115 32];
68
app.SiguientepasoButton.Text = 'Siguiente paso';
% Create IngresalasaltitudesparacalcularlapotenciadisponibleLabel
app.IngresalasaltitudesparacalcularlapotenciadisponibleLabel =
uilabel(app.UIFigure);
app.IngresalasaltitudesparacalcularlapotenciadisponibleLabel.HorizontalAlignment =
'center';
app.IngresalasaltitudesparacalcularlapotenciadisponibleLabel.Position = [-4 82
394 66];
app.IngresalasaltitudesparacalcularlapotenciadisponibleLabel.Text = {'Ingresa
las altitudes para calcular la potencia disponible '; 'entre corchetes y separadas por un
espacio ej.'; '[h1 h2 ...hn] [ ft ]'};
% Create huu
app.huu = uieditfield(app.UIFigure, 'text');
app.huu.Position = [50 63 285 22];
% Create rpmmaxeficienciaEditFieldLabel
app.rpmmaxeficienciaEditFieldLabel = uilabel(app.UIFigure);
app.rpmmaxeficienciaEditFieldLabel.HorizontalAlignment = 'right';
app.rpmmaxeficienciaEditFieldLabel.Position = [504 95 112 42];
app.rpmmaxeficienciaEditFieldLabel.Text = 'rpm. max. eficiencia';
% Create rpmmax
app.rpmmax = uieditfield(app.UIFigure, 'numeric');
app.rpmmax.Position = [510 74 100 22];
% Create altitudcruceroftLabel
app.altitudcruceroftLabel = uilabel(app.UIFigure);
app.altitudcruceroftLabel.HorizontalAlignment = 'right';
app.altitudcruceroftLabel.Position = [370 95 112 42];
app.altitudcruceroftLabel.Text = 'Altitud crucero [ ft ]';
% Create altc
app.altc = uieditfield(app.UIFigure, 'numeric');
app.altc.Position = [376 74 100 22];
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = potencia_del_motor_datos_de_ficha
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
69
end
% Code that executes before app deletion
function delete(app)
71
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.FontSize = 16;
app.SiguientepasoButton.Position = [479 24 136 52];
app.SiguientepasoButton.Text = 'Siguiente paso'; % Show the figure after
all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = J_contra_eficiencia_de_la_helice_con_grabit
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
72
Jntt matlab.ui.control.Table
SeleccionaunaopcionButtonGroup matlab.ui.container.ButtonGroup
ficha matlab.ui.control.RadioButton
factor matlab.ui.control.RadioButton
OBTENERGRFICAButton matlab.ui.control.Button
PesodelaaeronavekgEditFieldLabel matlab.ui.control.Label
Ww matlab.ui.control.NumericEditField
Superficiealarm2EditFieldLabel matlab.ui.control.Label
Ss matlab.ui.control.NumericEditField
DiametrodelahlicemEditFieldLabel matlab.ui.control.Label
DH matlab.ui.control.NumericEditField
SiguientepasoButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: OBTENERGRFICAButton
function OBTENERGRFICAButtonPushed(app, event)
%--------------
op1=app.ficha.Value
op2=app.factor.Value
pl=app.polarr.Value; %obtenemos el nombre del archivo de la polar
pol=readtable(pl); %leemos la tabla de la polar
app.polartt.Data=pol; %Ingresamos la polar en la tabla de la app
pol=table2array(pol); %Convertimos la tabla a un array para hacer operaciones
cl=pol(2:end,1);
cl=sort(cl,'descend' );
cd=pol(2:end,2);
cd=sort(cd,'descend');
hel=app.Jnn.Value; %Nombre del archivo de la hélice
helice=load(hel); %cargamos el archivo
datosjn=cell2mat(struct2cell(helice));
app.Jntt.Data=datosjn;
if op1 == 1
pmfc=load('potencia_del_motor_por_altitud_factor_de_correccion.mat')
hu=pmfc.hu
pmc=pmfc.pmc;
rpmmax=pmfc.rpmmax;
rpm=pmfc.rpm;
alt=pmfc.alt
load('ISAEU') %Tabla de densidad del aire a diferentes altitudes
%en sistema inglés
S=app.Ss.Value;
w=app.Ww.Value;
ISAH=ISAEU(:,1);
ISAR=ISAEU(:,4);
den=polyfit(ISAH,ISAR,2)
73
rho=polyval(den,hu)
rho=(rho*16.0185)/9.8066 %conversión a kg/m3
X=datosjn(:,1);
Y=datosjn(:,2);
j=polyfit(X,Y,9) %ecuación polinómica de 9 grado para obtener
% la eficiencia con respecto al parámetro J
Vel=sqrt( (2*w)./ (rho*S.*cl) ) %Velocidad despejada de la fórmula de
levantamiento
%usando la polar de la aeronave previamente cargada
n=rpmmax; % rpm correspondientes a la potencia que usaremos
n=n*1/60; %cambio de rpm a rps
P=pmc; %Potencia en HP del motor a las rpm
d=app.DH.Value; %diámetro de la hélice en m
J=Vel./(n.*d) %Cálculo de J
eh=polyval(j,J); %cálculo del factor de eficiencia de la hélice
[m,n]=size(Vel)
for i=1:n
PD(:,i)=P(i)*eh(:,i)
end
Vel=Vel.*(3600/1000); %conversión de la velocidad de m/s a km/
[nf,nc]=size(PD)
for tt=1:nf
for ty=1:nc
if PD(tt,ty) > 0
PDn(tt,ty)=PD(tt,ty)
Veln(tt,ty)=Vel(tt,ty)
else
PDn(tt,ty)=PDn(tt-1,ty)
Veln(tt,ty)=Veln(tt-1,ty)
end
end
end
elseif op2 == 1
pmfc=load('potencia_del_motor_datos_de_ficha.mat')
hu=pmfc.hu
pmc=pmfc.pmc;
rpmmax=pmfc.rpmmax;
rpm=pmfc.rpm;
alt=pmfc.alt;
load('ISAEU') %Tabla de densidad del aire a diferentes altitudes
%en sistema inglés
S=app.Ss.Value;
w=app.Ww.Value;
ISAH=ISAEU(:,1);
ISAR=ISAEU(:,4);
den=polyfit(ISAH,ISAR,2)
74
rho=polyval(den,hu)
rho=(rho*16.0185)/9.8066 %conversión a kg/m3
X=datosjn(:,1);
Y=datosjn(:,2);
j=polyfit(X,Y,9) %ecuación polinómica de 9 grado para obtener
% la eficiencia con respecto al parámetro J
Vel=sqrt( (2*w)./ (rho*S.*cl) ) %Velocidad despejada de la fórmula de
levantamiento
%usando la polar de la aeronave previamente cargada
n=rpmmax; % rpm correspondientes a la potencia que usaremos
n=n*1/60; %cambio de rpm a rps
P=pmc; %Potencia en HP del motor a las rpm
d=1.8; %diámetro de la hélice en m
J=Vel./(n.*d) %Cálculo de J
eh=polyval(j,J); %cálculo del factor de eficiencia de la hélice
[m,n]=size(Vel)
for i=1:n
PD(:,i)=P(i)*eh(:,i)
end
Vel=Vel.*(3600/1000); %conversión de la velocidad de m/s a km/
[nf,nc]=size(PD)
for tt=1:nf
for ty=1:nc
if PD(tt,ty) > 0
PDn(tt,ty)=PD(tt,ty)
Veln(tt,ty)=Vel(tt,ty)
else
PDn(tt,ty)=PDn(tt-1,ty)
Veln(tt,ty)=Veln(tt-1,ty)
end
end
end
end
Velms=Veln/3.6;
save('potencia_disponible_ap','Veln','Velms','PDn','S','w','hu','pol','cl','cd','d','J','rpm','rho','
pmc','X','Y','alt')
Plfs=PD*550;
PW=PD*745.7
Velfts=Vel*3.281;
T = table(Vel,Velfts,PD,Plfs,PW, 'VariableNames', {'Velocidad [m/s]','Velocidad
[m/s]', 'Potencia [HP]' , 'Potencia [lb-ft/s]','Potencia [W]'} )
% Write data to text file
writetable(T, 'Datos_de_potencia_disponible.xlsx')
if op1 == 1
pmfc=load('potencia_del_motor_por_altitud_factor_de_correccion.mat')
hu=pmfc.hu
75
pmc=pmfc.pmc;
rpmmax=pmfc.rpmmax;
alt=pmfc.alt;
for i=1:length(hu)
hu(i)=hu(i)/3.281
hu(i)=round(hu(i))
hn=hu(i)
txt=['altitud (m)= ', num2str(hn)];
plot(Velms(:,i),PDn(:,i),'DisplayName',txt), grid on, grid minor, hold on
title('Potencia Disponible')
xlabel('Velocidad (m/s)'), ylabel('Potencia Disponible (HP)')
legend show
end
elseif op2 == 1
pmfc=load('potencia_del_motor_datos_de_ficha.mat')
hu=pmfc.hu
pmc=pmfc.pmc;
rpmmax=pmfc.rpmmax;
alt=pmfc.alt;
for i=1:length(hu)
hu(i)=hu(i)/3.281
hu(i)=round(hu(i))
hn=hu(i)
txt=['altitud (m)= ', num2str(hn)];
plot(Velms(:,i),PDn(:,i),'DisplayName',txt), grid on, grid minor, hold on
title('Potencia Disponible')
xlabel('Velocidad (m/s)'), ylabel('Potencia Disponible (HP)')
legend show
end
end
end
% Selection changed function: SeleccionaunaopcionButtonGroup
function SeleccionaunaopcionButtonGroupSelectionChanged(app, event)
selectedButton = app.SeleccionaunaopcionButtonGroup.SelectedObject;
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(potencia_requerida_vs_disponible)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
76
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create POTENCIADISPONIBLELabel
app.POTENCIADISPONIBLELabel = uilabel(app.UIFigure);
app.POTENCIADISPONIBLELabel.BackgroundColor = [1 0.1686 0.1686];
app.POTENCIADISPONIBLELabel.HorizontalAlignment = 'center';
app.POTENCIADISPONIBLELabel.FontSize = 20;
app.POTENCIADISPONIBLELabel.FontWeight = 'bold';
app.POTENCIADISPONIBLELabel.FontColor = [1 1 1];
app.POTENCIADISPONIBLELabel.Position = [1 439 640 42];
app.POTENCIADISPONIBLELabel.Text = 'POTENCIA DISPONIBLE';
% Create IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel =
uilabel(app.UIFigure);
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel.BackgroundCol
or = [0.902 0.902 0.902];
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel.HorizontalAlign
ment = 'center';
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel.Position
= [10 386 241 40];
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel.Text =
{'Ingresa el nombre del archivo'; ' de la polar del avión ej: polar.xlsx'};
% Create polarr
app.polarr = uieditfield(app.UIFigure, 'text');
app.polarr.BackgroundColor = [0.902 0.902 0.902];
app.polarr.Position = [83 353 100 22];
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [201 -25 440 368];
app.Image.ImageSource = 'lycoming3.png';
% Create IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2 =
uilabel(app.UIFigure);
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2.BackgroundCo
lor = [0.902 0.902 0.902];
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2.HorizontalAlign
ment = 'center';
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2.Position = [258
386 241 40];
app.IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2.Text =
{'Ingresa el nombre del archivo'; ' del rendimiendo de la helice J-n ej: Clark_y'};
% Create Jnn
app.Jnn = uieditfield(app.UIFigure, 'text');
app.Jnn.BackgroundColor = [0.902 0.902 0.902];
77
app.Jnn.Position = [331 353 100 22];
% Create polartt
app.polartt = uitable(app.UIFigure);
app.polartt.ColumnName = {'Cl'; 'Cd'};
app.polartt.RowName = {};
app.polartt.Position = [50 158 162 185];
% Create Jntt
app.Jntt = uitable(app.UIFigure);
app.Jntt.ColumnName = {'J'; 'n'};
app.Jntt.RowName = {};
app.Jntt.Position = [299 158 163 185];
% Create SeleccionaunaopcionButtonGroup
app.SeleccionaunaopcionButtonGroup = uibuttongroup(app.UIFigure);
app.SeleccionaunaopcionButtonGroup.SelectionChangedFcn =
createCallbackFcn(app, @SeleccionaunaopcionButtonGroupSelectionChanged, true);
app.SeleccionaunaopcionButtonGroup.Title = 'Selecciona una opción';
app.SeleccionaunaopcionButtonGroup.BackgroundColor = [1 1 1];
app.SeleccionaunaopcionButtonGroup.Position = [38 41 239 79];
% Create ficha
app.ficha = uiradiobutton(app.SeleccionaunaopcionButtonGroup);
app.ficha.Text = 'Potencia por factor de corrección ';
app.ficha.Position = [11 33 202 22];
% Create factor
app.factor = uiradiobutton(app.SeleccionaunaopcionButtonGroup);
app.factor.Text = 'Potencia por datos de ficha técnica';
app.factor.Position = [11 11 210 22];
app.factor.Value = true;
% Create OBTENERGRFICAButton
app.OBTENERGRFICAButton = uibutton(app.UIFigure, 'push');
app.OBTENERGRFICAButton.ButtonPushedFcn = createCallbackFcn(app,
@OBTENERGRFICAButtonPushed, true);
app.OBTENERGRFICAButton.BackgroundColor = [1 0 0];
app.OBTENERGRFICAButton.FontSize = 16;
app.OBTENERGRFICAButton.FontColor = [1 1 1];
app.OBTENERGRFICAButton.Position = [299 33 168 63];
app.OBTENERGRFICAButton.Text = 'OBTENER GRÁFICA';
% Create PesodelaaeronavekgEditFieldLabel
app.PesodelaaeronavekgEditFieldLabel = uilabel(app.UIFigure);
app.PesodelaaeronavekgEditFieldLabel.HorizontalAlignment = 'center';
app.PesodelaaeronavekgEditFieldLabel.Position = [517 359 116 28];
app.PesodelaaeronavekgEditFieldLabel.Text = {'Peso del avión; '[kg]'};
% Create Ww
app.Ww = uieditfield(app.UIFigure, 'numeric');
app.Ww.Position = [525 333 100 22];
% Create Superficiealarm2EditFieldLabel
app.Superficiealarm2EditFieldLabel = uilabel(app.UIFigure);
78
app.Superficiealarm2EditFieldLabel.HorizontalAlignment = 'center';
app.Superficiealarm2EditFieldLabel.Position = [532 282 86 28];
app.Superficiealarm2EditFieldLabel.Text = {'Superficie alar '; '[m2]'};
% Create Ss
app.Ss = uieditfield(app.UIFigure, 'numeric');
app.Ss.Position = [525 256 100 22];
% Create DiametrodelahlicemEditFieldLabel
app.DiametrodelahlicemEditFieldLabel = uilabel(app.UIFigure);
app.DiametrodelahlicemEditFieldLabel.HorizontalAlignment = 'center';
app.DiametrodelahlicemEditFieldLabel.Position = [516 204 118 28];
app.DiametrodelahlicemEditFieldLabel.Text = {'Diámetro de la hélice'; '[m]'};
% Create DH
app.DH = uieditfield(app.UIFigure, 'numeric');
app.DH.Position = [525 179 100 22];
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [1 0.4118 0.1608];
app.SiguientepasoButton.FontColor = [1 1 1];
app.SiguientepasoButton.Position = [533 41 100 22];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = potencia_disponible_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
79
Anexo H. Código para presentar las gráficas de potencia disponible vs potencia
requerida
classdef potencia_requerida_vs_disponible < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
POTENCIAREQUERIDAPOTENCIADISPONIBLELabel matlab.ui.control.Label
SeleccionaunaopcinButtonGroup matlab.ui.container.ButtonGroup
FC matlab.ui.control.RadioButton
FT matlab.ui.control.RadioButton
OBTENERGRFICAButton matlab.ui.control.Button
SiguientepasoButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: OBTENERGRFICAButton
function OBTENERGRFICAButtonPushed(app, event)
op1=app.FC.Value;
op2=app.FT.Value;
if op1==1
pmfcr=load('potencia_del_motor_por_altitud_factor_de_correccion.mat')
%cargamos los datos de potencia
%y de altitudes calculados en la corrección de potencia por altitud
pmc=pmfcr.pmc;
hu=pmfcr.hu;
rpmmax=pmfcr.rpmmax;
load('ISAEU') %Tabla de densidad del aire a diferentes altitudes
%en sistema inglés
pd=load('potencia_disponible_ap.mat')
Veln=pd.Veln;
PDn=pd.PDn;
S=pd.S;
w=pd.w;
pol=pd.pol
cl=pol(2:end,1)
cl=sort(cl,'descend' )
cd=pol(2:end,2)
cd=sort(cd,'descend' )
ISAH=ISAEU(:,1);
ISAR=ISAEU(:,4);
den=polyfit(ISAH,ISAR,2)
rho=polyval(den,hu)
rho=(rho*16.0185)/9.8066 %conversión a kg/m3
80
Vel=sqrt( (2*w)./ (rho*S.*cl) ) %Velocidad despejada de la fórmula de
levantamiento
%usando la polar de la aeronave previamente cargada
for i=1:length(rho)
D(:,i)=0.5*rho(i)*Vel(:,i).^3*S.*cd*9.8066
Pr(:,i)=(D(:,i)/1000)*1.341
end
[nf,nc]=size(PDn)
count=1;
for tt=1:nf
for ty=1
if PDn(tt,ty) > Pr(tt,ty)
count=count+1;
else
count=count
end
end
end
Velms=Veln/3.6;
for l=1:length(hu)
figure(l)
hu(l)=hu(l)/3.281
hu(l)=round(hu(l))
hn=hu(l)
txt=['PR a ', num2str(hn),' [m]'];
txt2=['PD a ', num2str(hn),' [m]'];
plot(Velms(1:count,l),Pr(1:count,l),'DisplayName',txt), grid on, grid minor
hold on
plot(Velms(1:count,l),PDn(1:count,l),'DisplayName',txt2), grid on, grid minor
xlabel ('Velocidad [m/s]'), ylabel('P_{requerida} [HP]')
title('Potencia requerida vs Potencia disponible a diferentes altitudes')
legend show
end
elseif op2==1
pmdt=load('potencia_del_motor_datos_de_ficha.mat') %cargamos los datos
de potencia
%y de altitudes calculados en la corrección de potencia por altitud
pmc=pmdt.pmc;
hu=pmdt.hu;
rpmmax=pmdt.rpmmax;
load('ISAEU') %Tabla de densidad del aire a diferentes altitudes
%en sistema inglés
pd=load('potencia_disponible_ap.mat')
Veln=pd.Veln;
PDn=pd.PDn;
81
S=pd.S;
w=pd.w;
pol=pd.pol;
cl=pol(2:end,1)
cl=sort(cl,'descend' )
cd=pol(2:end,2)
cd=sort(cd,'descend' )
ISAH=ISAEU(:,1);
ISAR=ISAEU(:,4);
den=polyfit(ISAH,ISAR,2)
rho=polyval(den,hu)
rho=(rho*16.0185)/9.8066 %conversion a kg/m3
Vel=sqrt( (2*w)./ (rho*S.*cl) ) %Velocidad despejada de la formula de
levantamiento
%usando la polar de la aeronave previamente cargada
for i=1:length(rho)
D(:,i)=0.5*rho(i)*Vel(:,i).^3*S.*cd*9.8066
Pr(:,i)=(D(:,i)/1000)*1.341
end
[nf,nc]=size(PDn)
count=1;
for tt=1:nf
for ty=1
if 3*PDn(tt,ty) > Pr(tt,ty)
count=count+1;
else
count=count
end
end
end
Velms=Veln/3.6;
for l=1:length(hu)
figure(l)
hu(l)=hu(l)/3.281
hu(l)=round(hu(l))
hn=hu(l)
txt=['PR a ', num2str(hn),' [m]'];
txt2=['PD a ', num2str(hn),' [m]'];
plot(Velms(1:count,l),Pr(1:count,l),'DisplayName',txt), grid on, grid minor
hold on
plot(Velms(1:count,l),PDn(1:count,l),'DisplayName',txt2), grid on, grid minor
xlabel ('Velocidad [m/s]'), ylabel('P_{requerida} [HP]')
title('Potencia requerida vs Potencia disponible a diferentes altitudes')
legend show
end
82
end
save('potencia_requerida_vs_disponible','Vel','Pr','w')
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(Distancia_de_despegue_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [-20 1 682 480];
app.Image.ImageSource = 'prpd.jpg';
% Create POTENCIAREQUERIDAPOTENCIADISPONIBLELabel
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel =
uilabel(app.UIFigure);
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.HorizontalAlignment =
'center';
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.FontSize = 22;
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.FontWeight = 'bold';
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.FontColor = [1 1 1];
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.Position = [1 418
640 63];
app.POTENCIAREQUERIDAPOTENCIADISPONIBLELabel.Text = 'POTENCIA
REQUERIDA - POTENCIA DISPONIBLE ';
% Create SeleccionaunaopcinButtonGroup
app.SeleccionaunaopcinButtonGroup = uibuttongroup(app.UIFigure);
app.SeleccionaunaopcinButtonGroup.Title = 'Selecciona una opción ';
app.SeleccionaunaopcinButtonGroup.BackgroundColor = [1 1 1];
app.SeleccionaunaopcinButtonGroup.Position = [20 206 294 106];
% Create FC
app.FC = uiradiobutton(app.SeleccionaunaopcinButtonGroup);
app.FC.Text = 'Potencia disponible por factor de corrección';
app.FC.Position = [11 60 258 22];
app.FC.Value = true;
% Create FT
app.FT = uiradiobutton(app.SeleccionaunaopcinButtonGroup);
app.FT.Text = 'Potencia disponible por datos de ficha técnica ';
app.FT.Position = [11 38 273 22];
83
% Create OBTENERGRFICAButton
app.OBTENERGRFICAButton = uibutton(app.UIFigure, 'push');
app.OBTENERGRFICAButton.ButtonPushedFcn = createCallbackFcn(app,
@OBTENERGRFICAButtonPushed, true);
app.OBTENERGRFICAButton.BackgroundColor = [0 0 1];
app.OBTENERGRFICAButton.FontSize = 15;
app.OBTENERGRFICAButton.FontWeight = 'bold';
app.OBTENERGRFICAButton.FontColor = [1 1 1];
app.OBTENERGRFICAButton.Position = [446 232 161 47];
app.OBTENERGRFICAButton.Text = 'OBTENER GRÁFICA';
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [0.0745 0.6235 1];
app.SiguientepasoButton.FontColor = [1 1 1];
app.SiguientepasoButton.Position = [470 40 113 31];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = potencia_requerida_vs_disponible
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
84
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
DISTANCIADEDESPEGUELabel matlab.ui.control.Label
IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel
matlab.ui.control.Label
GCT matlab.ui.control.EditField
CoeficientedefriccindelapistaEditFieldLabel matlab.ui.control.Label
Miu matlab.ui.control.NumericEditField
ObtenerdatosButton matlab.ui.control.Button
SiguientepasoButton matlab.ui.control.Button
Table matlab.ui.control.Table
AbrirGRABITButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: ObtenerdatosButton
function ObtenerdatosButtonPushed(app, event)
da=load('potencia_disponible_ap.mat')
w=da.w;
cl=da.cl;
cd=da.cd;
rho=da.rho;
Veln=da.Veln;
J=da.J;
rpm=da.rpm;
d=da.d;
S=da.S;
hu=da.hu;
datosct=app.GCT.Value;
Ct=load(datosct);
Ct=cell2mat(struct2cell(Ct));
miu=app.Miu.Value;
w=w*9.81;
rho=rho*9.8066;
Beta=cl./cd;
Betam=max(Beta);
ccdd=find(Beta==Betam) %posición del cd correspondiente al Beta Maximo
jj=Ct(:,1); %parámetro de similitud J
ctt=Ct(:,2); %coeficiente de tracción Ct
Veln=Veln(1,:)
Velms=(Veln/3.6)*1.2; %velocidad en m/s por 1.2
Cto=polyfit(jj,ctt,8)
J=J(1,:)
CTo=polyval(Cto,0);
Ctd=polyval(Cto,J)
85
cdd=cd(ccdd)
D=0.5.*rho.*Velms.^2*S*cdd;
rpmx=max(rpm)
rpmx=rpmx/60; %revoluciones por segundo
To=rho.*rpmx.^2*d.^4.*CTo;
Td=rho.*rpmx.^2*d.^4.*Ctd;
cll=cl(ccdd);
Ld=0.5.*rho.*Velms.^2*S*cll;
Ffi=w*miu;
Ff=miu.*(w-Ld);
Fo=To-Ffi;
fd=Td-D-Ff;
fm=(Fo-fd)./log(Fo./fd)
Sh=(w/(2*9.81)).*(Velms.^2./(fm))
tetha=(Td-D)/w %radianes
r=Velms.^2/4.3164
Sr=tetha.*r %recorrido de transición
hr=(tetha.*Sr)/2
ha=15.24-hr
Sa=ha./tetha %recorrido de ascenso
St=round(Sh+Sr+Sa) %recorrido total
hu=round(hu/3.281)
hn(i)=hu(i)
txt{i} = [ 'altitud (m)= ', num2str(hn(i)) ];
txt2{i}=[num2str(St(i))]
end
% txt=char(txt)
% txt2=char(txt2)
DDa=[txt',txt2']
app.Table.Data=DDa
save('Distancia_de_despegue_ap','cll','cdd')
end
% Button pushed function: AbrirGRABITButton
function AbrirGRABITButtonPushed(app, event)
open(grabit)
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(hodografas_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
86
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [1 -9 640 480];
app.Image.ImageSource = 'cessna_despegue.jpg';
% Create DISTANCIADEDESPEGUELabel
app.DISTANCIADEDESPEGUELabel = uilabel(app.UIFigure);
app.DISTANCIADEDESPEGUELabel.BackgroundColor = [1 1 1];
app.DISTANCIADEDESPEGUELabel.HorizontalAlignment = 'center';
app.DISTANCIADEDESPEGUELabel.FontSize = 20;
app.DISTANCIADEDESPEGUELabel.Position = [1 444 640 37];
app.DISTANCIADEDESPEGUELabel.Text = 'DISTANCIA DE DESPEGUE';
% Create IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel
app.IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel =
uilabel(app.UIFigure);
app.IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel.HorizontalAlignm
ent = 'center';
app.IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel.FontColor
= [1 1 1];
app.IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel.Position =
[11 374 278 46];
app.IngresaelnombredelarchivosdecoeficientedetraccindelahliceLabel.Text =
{'Ingresa el nombre del archivos de '; 'coeficiente de tracción de la hélice.'; 'Ej.
ClarkY_Ct'};
% Create GCT
app.GCT = uieditfield(app.UIFigure, 'text');
app.GCT.FontColor = [0.149 0.149 0.149];
app.GCT.Position = [47 344 205 22];
% Create CoeficientedefriccindelapistaEditFieldLabel
app.CoeficientedefriccindelapistaEditFieldLabel = uilabel(app.UIFigure);
app.CoeficientedefriccindelapistaEditFieldLabel.HorizontalAlignment = 'center';
app.CoeficientedefriccindelapistaEditFieldLabel.FontColor = [1 1 1];
app.CoeficientedefriccindelapistaEditFieldLabel.Position = [36 276 102 28];
app.CoeficientedefriccindelapistaEditFieldLabel.Text = {'Coeficiente de'; 'fricción
de la pista'};
% Create Miu
app.Miu = uieditfield(app.UIFigure, 'numeric');
app.Miu.FontColor = [0.149 0.149 0.149];
app.Miu.Position = [152 279 100 22];
% Create ObtenerdatosButton
app.ObtenerdatosButton = uibutton(app.UIFigure, 'push');
app.ObtenerdatosButton.ButtonPushedFcn = createCallbackFcn(app,
@ObtenerdatosButtonPushed, true);
87
app.ObtenerdatosButton.BackgroundColor = [0 0 1];
app.ObtenerdatosButton.FontColor = [1 1 1];
app.ObtenerdatosButton.Position = [86 167 116 40];
app.ObtenerdatosButton.Text = 'Obtener datos';
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [0.3922 0.8314 0.0745];
app.SiguientepasoButton.FontColor = [1 1 1];
app.SiguientepasoButton.Position = [498 47 116 40];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Create Table
app.Table = uitable(app.UIFigure);
app.Table.ColumnName = {'Altitud'; 'Distancia de despegue (m)'};
app.Table.RowName = {};
app.Table.Position = [323 206 302 185];
% Create AbrirGRABITButton
app.AbrirGRABITButton = uibutton(app.UIFigure, 'push');
app.AbrirGRABITButton.ButtonPushedFcn = createCallbackFcn(app,
@AbrirGRABITButtonPushed, true);
app.AbrirGRABITButton.BackgroundColor = [0.302 0.7451 0.9333];
app.AbrirGRABITButton.FontSize = 16;
app.AbrirGRABITButton.FontColor = [1 1 1];
app.AbrirGRABITButton.Position = [47 47 205 69];
app.AbrirGRABITButton.Text = 'Abrir GRABIT';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = Distancia_de_despegue_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
88
end
end
end
89
save('hodografas_ap','Van','hu')
for i=1:length(hu)
hu(i)=hu(i)/3.281
hu(i)=round(hu(i))
hn=hu(i)
txt=['altitud (m)= ', num2str(hn)];
plot(Velnn(:,i),Van(:,i),'o','DisplayName',txt), grid on, grid minor, hold on
title('Hodógrafas de ascenso')
xlabel('Velocidad horizontal (m/s)'), ylabel('Velocidad de ascenso (m/s)')
legend show
end
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(techos_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 616 405];
app.UIFigure.Name = 'MATLAB App';
% Create HODOGRAFASDEASCENSOLabel
app.HODOGRAFASDEASCENSOLabel = uilabel(app.UIFigure);
app.HODOGRAFASDEASCENSOLabel.BackgroundColor = [1 1 1];
app.HODOGRAFASDEASCENSOLabel.HorizontalAlignment = 'center';
app.HODOGRAFASDEASCENSOLabel.FontSize = 18;
app.HODOGRAFASDEASCENSOLabel.Position = [1 350 616 56];
app.HODOGRAFASDEASCENSOLabel.Text = 'HODÓGRAFAS DE
ASCENSO';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [1 1 616 350];
app.Image.ImageSource = 'ascenso.jpg';
% Create OBTENERHODOGRAFASDEASCENSOButton
app.OBTENERHODOGRAFASDEASCENSOButton = uibutton(app.UIFigure,
'push');
app.OBTENERHODOGRAFASDEASCENSOButton.ButtonPushedFcn =
createCallbackFcn(app, @OBTENERHODOGRAFASDEASCENSOButtonPushed,
true);
app.OBTENERHODOGRAFASDEASCENSOButton.BackgroundColor = [0.4667
0.6588 0.7804];
app.OBTENERHODOGRAFASDEASCENSOButton.Position = [37 19 181 61];
90
app.OBTENERHODOGRAFASDEASCENSOButton.Text = {'OBTENER
HODÓGRAFAS'; ' DE ASCENSO'};
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [0.451 0.9412 0.9333];
app.SiguientepasoButton.Position = [496 32 112 35];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = hodografas_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
91
SiguienteButton matlab.ui.control.Button
ObtenerDatosButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: ObtenerDatosButton
function ObtenerDatosButtonPushed(app, event)
DAt=load('hodografas_ap')
Van=DAt.Van;
hu=DAt.hu;
Vamax= [max(Van)]
hva=polyfit(Vamax,hu,1)
H=polyval(hva,0) %techo absoluto ft
H=H*0.3048
hc=polyval(hva,0.508)%techo de servicio 0.508 m/s
hc=hc*0.3048
hu=hu/3.281
tass=(H/max(Vamax))*log(H/(H-hc)) %tiempo de ascenso para llegar al techo de
servicio
tasm=tass/60 %minutos
tash=tass/3600 %horas
tals=(H/max(Vamax)).*(log(H./(H-hu))) %tiempo para subir cualquier altitud
talm=tals/60 %minutos
talh=tals/3600 %horas
H=round(H);
hc=round(hc);
app.TA.Value=num2str(H);
app.TS.Value=num2str(hc);
Vvm=[hu',Vamax'];
app.Table.Data=Vvm;
semilogy(talm,hu),grid on,grid minor
title('Tiempo de ascenso')
xlabel('Tiempo [minutos]')
ylabel('Altitud [m]')
end
% Button pushed function: SiguienteButton
function SiguienteButtonPushed(app, event)
open(hodografas_descenso_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
92
app.UIFigure.Position = [100 100 597 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image_2
app.Image_2 = uiimage(app.UIFigure);
app.Image_2.Position = [-1 1 602 480];
app.Image_2.ImageSource = 'techos.jpg';
% Create TECHOSLabel
app.TECHOSLabel = uilabel(app.UIFigure);
app.TECHOSLabel.HorizontalAlignment = 'center';
app.TECHOSLabel.FontSize = 32;
app.TECHOSLabel.Position = [2 411 596 70];
app.TECHOSLabel.Text = 'TECHOS';
% Create Table
app.Table = uitable(app.UIFigure);
app.Table.ColumnName = {'Altitud [m]'; 'Velocidad vertical máxima [m/s]'};
app.Table.RowName = {};
app.Table.Position = [283 213 302 185];
% Create TechoabsolutomLabel
app.TechoabsolutomLabel = uilabel(app.UIFigure);
app.TechoabsolutomLabel.FontSize = 15;
app.TechoabsolutomLabel.Position = [5 99 138 22];
app.TechoabsolutomLabel.Text = 'Techo absoluto [m]';
% Create TA
app.TA = uieditfield(app.UIFigure, 'text');
app.TA.Position = [166 99 120 22];
% Create TechodeserviciomEditFieldLabel
app.TechodeserviciomEditFieldLabel = uilabel(app.UIFigure);
app.TechodeserviciomEditFieldLabel.FontSize = 15;
app.TechodeserviciomEditFieldLabel.Position = [5 50 146 22];
app.TechodeserviciomEditFieldLabel.Text = 'Techo de servicio [m]';
% Create TS
app.TS = uieditfield(app.UIFigure, 'text');
app.TS.Position = [166 50 119 22];
% Create SiguienteButton
app.SiguienteButton = uibutton(app.UIFigure, 'push');
app.SiguienteButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguienteButtonPushed, true);
app.SiguienteButton.BackgroundColor = [1 0.4118 0.1608];
app.SiguienteButton.Position = [485 29 100 22];
app.SiguienteButton.Text = 'Siguiente';
% Create ObtenerDatosButton
app.ObtenerDatosButton = uibutton(app.UIFigure, 'push');
app.ObtenerDatosButton.ButtonPushedFcn = createCallbackFcn(app,
@ObtenerDatosButtonPushed, true);
app.ObtenerDatosButton.BackgroundColor = [0.302 0.7451 0.9333];
app.ObtenerDatosButton.FontSize = 15;
93
app.ObtenerDatosButton.Position = [42 317 163 51];
app.ObtenerDatosButton.Text = 'Obtener Datos';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = techos_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
94
rho=Datos.rho;
hu=Datos.hu;
cld=cl./cd
cs=(cl.^(3/2))./cd
atetha=atan(1./cld)
Vp=sqrt((2*w.*cos(atetha))./(rho.*S.*cl))
Vh=Vp.*cos(atetha)
Vv=-Vp.*sin(atetha)
for i=1:length(hu)
hn=hu(i)
txt=['Altitud [ft]= ', num2str(hn)];
plot(Vh(:,i),Vv(:,i),'DisplayName',txt), grid on, grid minor, hold on
title('Hodógrafas de descenso')
xlabel('Velocidad horizontal [m/s]'), ylabel('Velocidad vertical [m/s]')
legend show
end
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(aterrizaje_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 631 479];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [1 1 631 472];
app.Image.ImageSource = 'descenso.jpg';
% Create HODOGRAFASDEDESCENSOLabel
app.HODOGRAFASDEDESCENSOLabel = uilabel(app.UIFigure);
app.HODOGRAFASDEDESCENSOLabel.HorizontalAlignment = 'center';
app.HODOGRAFASDEDESCENSOLabel.FontSize = 22;
app.HODOGRAFASDEDESCENSOLabel.FontWeight = 'bold';
app.HODOGRAFASDEDESCENSOLabel.FontColor = [1 1 1];
app.HODOGRAFASDEDESCENSOLabel.Position = [1 388 631 85];
app.HODOGRAFASDEDESCENSOLabel.Text = 'HODÓGRAFAS DE
DESCENSO';
% Create ObtenerHodografasButton
app.ObtenerHodografasButton = uibutton(app.UIFigure, 'push');
95
app.ObtenerHodografasButton.ButtonPushedFcn = createCallbackFcn(app,
@ObtenerHodografasButtonPushed, true);
app.ObtenerHodografasButton.BackgroundColor = [0.651 0.651 0.651];
app.ObtenerHodografasButton.FontSize = 15;
app.ObtenerHodografasButton.Position = [29 54 181 57];
app.ObtenerHodografasButton.Text = 'Obtener Hodógrafas';
% Create SiguientepasoButton
app.SiguientepasoButton = uibutton(app.UIFigure, 'push');
app.SiguientepasoButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguientepasoButtonPushed, true);
app.SiguientepasoButton.BackgroundColor = [0.502 0.502 0.502];
app.SiguientepasoButton.FontSize = 14;
app.SiguientepasoButton.Position = [435 54 181 57];
app.SiguientepasoButton.Text = 'Siguiente paso';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = hodografas_descenso_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
96
SuperficieHumedam2EditFieldLabel matlab.ui.control.Label
sw matlab.ui.control.NumericEditField
AlargamientoAREditFieldLabel matlab.ui.control.Label
AR matlab.ui.control.NumericEditField
CoeficientedefriccinconfrenosLabel matlab.ui.control.Label
cfcf matlab.ui.control.NumericEditField
CoeficientedefriccinsinfrenosLabel matlab.ui.control.Label
cfsf matlab.ui.control.NumericEditField
DistanciatotaldeaterrizajemLabel matlab.ui.control.Label
CALCULARButton matlab.ui.control.Button
SiguienteButton matlab.ui.control.Button
Table matlab.ui.control.Table
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: CALCULARButton
function CALCULARButtonPushed(app, event)
ddt=load('potencia_disponible_ap')
Vel=ddt.Velms;
S=ddt.S;
rho=ddt.rho;
w=ddt.w;
Swet=app.sw.Value;
AR=app.AR.Value;
Mf=app.cfcf.Value;
M=app.cfsf.Value;
e=1/(1.05+0.007*AR*pi);
L=w;
z0=15.24; %altura normativa FAR 25 = 50FT=15.24m
g=9.81; %gravedad
Vs=Vel(1,:); %velocidad de desplome a diferentes altitudes
M=app.cfsf.Value; %coeficiente de fricción sin frenos pista de descenso
Mf=app.cfcf.Value; %coeficiente de fricción con frenos pista de descenso
Cfe=0.0055; %coeficiente de fricción de piel equivalente tabla RAYMER
%cálculos
%distancia de nivelación o enderezamiento
Va=1.3.*Vs %velocidad de aproximación [m/s]
Vtd=1.15.*Vs %velocidad de media aproximación [m/s]
Vf=1.23.*Vs %velocidad promedio durante la navegación [m/s]
%cálculo de la distancia de nivelación o enderezamiento
Cle=(2*L)./(S.*rho.*Va.^2); %coeficiente de sustentación
Cde=(Cfe*(Swet/S))+((Cle.^2)/(pi*AR*e)); %coeficiente de arrastre
De=0.5.*rho.*Va.^2*S.*Cde; %arrastre
B=L./De; %se debe hacer la corrección de potencia con la grafica,
%donde Z/Xt = L/D, grabit
Xa=z0.*(L./De); %distancia de aproximación
97
theta=(De/L); %ángulo de planeo °
R=(Vf.^2)./(2*g); %radio de nivelación [m]
Xt=R.*sin(theta) %distancia de nivelación o enderezamiento
%distancia de aterrizaje sin frenos
Cls=(2*L)./(S*Vs.^2.*rho); %coeficiente de sustentación
Cds=(Cfe*(Swet/S))+((Cls.^2)./(pi*AR*e)); %coeficiente de arrastre
Ds=0.5.*rho.*Vs.^2*S.*Cds; %arrastre
Xh=((Vs.^2)./(2*g.*(M-(Ds./L)))).*log(L*M./Ds)%distancia de aterrizaje sin frenos
%Distancia donde el avión toca el piso y sigue sin accionarse los frenos
%por 3 segundo
Xr=3*Vs %distancia de aterrizaje con rodadura sin frenos
Xf=((Vs.^2)./(2*g.*(Mf-(Ds./L)))).*log(L*Mf./Ds) %distancia de aterrizaje con
%rodadura con frenos
%Distancia total sin frenos
Xts=Xa+Xt+Xh
%Distancia total con frenos
Xtc=Xa+Xt+Xr+Xf
save('aterrizaje_ap','AR','e','Swet','Cfe')
Datt=[Xtc',Xts'];
app.Table.Data=Datt
end
% Button pushed function: SiguienteButton
function SiguienteButtonPushed(app, event)
open(Viraje_ap)
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 640 402];
app.UIFigure.Name = 'MATLAB App';
% Create ATERRIZAJELabel
app.ATERRIZAJELabel = uilabel(app.UIFigure);
app.ATERRIZAJELabel.BackgroundColor = [0.9294 0.6941 0.1255];
app.ATERRIZAJELabel.HorizontalAlignment = 'center';
app.ATERRIZAJELabel.FontSize = 22;
app.ATERRIZAJELabel.FontColor = [1 1 1];
app.ATERRIZAJELabel.Position = [1 360 640 43];
app.ATERRIZAJELabel.Text = 'ATERRIZAJE';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [1 -1 640 362];
98
app.Image.ImageSource = 'aterrizaje.jpg';
% Create SuperficieHumedam2EditFieldLabel
app.SuperficieHumedam2EditFieldLabel = uilabel(app.UIFigure);
app.SuperficieHumedam2EditFieldLabel.HorizontalAlignment = 'right';
app.SuperficieHumedam2EditFieldLabel.FontSize = 13;
app.SuperficieHumedam2EditFieldLabel.FontWeight = 'bold';
app.SuperficieHumedam2EditFieldLabel.FontColor = [1 1 1];
app.SuperficieHumedam2EditFieldLabel.Position = [17 301 104 30];
app.SuperficieHumedam2EditFieldLabel.Text = {'Superficie '; 'Humeda [ m2 ]'};
% Create sw
app.sw = uieditfield(app.UIFigure, 'numeric');
app.sw.FontSize = 13;
app.sw.Position = [136 309 80 22];
% Create AlargamientoAREditFieldLabel
app.AlargamientoAREditFieldLabel = uilabel(app.UIFigure);
app.AlargamientoAREditFieldLabel.HorizontalAlignment = 'right';
app.AlargamientoAREditFieldLabel.FontSize = 13;
app.AlargamientoAREditFieldLabel.FontWeight = 'bold';
app.AlargamientoAREditFieldLabel.FontColor = [1 1 1];
app.AlargamientoAREditFieldLabel.Position = [1 270 120 22];
app.AlargamientoAREditFieldLabel.Text = 'Alargamiento (AR)';
% Create AR
app.AR = uieditfield(app.UIFigure, 'numeric');
app.AR.Position = [136 270 80 22];
% Create CoeficientedefriccinconfrenosLabel
app.CoeficientedefriccinconfrenosLabel = uilabel(app.UIFigure);
app.CoeficientedefriccinconfrenosLabel.HorizontalAlignment = 'right';
app.CoeficientedefriccinconfrenosLabel.FontSize = 13;
app.CoeficientedefriccinconfrenosLabel.FontWeight = 'bold';
app.CoeficientedefriccinconfrenosLabel.FontColor = [1 1 1];
app.CoeficientedefriccinconfrenosLabel.Position = [-2 230 123 30];
app.CoeficientedefriccinconfrenosLabel.Text = {'Coeficiente de '; 'fricción con
frenos'};
% Create cfcf
app.cfcf = uieditfield(app.UIFigure, 'numeric');
app.cfcf.Position = [136 238 80 22];
% Create CoeficientedefriccinsinfrenosLabel
app.CoeficientedefriccinsinfrenosLabel = uilabel(app.UIFigure);
app.CoeficientedefriccinsinfrenosLabel.HorizontalAlignment = 'right';
app.CoeficientedefriccinsinfrenosLabel.FontSize = 13;
app.CoeficientedefriccinsinfrenosLabel.FontWeight = 'bold';
app.CoeficientedefriccinsinfrenosLabel.FontColor = [1 1 1];
app.CoeficientedefriccinsinfrenosLabel.Position = [3 192 118 30];
app.CoeficientedefriccinsinfrenosLabel.Text = {'Coeficiente de '; 'fricción sin
frenos'};
% Create cfsf
99
app.cfsf = uieditfield(app.UIFigure, 'numeric');
app.cfsf.Position = [136 200 80 22];
% Create DistanciatotaldeaterrizajemLabel
app.DistanciatotaldeaterrizajemLabel = uilabel(app.UIFigure);
app.DistanciatotaldeaterrizajemLabel.HorizontalAlignment = 'center';
app.DistanciatotaldeaterrizajemLabel.FontSize = 14;
app.DistanciatotaldeaterrizajemLabel.FontWeight = 'bold';
app.DistanciatotaldeaterrizajemLabel.FontColor = [1 1 1];
app.DistanciatotaldeaterrizajemLabel.Position = [332 321 221 40];
app.DistanciatotaldeaterrizajemLabel.Text = 'Distancia total de aterrizaje [ m ]';
% Create CALCULARButton
app.CALCULARButton = uibutton(app.UIFigure, 'push');
app.CALCULARButton.ButtonPushedFcn = createCallbackFcn(app,
@CALCULARButtonPushed, true);
app.CALCULARButton.BackgroundColor = [1 0.4118 0.1608];
app.CALCULARButton.FontSize = 14;
app.CALCULARButton.FontWeight = 'bold';
app.CALCULARButton.FontAngle = 'italic';
app.CALCULARButton.Position = [56 99 122 39];
app.CALCULARButton.Text = 'CALCULAR';
% Create SiguienteButton
app.SiguienteButton = uibutton(app.UIFigure, 'push');
app.SiguienteButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguienteButtonPushed, true);
app.SiguienteButton.BackgroundColor = [1 1 1];
app.SiguienteButton.Position = [494 23 100 22];
app.SiguienteButton.Text = 'Siguiente paso';
% Create Table
app.Table = uitable(app.UIFigure);
app.Table.ColumnName = {'Con frenos'; 'Sin frenos'};
app.Table.RowName = {};
app.Table.Position = [292 125 302 185];
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = aterrizaje_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
100
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
101
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
103
end
end
end
104
cll=d3.cll;
cdd=d3.cdd;
ClBmax=cll;
load('ISAEU')
ISAH=ISAEU(:,1);
ISAR=ISAEU(:,4);
den=polyfit(ISAH,ISAR,2)
%datos
Wi=w*9.81 %peso inicial [kg]
Cpd=Cfe*Swet/S %coeficiente de arrastre parasito
%altitud crucero ingresada por el usuario
pos=find(hu==alt)
den= polyval(den,alt) %densidad a la cual está volando
den=(den*16.0185)/9.8066
PMC=pmc(pos)*745.7 %Potencia Máxima Continua [HP]
Cons=app.cdc.Value;
Cons=Cons*(9.81/3600) %Consumo de combustible [kg/h]}
VC=app.vc.Value %Velocidad crucero ingresada por el usuario
n=rpm(pos)/60
J=VC/(n*d) %Cálculo de
j=polyfit(X,Y,10)
eta=polyval(j,J)
Wfb=app.pdc.Value;
Wfb=Wfb*9.81 %peso de combustible a bordo ficha técnica
Wini=Wi-Wfb %peso en bruto de ficha
Wfr=((Cons*45)/60)*9.81;
Wfu=Wfb-Wfr; %peso del combustible
Wf=Wini-Wfu %peso final [kg]
Cdp=Cfe*(Swet/S);
ClBmax=cll
%calculo
Cdi=(ClBmax^2)/(pi*AR*e)
Cd=Cdp+Cdi
B=ClBmax/Cd
ConsPMC=(Cons)/(PMC)
Cs=(ClBmax^(1.5))/Cd
raizauto=sqrt(2*den*S)
final=(1/sqrt(Wf))-(1/sqrt(Wi))
alcance=((eta/ConsPMC)*B*log(Wi/Wf))/1000
%Autonomía
Autonomia=(eta/ConsPMC)*Cs*raizauto*final %segundos
Autom=Autonomia/60 %minutos
Autoh=Autom/60 %horas
app.ALC.Value=alcance;
app.AUT.Value=Autoh;
end
105
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 591 476];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [-5 1 592 476];
app.Image.ImageSource = 'alcance.jpg';
% Create ALCANCEYAUTONOMALabel
app.ALCANCEYAUTONOMALabel = uilabel(app.UIFigure);
app.ALCANCEYAUTONOMALabel.HorizontalAlignment = 'center';
app.ALCANCEYAUTONOMALabel.FontSize = 22;
app.ALCANCEYAUTONOMALabel.FontWeight = 'bold';
app.ALCANCEYAUTONOMALabel.FontAngle = 'italic';
app.ALCANCEYAUTONOMALabel.Position = [2 430 591 47];
app.ALCANCEYAUTONOMALabel.Text = 'ALCANCE Y AUTONOMÍA';
% Create consumodecombustiblekghEditFieldLabel
app.consumodecombustiblekghEditFieldLabel = uilabel(app.UIFigure);
app.consumodecombustiblekghEditFieldLabel.HorizontalAlignment = 'right';
app.consumodecombustiblekghEditFieldLabel.Position = [7 326 116 28];
app.consumodecombustiblekghEditFieldLabel.Text = {'Consumo de'; '
combustible [ kg/h ] '};
% Create cdc
app.cdc = uieditfield(app.UIFigure, 'numeric');
app.cdc.Position = [138 332 100 22];
% Create PesodelcombustibleabordokgLabel
app.PesodelcombustibleabordokgLabel = uilabel(app.UIFigure);
app.PesodelcombustibleabordokgLabel.HorizontalAlignment = 'right';
app.PesodelcombustibleabordokgLabel.Position = [3 282 120 28];
app.PesodelcombustibleabordokgLabel.Text = {'Peso del combustible'; ' a bordo
[ kg ]'};
% Create pdc
app.pdc = uieditfield(app.UIFigure, 'numeric');
app.pdc.Position = [138 288 100 22];
% Create AlcancekmLabel
app.AlcancekmLabel = uilabel(app.UIFigure);
app.AlcancekmLabel.HorizontalAlignment = 'right';
app.AlcancekmLabel.Position = [351 369 81 22];
app.AlcancekmLabel.Text = 'Alcance [ km ]';
% Create ALC
app.ALC = uieditfield(app.UIFigure, 'numeric');
106
app.ALC.Editable = 'off';
app.ALC.Position = [447 369 100 22];
% Create AutonomahorasEditFieldLabel
app.AutonomahorasEditFieldLabel = uilabel(app.UIFigure);
app.AutonomahorasEditFieldLabel.HorizontalAlignment = 'right';
app.AutonomahorasEditFieldLabel.Position = [322 332 110 22];
app.AutonomahorasEditFieldLabel.Text = 'Autonomía [ horas ]';
% Create AUT
app.AUT = uieditfield(app.UIFigure, 'numeric');
app.AUT.Editable = 'off';
app.AUT.Position = [447 332 100 22];
% Create CalcularButton
app.CalcularButton = uibutton(app.UIFigure, 'push');
app.CalcularButton.ButtonPushedFcn = createCallbackFcn(app,
@CalcularButtonPushed, true);
app.CalcularButton.BackgroundColor = [1 0.4118 0.1608];
app.CalcularButton.FontSize = 16;
app.CalcularButton.FontWeight = 'bold';
app.CalcularButton.FontAngle = 'italic';
app.CalcularButton.FontColor = [1 1 1];
app.CalcularButton.Position = [221 77 138 45];
app.CalcularButton.Text = 'Calcular';
% Create velocidadcrueromsLabel_2
app.velocidadcrueromsLabel_2 = uilabel(app.UIFigure);
app.velocidadcrueromsLabel_2.HorizontalAlignment = 'right';
app.velocidadcrueromsLabel_2.Position = [30 363 94 28];
app.velocidadcrueromsLabel_2.Text = {'Velocidad cruero'; ' [ m/s]'}
% Create vc
app.vc = uieditfield(app.UIFigure, 'numeric');
app.vc.Position = [139 369 100 22];
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = alcance_autonomia_ap
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
107
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
Bibliografía y referencias
[1] Abbott, I. H., & Von Doenhoff, A. E. Theory of Wing Sections, Including a Summary
of Airfoil Data (Ed. rev.). NEW YORK, USA: Dover Publications, 1959.
[2] Anderson, M. R., & Mason, W. H. AIAA 96-4058 An MDO Approach to Control-
https://pdfs.semanticscholar.org/ca60/6ac3e1e8f9561f3be5593758169731ec827
1.pdf, 1996.
https://la.mathworks.com/products/matlab.html, 1984.
https://la.mathworks.com/discovery/matlab-gui.html
[6] Barnes W. Mc Cormick, Aerodynamics, aeronautics and flight mechanics, Ed. John
[7] Ordoñez Robledo, Carlos. Aerodinámica IV, Ed. UTEHA, México, 1973.
108
[8] Von Mises. Theory of flight. Ed. Dover Publications, USA, 1978.
[9] F.A.A. (s. f.). Federal Aviation Administration. Recuperado 5 de mayo de 2021, de
https://www.faa.gov
[10] Raymer, D. P. Aircraft Design: A Conceptual Approach (2nd ed.). Washington, DC:
109