Está en la página 1de 123

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Programación de una aplicación gráfica en


MATLAB para el cálculo de los rendimientos y
actuaciones de un avión monomotor de
combustión interna con hélice

PRESENTA:

Rodríguez Claudio Fernando Timoteo


Urzúa Toledano Oscar Uriel

ASESORES:

M. en I. Correa Arredondo José Arturo


M. en C. Oropeza Osornio Armando

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

Instituto Politécnico Nacional


Presente

Bajo protesta de decir verdad el que suscribe Rodríguez Claudio Fernando


Timoteo, Urzúa Toledano Oscar Uriel manifiesto ser autor (a) y titular de los
derechos morales y patrimoniales de la obra “Programación de una aplicación
gráfica en MATLAB para el cálculo de los rendimientos y actuaciones de un
avión monomotor de combustión interna con hélice”. en adelante “La Tesina” y
de la cual se adjunta copia, por lo que por medio del presente y con fundamento
en el artículo 27 fracción II, inciso b) de la Ley Federal del Derecho de Autor,
otorgo a el Instituto Politécnico Nacional, en adelante El IPN, autorización no
exclusiva para comunicar y exhibir públicamente total o parcialmente en medios
digitales (Repositorio digital de la Dirección de Bibliotecas del IPN) “La
Tesina” por un periodo de (5 años ) contado a partir de la fecha de la presente
autorización, dicho periodo se renovará automáticamente en caso de no dar aviso
expreso a “El IPN” de su terminación.

En virtud de lo anterior, “El IPN” deberá reconocer en todo momento mi calidad de


autor de “La Tesina”.

Adicionalmente, y en mi calidad de autor y titular de los derechos morales y


patrimoniales de “La Tesina”, manifiesto que la misma es original y que la presente
autorización no contraviene ninguna otorgada por el suscrito respecto de “La
Tesina”, por lo que deslindo de toda responsabilidad a El IPN en caso de que el
contenido de “La Tesina” o la autorización concedida afecte o viole derechos
autorales, industriales, secretos industriales, convenios o contratos de
confidencialidad o en general cualquier derecho de propiedad intelectual de
terceros y asumo las consecuencias legales y económicas de cualquier demanda
o reclamación que puedan derivarse del caso.

Ciudad de México, 15 de junio de 2022

Atentamente

______________________________ ______________________
Rodríguez Claudio Fernando Timoteo Urzúa Toledano Oscar Uriel
Índice
Simbología ...................................................................................................................... I

Glosario de términos ..................................................................................................... VI

Abreviaturas.................................................................................................................. VI

Lista de tablas .............................................................................................................. VII

Lista de imágenes ........................................................................................................ VII

Resumen ....................................................................................................................... 1

Abstract ......................................................................................................................... 1

Introducción ................................................................................................................... 2

Antecedentes ................................................................................................................. 3

Alcance .......................................................................................................................... 4

Justificación ................................................................................................................... 5

Objetivo general ............................................................................................................. 6

Objetivos específicos ..................................................................................................... 6

Metodología ................................................................................................................... 7

Capitulado ..................................................................................................................... 8

Capítulo 1-. Rendimientos.............................................................................................. 9

Sistema de propulsión ................................................................................................ 9

Motor .......................................................................................................................... 9

Corrección de la potencia por altitud .......................................................................... 9

Hélice ....................................................................................................................... 18

Potencia disponible .................................................................................................. 20

Potencia requerida ................................................................................................... 24

Capítulo 2. Actuaciones. .............................................................................................. 29

Despegue ................................................................................................................. 29
Recorrido horizontal .............................................................................................. 30

Recorrido de transición ......................................................................................... 32

Recorrido de subida .............................................................................................. 32

Recorrido total ...................................................................................................... 32

Ascenso ................................................................................................................... 34

Hodógrafas de ascenso ........................................................................................ 34

Techos ..................................................................................................................... 36

Techo absoluto ..................................................................................................... 36

Techo Práctico o de servicio ................................................................................. 36

Techo operacional ................................................................................................ 37

Tiempo de ascenso .................................................................................................. 38

Descenso ................................................................................................................. 39

Hodógrafas de descenso ...................................................................................... 39

Aterrizaje .................................................................................................................. 42

Distancia de aproximación .................................................................................... 43

Distancia de nivelación o enderezamiento ............................................................ 44

Distancia de aterrizaje o rodadura ........................................................................ 44

Viraje coordinado (correcto) ..................................................................................... 47

Alcance .................................................................................................................... 49

Autonomía ................................................................................................................ 50

Conclusiones ............................................................................................................... 53

Anexos ......................................................................................................................... 54

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


Anexo C. Código para calcular la variación de la potencia del motor por la altitud ... 57

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 F. Código para obtener el parámetro de similitud J contra la eficiencia de la


hélice. ....................................................................................................................... 70

Anexo G. Código para calcular la potencia disponible .............................................. 72

Anexo H. Código para presentar las gráficas de potencia disponible vs potencia


requerida .................................................................................................................. 80

Anexo I. Código para calcular las distancias de despegue ....................................... 84

Anexo J. Código para obtener las hodógrafas de ascenso. ...................................... 89

Anexo K. Código para obtener los techos................................................................. 91

Anexo L. Código para obtener las hodógrafas de descenso. .................................... 94

Anexo M. Código para calcular las distancias de aterrizaje. ..................................... 96

Anexo N. Código para calcular el viraje. ................................................................. 101

Anexo Ñ. Código para calcular el alcance y la autonomía del avión. ...................... 104

Bibliografía y referencias............................................................................................ 108


Simbología
Símbolo Descripción Unidad
σ Densidad relativa del aire en atmosfera
estándar
P Potencia del motor HP
J Parámetro de similitud de la hélice
nh Velocidad de rotación de la hélice 1/min
ƞ Eficiencia de la hélice
𝑃𝑑 Potencia disponible HP
𝑃𝑟 Potencia necesaria o requerida HP
Vd Velocidad de despegue m/s
Xh Recorrido horizontal (despegue) m
Xt Recorrido de transición (despegue) m
Xs Recorrido de subida (despegue) m
r Radio m
θts Ángulo de transición y subida rad
Dd Arrastre del avión en velocidad de N
despegue
Ld Sustentación del avión en velocidad de N
despegue
φ Densidad del aire atmosférico respectiva kg/m3
a cada altitud
g Aceleración de la gravedad m/s2
D Diámetro de la hélice m
CT0 Coeficiente de tracción cuando la
velocidad es cero
CTd Coeficiente de tracción cuando la
velocidad es igual a la velocidad de
despegue

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.

Agencia Federal de Aviación Civil: (AFAC) es aquella agencia gubernamental de los


Estados Unidos Mexicanos encargada de regular los aspectos de la aviación en dicho
país.

Aplicación gráfica: (AG) es un contenido gráfico desarrollado por interfaces gráficas, la


cual muestra información al usuario de manera visual.

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.

Ángulo de peralte: también conocido como “ángulo de banqueo”, es el ángulo formado


respecto a eje vertical cuando el avión realiza un viraje recto y nivelado.

App designer: es un entorno de desarrollo interactivo para diseñar una aplicación y


programar su comportamiento. Proporciona una versión totalmente integrada del editor
de MATLAB® y un gran conjunto de componentes interactivos de la IU. También ofrece
un administrador de diseño de cuadrículas para organizar la interfaz de usuario y
opciones de reordenación automáticas para hacer que su app detecte y responda a los
cambios del tamaño de pantalla.

Abreviaturas
AG: Aplicación gráfica.

IG: Interfaz gráfica.

AGD: Aplicación gráfica didáctica.

MV: Mecánica de vuelo.

RAE: Real Academia Española.

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.

The application is subdivided into several dependent interfaces, to have a better


visualization and arrangement of the results.

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.

Sabiendo esto, la aplicación gráfica considera conceptos, procedimientos y normas


dictados por la FAA (la AFAC se homologa con FAA), y su utilización (de la AG), será
básicamente por estudiantes y académicos en la carrera de ingeniería en 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.

Cuando la AG emita resultados, estos podrán ser visualizados en un sistema mixto. En


caso de que los resultados no son los que esperaba el usuario por haber ingresado
valores incorrectos, o por haber ingresado pocos datos para ciertos cálculos, o si desea
visualizar el comportamiento del avión si cambia ciertos valores, no será necesario iniciar
desde cero, sino que, el usuario deberá dirigirse a la ventana donde desea hacer la
modificación, modificar los datos y volver a correrla, para que así los datos sean
actualizados en las interfaces posteriores.

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.

En la Escuela Superior de Ingeniería, Mecánica y Eléctrica, unidad Ticomán, ESIMET,


del Instituto Politécnico Nacional, IPN, de México, se ofrece la carrera de Ingeniero en
Aeronáutica.

El Plan de Estudios actual de dicha carrera, tiene la asignatura de Mecánica de Vuelo,


MV, que se imparte en el sexto semestre. En el curso de MV, el alumno tiene la
oportunidad de aplicar los conocimientos adquiridos en los cinco semestres previos para
calcular los rendimientos y las actuaciones de un avión.

El curso de MV suele desarrollarse con base en un proyecto que requiere de conceptos


de varias disciplinas, teniendo como eje la Física del avión representada por su
Aerodinámica y la aplicación de conceptos de otras materias como Propulsión,
Legislación Aeronáutica, Operaciones Aeronáuticas, entre otras.

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.

Por lo anterior, y en nuestra actual condición de estudiantes y aprovechando la opción


de titulación curricular, proponemos el desarrollo de una aplicación gráfica didáctica,
AGD, que mejore y facilite el trabajo de cálculo, aprovechando otros recursos más
actuales y poderosos de la informática, como lo es el Matlab para calcular los
rendimientos y actuaciones de un avión monomotor de combustión interna sin
sobrealimentación, propulsado con hélice.

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 permitirá al usuario (especialmente estudiantes o profesores) ver como se


ven afectados los cálculos para el avión dependiendo de los valores ingresados, el
sistema de propulsión elegido, la altitud a la que opera la aeronave, etc.

La aplicación servirá para un avión que cumpla y se desempeñe bajo las siguientes
características:

• Para un avión (aeronave de ala fija) propulsada por un motor de combustión


interna sin sobrealimentación y con uso de una hélice de paso fijo.
• Opera en condiciones de la atmósfera estándar internacional (ISA) y se considera
viento en calma.
• Se considera la aerodinámica básica del avión.

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.

Como una continuidad en su alcance, se propone el desarrollo de la versión 2 de esta


AG para evolucionar, considerando el cálculo de la mecánica de vuelo del avión
incorporando a su sistema de propulsión la sobrealimentación y el paso variable
automático en su hélice. También se prevé la utilización de un estudio aerodinámico más
completo para incorporar por ejemplo la utilización de superficies hipersustentadoras
durante las actuaciones de despegue y aterrizaje; el vuelo con la presencia de viento
atmosférico, entre otras.

Justificación

Actualmente no se cuenta con un programa de MATLAB desarrollado por alumnos de la


ESIME Ticomán para el en cálculo de las actuaciones y rendimientos de un avión
monomotor con hélice, debido a que la mayoría de los estudiantes realiza sus cálculos
con ayuda de herramientas como Excel, hojas de cálculo y softwares de diseño que
funcionan, pero en términos ingenieriles, no soy muy prácticos, ya que cada uno trabaja
de manera independiente.

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.

Está basado en el curso de Mecánica de Vuelo de sexto semestre, así como en la


investigación en diferentes fuentes bibliográficas recomendadas en el plan sintético de
dicho curso.

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.

Realizar un orden de cálculos de rendimientos y actuaciones acorde a las ecuaciones y


datos de entrada que cada ecuación requiere con el fin de evitar la solicitud de datos
repetidos.

Metodología

Dado el enfoque didáctico utilizado en el desarrollo de este proyecto: Programación de


una aplicación gráfica en MATLAB para el cálculo de los rendimientos y actuaciones de
un avión monomotor de combustión interna con hélice, cuyo contenido guarda cierto
paralelismo con el temario de la asignatura de Mecánica de Vuelo, se puede considerar
como un proceso de ruta crítica o un método de desarrollo similar al PERT (Project
Evaluation Review Technique).

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.

Además de aprovechar la ruta implícita en el desarrollo del temario de la asignatura de


Mecánica de Vuelo, en la cual, las actividades (los cálculos), se van desarrollando en
escalera, es decir, la siguiente (actividad), depende de la anterior, se tiene un proceso
unidireccional.

No obstante, en el camino o al final del proceso, se prevé la posibilidad de modificar


datos, los cuales pueden ser integrados a la AG y actualizar los resultados.

También se considera como un método deductivo que utiliza los conocimientos y


experiencia adquiridos para monitorear los avances y detectar resultados o tendencias
desviadas a lo esperado y con ello, efectuar revisiones y o correcciones oportunas.

Para llevar a cabo el proyecto de investigación, se investigará en libros y sitios web


confiables para poder desarrollar los temas con un buen soporte.
7
Capitulado
Capítulo 1. Rendimientos

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.

Corrección de la potencia por altitud


Desde un punto de vista termodinámico, la potencia de salida para un motor de
combustión interna es afectada por las condiciones atmosféricas en las que este opera.

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.

Los fabricantes de motores proporcionan la información necesaria para los rangos de


funcionamiento del motor como se muestra en la Figura 1 donde se proporciona la
información de la potencia producida por el motor a diferentes altitudes y numero de rpm.

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:

𝜔(ℎ) = 1.176 𝜎 − 0.176 (1)


Donde sigma, 𝜎, es la densidad relativa del aire en atmosfera estándar con respecto a la
altitud, que es tomado de la Tabla 1.

Tabla 1. Atmosfera estándar, tomada de Theory of fligth, Richard Von Mises

p ϒ 𝑝
h [ft] θ [°F] σ
[in. Hg] [lb. / ft.3] 𝑝0

0 59.0 29.92 0.07651 1.0000 1.0000


2,500 50.1 27.31 0.07107 0.9129 0.9288
5,000 41.2 24.89 0.06592 0.8320 0.8616
7,500 32.3 22.65 0.06107 0.7571 0.7982
10,000 23.3 20.58 0.05649 0.6876 0.7384
12,500 14.4 18.65 0.05219 0.6234 0.6821
15,000 5.5 16.88 0.04814 0.5642 0.6291
17,500 -3.4 15.25 0.04433 0.5097 0.5793
20,000 -12.3 13.75 0.04075 0.4594 0.5327
25,000 -30.2 11.10 0.03427 0.3709 0.4480
30,000 -48.0 8.880 0.02861 0.2968 0.3740
35,000 -65.8 7.036 0.02369 0.2352 0.3098
40,000 -67.0 5.541 0.01872 0.1852 0.2447
45,000 -67.0 4.364 0.01474 0.1458 0.1926
50,000 -67.0 3.436 0.01161 0.1149 0.1517

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

𝜎 (ℎ) = 2.0611ℎ2 − 2.70042ℎ + 0.992 (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).

Figura 4. Ajuste polinómico para valores de σ a diferentes altitudes

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.

𝑃𝑏𝑟 (ℎ) = 𝜔 ∗ 𝑃𝑏𝑟 𝑁.𝑀 (3)

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.

Con base en el comportamiento lineal de las curvas que representan el comportamiento


de la potencia vs rpm vs altitud de las gráficas típicas de este tipo de motores, como el
ejemplo de la figura 1, se propone considerar que el usuario ingrese dos puntos de la
gráfica de potencia del motor de su elección: a nivel del mar y su altitud máxima posible.
Tomando el mismo motor de ejemplo, se obtiene una gráfica como la se observa en la
Figura 8, no sin antes haber llenado lo solicitado por la AG como se muestra en la Figura
7.

16
Figura 7. Solicitud de datos después de haber seleccionado la opción 2 (ejemplo).

Figura 8. Visualización de la potencia corregida por altitud (ejemplo, opción 2).

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.

Las características de una hélice dependen:

• De la velocidad del avión en la dirección del eje de la hélice;


• Del número de vueltas que da la hélice, en la unidad de tiempo;
• Del diámetro de la hélice;
• Del número de palas;
• De los perfiles empleados;
• De la forma en planta de las palas;
• De los ángulos que forman las cuerdas de los perfiles con el plano de rotación.

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.

La aplicación gráfica muestra una ventana como se visualiza en la Figura 9, en donde el


usuario tiene la opción de ver un video tutorial (en caso de que desconozca el cómo
utilizar la aplicación Grabit). Únicamente debe dar clic en el botón de “Hyperlink” y se
abrirá un video tutorial.

Figura 9. Parámetro de similitud J contra la eficiencia de la hélice.

Si se selecciona la opción de “Comenzar”, el usuario puede hacer una réplica de la


gráfica de la hélice a partir de la imagen, como se muestra a continuación en la Figura
10.

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

El usuario debe guardar el archivo en la carpeta de la aplicación ya que posteriormente


se utilizará para hacer los cálculos de potencia disponible.

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)

Donde con anterioridad, el usuario obtuvo la eficiencia de la hélice con ayuda de la


aplicación Grabit.

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.

Posteriormente se realizará el cálculo de la potencia disponible, considerando la potencia


de mejor rendimiento para el motor, o bien la potencia que el usuario determine.

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

El parámetro de similitud J viene dado por:

𝑉
𝐽= (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).

La AG le pide al usuario que ingrese la polar de la aeronave, la cual debe de estar en un


archivo .xlsx (Excel) y debe empezar a partir del coeficiente de levantamiento igual a 0 o
uno superior hasta el coeficiente de levantamiento máximo. La AG hace una
consideración para no utilizar los coeficientes de levantamiento negativos igual a cero,
para evitar sustentaciones negativas o una indeterminación. La velocidad se calcula para
las diferentes altitudes ingresadas por el usuario en donde el único parámetro que varía
es la densidad.

2𝑊
𝑉=√ (6)
𝜑 𝑆 𝐶𝐿

Donde:

W es el peso de la aeronave. Se asume constante durante los cálculos

S es la superficie alar en metros cuadrados y de igual manera es constante.

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

𝐶𝐿 es el coeficiente de levantamiento utilizado de la polar del avión.

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.

Figura 12. Potencia disponible (con datos de ejemplo).

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.

Durante el vuelo horizontal y a velocidad constante, la tracción producida por el sistema


propulsor deberá ser igual a la resistencia al avance producida por la aerodinámica del
avión, es decir, vuelo en equilibrio.

Si la potencia disponible supera a la potencia requerida, implicará un aumento en la


fuerza de tracción por lo que el avión aumentará su velocidad (y su altitud) y por
consiguiente aumenta la fuerza de arrastre, así que, en algún punto, de la velocidad de
desplazamiento la fuerza de arrastre se igualará a la fuerza de tracción provocando que
el movimiento sea nuevamente a velocidad constante, pero a mayor altitud.

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.

Para el cálculo de la potencia requerida la aplicación primero calcula el arrastre


producido:

𝐷𝑑 = 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.

Una vez presionado el botón “OBTENER GRÁFICA” muestra la comparación de las


potencias a diferentes altitudes (las cuales fueron ingresadas por el usuario) en
diferentes gráficas. En la Figura 15 se pueden observar algunos ejemplos.

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

Figura 16. Recorridos parciales durante el despegue.

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:

1. Recorrido horizontal, Xh (relativamente largo, con un ángulo de ataque constante,


durante el cual las ruedas están todo el tiempo en contacto con el suelo, la
velocidad va aumentando desde cero hasta la velocidad de despegue).
2. Recorrido de transición, Xt (corto, en el que se aumenta bruscamente el ángulo de
ataque para lograr el despegue).
3. Recorrido de subida, Xs (en el cual el avión se va elevando, en forma constante,
hasta pasar por encima del obstáculo (imaginario) de 35 pies de altura (15.24
metros), y que dependerá del ángulo dado para la subida, normalmente menor de
10°, y muy rara veces, pasa de 15°)

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

Se prosigue con la fuerza friccional a la rodadura inicial:

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

Coeficiente de fricción Coeficiente de fricción


Naturaleza del campo de despegue a la rodadura (sin a la rodadura (con
frenos) frenos)
Hormigón, asfalto, macada o madera 0.03 – 0.05 0.3 – 0.5
Hormigón mojado 0.05 0.15 – 0.3
Buen terreno, de césped duro 0.04 – 0.05 0.4
Terreno de césped blando 0.07 0.2
Hierba húmeda 0.08 0.2
Suciedad firma 0.07 0.2
Campo cubierto de nieve o hielo 0.02 0.06 – 0.10

Y la fuerza friccional al momento del despegue:

𝐹𝑓𝑑 = 𝜇𝑑 ( 𝑊𝑖 − 𝐿𝑑 ) (12)
Donde:

1 2
𝐿𝑑 = 𝑉 𝑆 𝜑 𝐶𝐿 𝛽 𝑚𝑎𝑥 (13)
2 𝑑
Donde:

𝑉𝑑 ≥ (1.2 ∗ 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑 𝑑𝑒 𝑑𝑒𝑠𝑝𝑙𝑜𝑚𝑒) (14)

La fuerza neta de tracción cuando la velocidad es cero:

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

Finalmente se obtiene el segmento horizontal:

𝑊𝑖 ∗ 𝑉𝑑 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.

Al igual se le solicitará al usuario que ingrese el coeficiente de fricción de la pista de


despegue, existe un botón que dice “Tabla de coeficientes” que ayuda al usuario
mostrándole algunos de los coeficientes de fricción a la rodadura más comunes. Los
demás datos son “arrastrados” de interfaces anteriormente utilizadas.

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.

La aplicación de Matlab se encargará de calcular el tiempo de ascenso y las hodógrafas,


donde se graficará las componentes de velocidad horizontal contra la componente de la
velocidad vertical.

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.

Para calcular la componente de la velocidad ascensional (vertical) se usa la siguiente


formula:

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.

Para las componentes de las velocidades horizontales:

𝑉ℎ𝑎 = √𝑉𝑎 − 𝑉𝑣𝑎 (28)

La aplicación muestra la siguiente interfaz:

Figura 21. Interfaz que permite obtener las hodógrafas de ascenso.

No es necesario solicitar algún dato, puesto que ya se tienen los valores calculados con
interfaces utilizadas con anterioridad.

Al darle clic en “OBTENER HODÓGRAFAS DE ASCENSO”, muestra la gráfica de estas,


como se ve en la Figura 22. Estas hodógrafas cuentan con una serie de círculos en lugar
de líneas, puesto que solo son tomadas las componentes de las velocidades positivas.
El código transforma los valores negativos en cero, si optáramos por una línea continua

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.

Figura 22. Gráfica de hodógrafas de ascenso (ejemplo).

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.

Techo Práctico o de servicio


Es la altitud en la cual la componente de la velocidad vertical de ascenso es igual a 100
pies por minuto (es decir 0.508 m/s).

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.

La aplicación se encargará de graficar las velocidades verticales máximas con sus


respectivas altitudes, encontrará el punto donde la recta de primer orden intercepte al eje
x para encontrar así el techo absoluto. A su vez, encontrará el punto en la recta donde la
velocidad sea igual a 0.508 m/s para hallar el techo de servicio.

Lo único que hay que hacer es darle clic en “OBTENER DATOS”, como se presenta en
la Figura 23.

Figura 23. Ventana para calcular los techos.

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.

Tiene una vista como la siguiente Figura 25.

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:

𝑉𝑣𝑑 = 𝑉𝑑𝑒 𝑠𝑒𝑛𝜃𝑑 (30)


Y la horizontal:

𝑉ℎ𝑑 = 𝑉𝑑𝑒 𝑐𝑜𝑠𝜃𝑑 (31)


Donde:

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.

La aplicación muestra la siguiente ventana:

Figura 26. Ventana para obtener las hodógrafas de descenso.

Y al darle clic en “OBTENER HODÓGRAFAS”, son mostradas al usuario, como en la


Figura 27 y en la Figura 28.

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.

Figura 29. Recorridos parciales durante el aterrizaje.

1. Distancia de aproximación Xa, necesaria para pasar, en planeo, por encima un


obstáculo (imaginario) de una altura determinada, con una velocidad y un ángulo
sensiblemente constantes;
2. Distancia necesaria para realizar la nivelación o el enderezamiento del avión Xta,
perdiendo velocidad, con el fin de que se mantenga a una cierta altura del suelo
constante y relativamente pequeña, hasta que se produce el desplome; y
3. Distancia necesaria para la carrera de aterrizaje o rodadura Xha. Esa distancia
puede ser menor si se emplea frenos, ya sea sobre las ruedas, de tipo
aerodinámico o por inversión del sistema propulsor, cuando el avión cuenta con
una hélice de paso variable. La aplicación solo considera con frenos y sin frenos
sobre las ruedas.

42
Distancia de aproximación
Primeramente, se calculan ciertas velocidades:

1. La velocidad de aproximación:

𝑉𝑎𝑝 = 1.3 𝑉𝑠 (34)


2. La velocidad de media aproximación:

𝑉𝑡𝑑 = 1.15 𝑉𝑠 (35)


3. La velocidad promedio

𝑉𝑓 = 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.

Tabla 3. Coeficiente de fricción superficial equivalente (obtenido del libro de Raymer)

Tipo de avión 𝐶𝑓𝑒 − 𝑠𝑢𝑏𝑠ó𝑛𝑖𝑐𝑜


Bombardero y transporte civil 0.0030
Carga militar (Fuselaje alto hacía arriba) 0.0035
Caza de la Fuerza aérea 0.0035
Combate de la marina 0.0040
Avión de crucero supersónico limpio 0.0025
Aviones ligeros - monomotor 0.0055
Aviones ligeros - bimotor 0.0045
Hidroaviones (turboeje) 0.0065
Hidroaviones (turborreactor) 0.0040

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.

Se prosigue a obtener el arrastre:

1
𝐷𝑎 = 𝜑 𝑉𝑎𝑝 2 𝑆 𝐶𝐷𝑎 (39)
2
Y con los resultados anteriores, finalmente se encuentra la distancia de aproximación:

𝐿𝑎
𝑋𝑎 = ℎ𝑟 (40)
𝐷𝑎
Y el ángulo de planeo:

𝐷𝑎
𝜃𝑝 ≈ ( ) (41)
𝐿𝑎

Distancia de nivelación o enderezamiento


La siguiente distancia de la carrera de aterrizaje, que es la de nivelación o
enderezamiento, tiene que ver con el ángulo de planeo y el radio de nivelación. Para
hacer los cálculos más precisos se usará el método que presenta Raymer en su libro.

𝑉𝑓 2
𝑟𝑛 = (42)
0.2 𝑔
Por lo tanto:
𝑋𝑡𝑎 = 𝑟𝑛 𝑠𝑒𝑛 𝜃𝑝 (43)

Distancia de aterrizaje o rodadura


Para el último tramo, hay que tomar dos casos:

1. Donde no hay aplicación de los frenos en la rodadura, solamente existe la


fricción con la pista;
2. Donde existe la aplicación de los frenos en la rodadura.

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 𝑔 (𝜇𝑎 − 𝐿 𝑟 )
𝑎

El avión totalmente apoyado en tierra sobre su tren de aterrizaje y por la reducida


velocidad, en condición de desplome, el piloto deja correr libre al avión durante unos
segundos, desacelerando, hasta sentir el pleno control rodando sobre la pista.
Dependiendo del espacio disponible de pista, el tiempo puede ser de 0 a 3 segundos
para luego iniciar la aplicación de frenos.

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:

𝑋𝑟𝑎 = (3)(𝑉𝑆 ) (48)


Y por último la distancia de aterrizaje donde los frenos fueron accionados:

𝑉𝑠 2 𝐿 𝑎 𝜇𝑓
𝑋𝑓𝑎 = 𝑙𝑜𝑔 ( ) (49)
𝐷 𝐷𝑟
2𝑔 (𝜇𝑓 − 𝐿 𝑟 )
𝑎

La distancia total de la carrera de aterrizaje sin la aplicación de los frenos sobre la


rodadura será:

45
𝑋𝑡𝑎𝑠 = 𝑋𝑎 + 𝑋𝑡𝑎 + 𝑋ℎ𝑎 (50)
La distancia total de la carrera de aterrizaje con la aplicación de los frenos sobre la
rodadura será:

𝑋𝑡𝑎𝑓 = 𝑋𝑎 + 𝑋𝑡𝑎 + 𝑋𝑟𝑎 + 𝑋𝑓𝑎 (51)


La ventana que muestra la AG es:

Figura 30. Ventana para calcular las distancias de aterrizaje a diferentes altitudes.

Donde se le solicitan al usuario: la superficie húmeda del avión; el alargamiento; el


coeficiente de fricción a la rodadura con frenos y sin frenos (los cuales son obtenidos de
tablas, como se pudo observar en la Tabla 2 ubicada en el tema de despegue).

Después de agregar los datos solicitados, se le debe de dar clic en “CALCULAR” y se


muestra la tabla con los valores correspondientes para cada altitud como se muestra en
la siguiente Figura 31.

46
Figura 31. Ventana con las distancias de aterrizaje a diferentes altitudes (ejemplo).

Viraje Coordinado (correcto)


El viraje es un giro alrededor del eje z del avión que se utiliza para cambiar la dirección
de vuelo del avión, sin problemas de derrape o resbalamiento.

Figura 32. Representación de un viraje coordinado alrededor del eje z.

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.

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

Donde se le solicitan al usuario la velocidad a la cual va el avión y su ángulo de peralte.


Al finalizar el llenado, se le debe de dar clic en “CALCULAR” y se mostrará la velocidad
tangencial y el radio de viraje del avión, como se muestra en la Figura 34.

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.

Para determinar el alcance de un avión, se utiliza la siguiente formula (recordando que


se tiene la consideración de un vuelo a altitud crucero):

𝜂 𝐶𝐿 𝑊𝑖
𝐴𝑙𝑐𝑎𝑛𝑐𝑒 = ln ( ) (54)
𝐶𝑜𝑛𝑠 𝐶𝐷 𝑊𝑓
𝑃𝑀𝐶
𝐶𝑜𝑛𝑠
es el consumo específico de combustible el cual resulta de relacionar el peso de
𝑃𝑀𝐶

combustible que consume el motor/tiempo/la potencia que entrega el motor. Se utiliza la

49
PMC (potencia máxima continua) la cual corresponde a la mejor eficiencia de
funcionamiento del motor.

Donde el peso final se obtiene de:

𝑊𝑓 = 𝑊𝑖𝑛𝑖 − 𝑊𝑐𝑢 (55)


Y:

𝑊𝑐𝑢 = 𝑊𝑓𝑎 − 𝑊𝑓𝑟 (56)


La cantidad de combustible de reserva está regulado por instancias de autoridad
aeronáuticas como lo la FAA, para más información se puede visitar el enlace que viene
en la bibliografía de este trabajo [10].

La relación de los coeficientes de sustentación y arrastre representan la fineza


aerodinámica de un avión:

𝐶𝐿
𝛽= (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)
𝐶𝑜𝑛𝑠 √𝑊𝑖 √𝑊𝑓
𝑃𝑀𝐶

Donde 𝐶𝑆 es la cualidad sustentadora del avión:


3
𝐶𝐿 2
𝐶𝑆 = (59)
𝐶𝐷
La interfaz del alcance y autonomía tiene la siguiente vista:

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.

Al terminar el llenado de dichos datos, el usuario debe de darle clic en “CALCULAR” y


se mostrará los resultados del alcance y la autonomía, como se puede ver en la Figura
36.

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.

Con esto, se pretende incentivar el desarrollo de diferentes caminos para realizar


cálculos de cualquier índole, haciéndolos más didácticos con el uso de la tecnología, que
en este caso fue el uso de Matlab, el cual tiene una infinidad de aplicaciones para los
cuales uno puede sacar provecho.

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)

% Delete UIFigure when app is deleted


delete(app.UIFigure)
end
end
end

Anexo F. Código para obtener el parámetro de similitud J contra la eficiencia de


la hélice.
classdef J_contra_eficiencia_de_la_helice_con_grabit < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
ParametrodesimilitudJcontraeficienciadelahliceLabel matlab.ui.control.Label
ObtenerlosdatosdelagrficadelrendimientodelahliceLabel matlab.ui.control.Label
ComenzarButton matlab.ui.control.Button
Label matlab.ui.control.Label
SiguientepasoButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: ComenzarButton
function ComenzarButtonPushed(app, event)
grabit
end
% Button pushed function: SiguientepasoButton
function SiguientepasoButtonPushed(app, event)
open(potencia_disponible_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.Color = [1 1 1];
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create Image
70
app.Image = uiimage(app.UIFigure);
app.Image.Position = [1 -8 640 453];
app.Image.ImageSource = 'propeller_featured.png';
% Create ParametrodesimilitudJcontraeficienciadelahliceLabel
app.ParametrodesimilitudJcontraeficienciadelahliceLabel =
uilabel(app.UIFigure);
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.BackgroundColor =
[0.651 0.651 0.651];
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.HorizontalAlignment =
'center';
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.FontSize = 22;
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.FontWeight = 'bold';
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.FontColor = [1 1 1];
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.Position = [1 420 640
61];
app.ParametrodesimilitudJcontraeficienciadelahliceLabel.Text = 'Parámetro de
similitud J contra eficiencia de la hélice';
% Create ObtenerlosdatosdelagrficadelrendimientodelahliceLabel
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel =
uilabel(app.UIFigure);
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.BackgroundColor =
[0.651 0.651 0.651];
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.FontSize = 16;
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.FontWeight = 'bold';
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.FontColor = [1 1 1];
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.Position = [42 352
476 43];
app.ObtenerlosdatosdelagrficadelrendimientodelahliceLabel.Text = 'Obtener los
datos de la gráfica del rendimiento de la hélice ';
% Create ComenzarButton
app.ComenzarButton = uibutton(app.UIFigure, 'push');
app.ComenzarButton.ButtonPushedFcn = createCallbackFcn(app,
@ComenzarButtonPushed, true);
app.ComenzarButton.BackgroundColor = [0 0 0];
app.ComenzarButton.FontSize = 18;
app.ComenzarButton.FontColor = [1 1 1];
app.ComenzarButton.Position = [189 128 182 62];
app.ComenzarButton.Text = 'Comenzar';
% Create Label
app.Label = uilabel(app.UIFigure);
app.Label.BackgroundColor = [0.651 0.651 0.651];
app.Label.FontSize = 14;
app.Label.FontColor = [1 1 1];
app.Label.Position = [42 277 476 22];
app.Label.Text = 'Para ver un tutorial acerca de como usar grabit da click en el
siguiente link';

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

Anexo G. Código para calcular la potencia disponible


classdef potencia_disponible_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
POTENCIADISPONIBLELabel matlab.ui.control.Label
IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsxLabel
matlab.ui.control.Label
polarr matlab.ui.control.EditField
Image matlab.ui.control.Image
IngresaelnombredelarchivodelapolardelaaeronaveejpolarxlsLabel_2
matlab.ui.control.Label
Jnn matlab.ui.control.EditField
polartt matlab.ui.control.Table

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

Anexo I. Código para calcular las distancias de despegue


classdef Distancia_de_despegue_ap < matlab.apps.AppBase
% Properties that correspond to app components

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

Anexo J. Código para obtener las hodógrafas de ascenso.


classdef hodografas_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
HODOGRAFASDEASCENSOLabel matlab.ui.control.Label
Image matlab.ui.control.Image
OBTENERHODOGRAFASDEASCENSOButton matlab.ui.control.Button
SiguientepasoButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: OBTENERHODOGRAFASDEASCENSOButton
function OBTENERHODOGRAFASDEASCENSOButtonPushed(app, event)
Pmfc=load('potencia_requerida_vs_disponible.mat')
Vel=Pmfc.Vel;
Pr=Pmfc.Pr;
w=Pmfc.w;
Pddf=load('potencia_disponible_ap.mat')
PDn=Pddf.PDn;
hu=Pddf.hu;
Exp=PDn-Pr %Excedente de potencia
Va=Exp*(745.7/(w*9.81))
[i,j]=size(Va)
for tt=1:i
for ty=1:j
if Va(1,ty) > 0 & Va(tt,ty) > 0
Van(tt,ty)=Va(tt,ty)
Velnn(tt,ty)=Vel(tt,ty)
elseif Va(1,ty) < 0 & Va(tt,ty) > 0 & Va(tt+1,ty) > 0
Van(tt,ty)=Va(tt,ty)
Velnn(tt,ty)=Vel(tt,ty)
elseif Va(1,ty) < 0 & Va(tt,ty) > 0 & Va(tt+1,ty) < 0
Van(tt,ty)=Va(tt-1,ty)
Velnn(tt,ty)=Vel(tt-1,ty)
elseif Va(tt,ty) < 0 & Va (i/2,ty) < 0
Van(tt,ty)=0
Velnn(tt,ty)=0
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

Anexo K. Código para obtener los techos.


classdef techos_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image_2 matlab.ui.control.Image
TECHOSLabel matlab.ui.control.Label
Table matlab.ui.control.Table
TechoabsolutomLabel matlab.ui.control.Label
TA matlab.ui.control.EditField
TechodeserviciomEditFieldLabel matlab.ui.control.Label
TS matlab.ui.control.EditField

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

Anexo L. Código para obtener las hodógrafas de descenso.


classdef hodografas_descenso_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
HODOGRAFASDEDESCENSOLabel matlab.ui.control.Label
ObtenerHodografasButton matlab.ui.control.Button
SiguientepasoButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: ObtenerHodografasButton
function ObtenerHodografasButtonPushed(app, event)
Datos=load('potencia_disponible_ap')
cl=Datos.cl;
cd=Datos.cd;
w=Datos.w;
S=Datos.S;

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

Anexo M. Código para calcular las distancias de aterrizaje.


classdef aterrizaje_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
ATERRIZAJELabel matlab.ui.control.Label
Image matlab.ui.control.Image

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

Anexo N. Código para calcular el viraje.


classdef Viraje_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
VIRAJELabel matlab.ui.control.Label
VelocidaddelavinmsEditFieldLabel matlab.ui.control.Label
va matlab.ui.control.NumericEditField
ngulodeperalteEditFieldLabel matlab.ui.control.Label
ap matlab.ui.control.NumericEditField
VelocidadTangencialmsLabel matlab.ui.control.Label
VT matlab.ui.control.NumericEditField
RadiodevirajemLabel matlab.ui.control.Label
RV matlab.ui.control.NumericEditField
CALCULARButton matlab.ui.control.Button
SiguienteButton matlab.ui.control.Button
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: CALCULARButton
function CALCULARButtonPushed(app, event)
Psi=app.ap.Value; %angulo de peralte [°]
Ve=app.va.Value; %velocidad a la que va el avión [m/s]
g=9.81; %gravedad
%Velocidad tangencial
Vt=Ve/sqrt(cos(Psi*pi/180))
%Radio
R=(Ve*Ve)/(g*tan(Psi*pi/180))
app.VT.Value=Vt;
app.RV.Value=R;
end
% Button pushed function: SiguienteButton
function SiguienteButtonPushed(app, event)
open(alcance_autonomia_ap)

101
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 638 359];
app.UIFigure.Name = 'MATLAB App';
% Create Image
app.Image = uiimage(app.UIFigure);
app.Image.Position = [-4 1 643 360];
app.Image.ImageSource = 'viraje.jpg';
% Create VIRAJELabel
app.VIRAJELabel = uilabel(app.UIFigure);
app.VIRAJELabel.BackgroundColor = [1 1 1];
app.VIRAJELabel.HorizontalAlignment = 'center';
app.VIRAJELabel.FontSize = 22;
app.VIRAJELabel.FontColor = [0 0 1];
app.VIRAJELabel.Position = [-4 331 643 30];
app.VIRAJELabel.Text = 'VIRAJE';
% Create VelocidaddelavinmsEditFieldLabel
app.VelocidaddelavinmsEditFieldLabel = uilabel(app.UIFigure);
app.VelocidaddelavinmsEditFieldLabel.FontColor = [1 1 1];
app.VelocidaddelavinmsEditFieldLabel.Position = [32 287 135 22];
app.VelocidaddelavinmsEditFieldLabel.Text = 'Velocidad del avión m/s]';
% Create va
app.va = uieditfield(app.UIFigure, 'numeric');
app.va.Position = [182 287 100 22];
% Create ngulodeperalteEditFieldLabel
app.ngulodeperalteEditFieldLabel = uilabel(app.UIFigure);
app.ngulodeperalteEditFieldLabel.FontColor = [1 1 1];
app.ngulodeperalteEditFieldLabel.Position = [32 254 139 22];
app.ngulodeperalteEditFieldLabel.Text = 'Ángulo de peralte [ ° ]';
% Create ap
app.ap = uieditfield(app.UIFigure, 'numeric');
app.ap.Position = [182 254 100 22];
% Create VelocidadTangencialmsLabel
app.VelocidadTangencialmsLabel = uilabel(app.UIFigure);
app.VelocidadTangencialmsLabel.HorizontalAlignment = 'right';
app.VelocidadTangencialmsLabel.Position = [16 76 92 28];
app.VelocidadTangencialmsLabel.Text = {'Velocidad '; 'tangencial [m/s]'};
% Create VT
app.VT = uieditfield(app.UIFigure, 'numeric');
102
app.VT.Editable = 'off';
app.VT.HorizontalAlignment = 'center';
app.VT.Position = [123 82 100 22];
% Create RadiodevirajemLabel
app.RadiodevirajemLabel = uilabel(app.UIFigure);
app.RadiodevirajemLabel.HorizontalAlignment = 'right';
app.RadiodevirajemLabel.Position = [32 24 64 28];
app.RadiodevirajemLabel.Text = {'Radio de'; ' viraje [ m ]'};
% Create RV
app.RV = uieditfield(app.UIFigure, 'numeric');
app.RV.Editable = 'off';
app.RV.HorizontalAlignment = 'center';
app.RV.Position = [123 30 100 22];
% Create CALCULARButton
app.CALCULARButton = uibutton(app.UIFigure, 'push');
app.CALCULARButton.ButtonPushedFcn = createCallbackFcn(app,
@CALCULARButtonPushed, true);
app.CALCULARButton.BackgroundColor = [0 1 1];
app.CALCULARButton.Position = [56 170 139 41];
app.CALCULARButton.Text = 'CALCULAR';
% Create SiguienteButton
app.SiguienteButton = uibutton(app.UIFigure, 'push');
app.SiguienteButton.ButtonPushedFcn = createCallbackFcn(app,
@SiguienteButtonPushed, true);
app.SiguienteButton.Position = [501 30 100 22];
app.SiguienteButton.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 = Viraje_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)

103
end
end
end

Anexo Ñ. Código para calcular el alcance y la autonomía del avión.


classdef alcance_autonomia_ap < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Image matlab.ui.control.Image
ALCANCEYAUTONOMALabel matlab.ui.control.Label
consumodecombustiblekghEditFieldLabel matlab.ui.control.Label
cdc matlab.ui.control.NumericEditField
PesodelcombustibleabordokgLabel matlab.ui.control.Label
pdc matlab.ui.control.NumericEditField
AlcancekmLabel matlab.ui.control.Label
ALC matlab.ui.control.NumericEditField
AutonomahorasEditFieldLabel matlab.ui.control.Label
AUT matlab.ui.control.NumericEditField
CalcularButton matlab.ui.control.Button
velocidadcrueromsLabel_2 matlab.ui.control.Label
vc matlab.ui.control.NumericEditField
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: CalcularButton
function CalcularButtonPushed(app, event)
d1=load('potencia_disponible_ap.mat')
Velms=d1.Velms;
S=d1.S;
w=d1.w;
hu=d1.hu;
hu=hu*3.281;
pmc=d1.pmc;
rpm=d1.rpm;
X=d1.X;
Y=d1.Y;
d=d1.d;
alt=d1.alt;
d2=load('aterrizaje_ap.mat')
AR=d2.AR;
e=d2.e;
Swet=d2.Swet;
Cfe=d2.Cfe;
d3=load("Distancia_de_despegue_ap.mat")

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-

Configured-Vehicle Design. Recuperado 4 de febrero de 2020, de

https://pdfs.semanticscholar.org/ca60/6ac3e1e8f9561f3be5593758169731ec827

1.pdf, 1996.

[3] Dommasch. Airplane aerodynamics, Ed. Pitman Publications, USA, 1986.

[4] MATLAB - El lenguaje del cálculo técnico. Recuperado de

https://la.mathworks.com/products/matlab.html, 1984.

[5] GUI de MATLAB. (1984). Recuperado de

https://la.mathworks.com/discovery/matlab-gui.html

[6] Barnes W. Mc Cormick, Aerodynamics, aeronautics and flight mechanics, Ed. John

Wiley & Sons, USA, 1986.

[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:

American Institude of Aeronautics & Astronautics, 1992.

109

También podría gustarte