ALGORITMOS COMPUTACIONALES PARA ANALIZAR CIRCUITOS
ELÉCTRICOS DE ORDEN SUPERIOR EN EL ESTADO
TRANSITORIO: UN ENFOQUE TOPOLÓGICO USANDO CÁLCULO
SIMBÓLICO
Brandon Santiago Ospina Rendón Proyecto de grado presentado como requisito para aspirar al título de Ingeniero Electricista Director Diego González Ocampo Codirector Wilson González Vanegas Grupo de Investigación en Campos Electromagnéticos y Fenómenos Energéticos -
CAFE
PROGRAMA DE INGENIERÍA ELÉCTRICA
UNIVERSIDAD TECNOLÓGICA DE PEREIRA
PEREIRA
2026
Nota de Aceptación Firma del Presidente del jurado Firma del jurado 1 - Evaluador Firma del jurado 2 - Evaluador Firma del jurado 3 - Director Pereira, 13 de enero de 2026
1.
Dedicatoria Dedicado a mis padres, quienes siempre han sido un apoyo incondicional en mi vida.
2.
Agradecimientos Agradezco a mi codirector de tesis, el doctor Wilson González Vanegas, por su férrea voluntad para sacar adelante el proyecto HACEOS y a su paciencia a través de estos años. A mi director de tesis, el doctor Diego González Ocampo por haber confiado en mí desde el primer minuto para la realización de este proyecto además de ser un faro en los momentos más oscuros y difíciles de mi carrera.
Asímismo, agradezco a todos aquellos quienes estuvieron cuando más los necesité.
CONTENIDO
pág.
1. Dedicatoria
2. Agradecimientos
3. INTRODUCCIÓN
11
3.1. DEFINICIÓN DEL PROBLEMA . . . . . . . . . . . . . . . . . . . . .
11
3.2. JUSTIFICACIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.3. OBJETIVOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.3.1.
Objetivo General . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.3.2.
Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . .
13
4. MARCO TEÓRICO
15
4.1. Topología
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4.1.1.
Nodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4.1.2.
Enlace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
4.1.3.
Árbol
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
4.2. Programación Orientada a Objetos . . . . . . . . . . . . . . . . . . . .
17
4.2.1.
Encapsulación . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.2.2.
Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.2.3.
Polimorfismo
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.4.
Abstracción . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.2.5.
Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.2.6.
Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.3. Circuito Eléctrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.3.1.
Voltaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.3.2.
Corriente
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.3.3.
Resistencia
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.3.4.
Capacitancia
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.3.5.
Inductancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.3.6.
Estado Transitorio
. . . . . . . . . . . . . . . . . . . . . . . . .
20
4.3.7.
Estado Estable
. . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.4. Conjunto de Ecuaciones Linealmente Independientes
. . . . . . . . . .
21
4.5. Método de Corrientes de Enlace . . . . . . . . . . . . . . . . . . . . . .
21
4.6. Método Voltajes de Rama . . . . . . . . . . . . . . . . . . . . . . . . .
22
4.7. Ecuación Diferencial Ordinaria . . . . . . . . . . . . . . . . . . . . . . .
22
4.8. Cálculo Simbólico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
5. METODOLOGÍA
25
5.1. Descripción del circuito de estudio . . . . . . . . . . . . . . . . . . . . .
25
5.2. Enfoque topológico aplicado . . . . . . . . . . . . . . . . . . . . . . . .
26
5.3. Formulación de las ecuaciones diferenciales . . . . . . . . . . . . . . . .
28
5.4. Implementación del cálculo simbólico . . . . . . . . . . . . . . . . . . .
6. IMPLEMENTACIÓN Y RESULTADOS
51
6.1. Algoritmo para el método de Voltajes de Rama
. . . . . . . . . . . . .
52
6.2. Obtención de las tres ecuaciones diferenciales . . . . . . . . . . . . . . .
54
6.3. Resultados MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
6.4. Solución simbólica de la EDO . . . . . . . . . . . . . . . . . . . . . . .
57
6.5. Gráficas de las respuestas transitorias . . . . . . . . . . . . . . . . . . .
61
7.
DISCUSIÓN
63
7.1. Interpretación de los resultados
. . . . . . . . . . . . . . . . . . . . . .
63
7.2. Ventajas y limitaciones del método propuesto
. . . . . . . . . . . . . .
64
7.3. Comparación con otros enfoques o herramientas . . . . . . . . . . . . .
64
7.4. Relevancia para la enseñanza de los circuitos eléctricos
. . . . . . . . .
68
8. CONCLUSIONES Y RECOMENDACIONES
69
8.1. Logros del trabajo
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
8.2. Contribuciones
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
8.3. Recomendaciones para futuras extensiones . . . . . . . . . . . . . . . .
70
Referencias
71
9. ANEXOS
73
9.1. Método de Cramer . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LISTA DE FIGURAS
1.
Diagrama del circuito empleado en el caso de estudio . . . . . . . . . .
25
3.
Respuesta completa para el voltaje de rama v1 correspondiente a la resistencia R2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
4.
Respuesta completa para el voltaje de rama v10 correspondiente a la resistencia R1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
5.
Respuesta completa para el voltaje de rama v6 correspondiente a la resistencia R3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
6.
Respuestas transitorias para las tensiones de rama del circuito de prueba caso10n11p5i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LISTA DE TABLAS
1.
Solución Entregada por la Herramienta . . . . . . . . . . . . . . . . . .
3.
INTRODUCCIÓN
En el estudio de los circuitos eléctricos de orden superior, el análisis del estado transitorio representa un desafío significativo debido a la complejidad matemática asociada a la resolución de ecuaciones diferenciales y la aplicación de métodos topológicos. Actualmente, los estudiantes de Ingeniería Eléctrica enfrentan dificultades para comprender estos conceptos, lo que ha generado un represamiento académico en cursos como Circuitos Eléctricos I en la Universidad Tecnológica de Pereira. Este trabajo de grado, titulado: Algoritmos computacionales para analizar circuitos eléctricos de orden superior en el estado transitorio: un enfoque topológico usando cálculo simbólico, tiene como propósito contribuir al desarrollo de la herramienta HACEOS (Herramienta de Análisis de Circuitos Eléctricos de Orden Superior). Esta herramienta busca facilitar el aprendizaje mediante la implementación de algoritmos que permitan el análisis simbólico de circuitos en el dominio del tiempo, utilizando programación orientada a objetos y métodos basados en teoría de grafos. El enfoque del trabajo se centra en dos aspectos clave: Modelado matemático del estado transitorio mediante variables simbólicas y análisis topológico de circuitos después de la conmutación de interruptores. Con esto, se espera proporcionar una solución innovadora que mejore la comprensión de los estudiantes y optimice el proceso de enseñanza en el área de los circuitos eléctricos.
3.1.
DEFINICIÓN DEL PROBLEMA
El análisis de circuitos eléctricos de orden superior en el estado transitorio requiere resolver sistemas de ecuaciones diferenciales de orden superior, lo que representa un obstáculo para los estudiantes de Ingeniería Eléctrica. En la Universidad Tecnológica de Pereira, este desafío se agudiza debido a:
1. El alto nivel de abstracción matemática: los estudiantes deben dominar técnicas
avanzadas para la solución de ecuaciones diferenciales y teoría de grafos para modelar circuitos con inductores, capacitores y acoplamientos magnéticos.
2. Ausencia de herramientas didácticas especializadas: la mayoría de las plataformas
educativas se centran en estados estacionarios o circuitos básicos, dejando un vacío en el análisis transitorio de sistemas dinámicos complejos.
3.2.
JUSTIFICACIÓN
La importancia de este proyecto radica en su contribución al proyecto HACEOS, una iniciativa del grupo de investigación CAFE (Campos Electromagnéticos y Fenómenos Energéticos) de la UTP, que busca crear una herramienta educativa para el análisis avanzado de circuitos eléctricos, que tiene como objetivo los siguientes: Facilitar el aprendizaje: al proporcionar respuestas simbólicas, los estudiantes pueden contrastar sus soluciones manuales y entender mejor los conceptos teóricos. Complementar la enseñanza: los docentes pueden utilizar esta herramienta para explicar de manera más clara los fenómenos transitorios en circuitos dinámicos. Usar cálculo simbólico: a diferencia de las herramientas convencionales (SPICE, SIMULINK), este enfoque permite obtener soluciones analíticas en el dominio del tiempo.
Integrar elementos de POO y topología: la programación orientada a objetos (POO) facilita el modelado modular de circuitos, mientras que la teoría de grafos permite la generación de ecuaciones linealmente independientes.
3.3.
OBJETIVOS
3.3.1.
Objetivo General Desarrollar algoritmos computacionales basados en programación orientada a objetos y cálculo simbólico para analizar circuitos eléctricos de orden superior en el estado transitorio, considerando la topología de red y el efecto de interruptores.
3.3.2.
Objetivos Específicos Comprender los principios de la programación orientada a objetos (POO) y su aplicabilidad en la simulación de circuitos eléctricos. Diseñar un modelo matemático que permita formular ecuaciones integro-diferenciales simbólicas linealmente independientes, basado en teoría de grafos. Implementar algoritmos en MATLAB para la construcción automática de matrices de incidencia y la resolución simbólica de ecuaciones en el dominio del tiempo.
(página sin texto)
4.
MARCO TEÓRICO
Este capítulo establece los fundamentos teóricos indispensables para el análisis de circuitos eléctricos de orden superior en régimen transitorio, que constituye el núcleo de la presente investigación. Se revisan los principios que describen el comportamiento dinámico de sistemas con múltiples elementos almacenadores de energía, así como las metodologías formales para su modelado matemático. Adicionalmente, se explican los conceptos de topología de redes, independencia lineal de ecuaciones y cálculo simbólico, los cuales, combinados con técnicas de programación orientada a objetos, proporcionan la base para el desarrollo de los algoritmos computacionales implementados en la herramienta HACEOS.
4.1.
Topología Es una rama de las matemáticas que estudia las propiedades de conexión de una red eléctrica que permanecen invariables ante deformaciones como el estiramiento o la torsión de sus ramas, sin alterar la interconexión de los elementos. Se enfoca exclusivamente en la estructura geométrica del circuito: cómo los nodos (puntos de unión) están interconectados por ramas (elementos individuales), definiendo conceptos fundamentales como mallas, lazos y árboles, lo que permite abstraer el comportamiento físico específico de los componentes para analizar la estructura de la red de manera sistemática y general.
4.1.1.
Nodo En un circuito eléctrico, un nodo es un punto de conexión entre dos o más elementos de circuito (como resistencias, fuentes o capacitores) . En un esquemático, se representa comúnmente con un punto sólido (•). Todo conductor ideal (con resistencia eléctrica
considerada nula) entre elementos forma parte de un mismo nodo, lo que implica que todos sus puntos están al mismo potencial eléctrico . Esta propiedad es crucial para la aplicación de la Ley de Corrientes de Kirchhoff (LCK)
4.1.2.
Enlace En el análisis de circuitos, un enlace (comúnmente llamado rama o branch) es un elemento de circuito de dos terminales que conecta dos nodos. Puede ser un componente simple (como un resistor, un capacitor o una fuente de voltaje) o una combinación de varios componentes conectados en serie . En la teoría de grafos, un enlace corresponde a una arista del grafo . El conjunto de todos los enlaces define cómo está interconectada la red.
4.1.3.
Árbol Es un subconjunto de enlaces de un circuito conectado que une todos sus nodos sin formar ningún lazo cerrado . Es un concepto de la teoría de grafos esencial para formulaciones sistemáticas del análisis de circuitos, como el método de análisis por variables de enlace. Las propiedades clave de un árbol son:
Conecta todos los nodos del circuito.
Contiene exactamente (n-1) enlaces, donde n es el número de nodos. No contiene lazos o mallas.
Los enlaces que no forman parte del árbol elegido se denominan enlaces de eslabón (links o chords). La adición de cualquier enlace de eslabón al árbol crea un lazo único, que es fundamental para aplicar la Ley de Voltajes de Kirchhoff (LVK) de manera sistemática.
La elección de un árbol no es única para un circuito dado, pero proporciona un marco ordenado para escribir ecuaciones independientes.
4.2.
Programación Orientada a Objetos La Programación Orientada a Objetos (POO) es un paradigma de programación basado en el concepto de objetos, que contienen datos en forma de atributos y código en forma de métodos. Se fundamenta en cuatro pilares principales: encapsulación, herencia, polimorfismo y abstracción.
4.2.1.
Encapsulación La encapsulación es el mecanismo que restringe el acceso directo a los componentes de un objeto, permitiendo que los datos y métodos internos estén ocultos y solo puedan modificarse a través de una interfaz pública bien definida. Esto protege la integridad del estado del objeto.
4.2.2.
Herencia La herencia es el mecanismo mediante el cual una clase (subclase) adquiere las propiedades y comportamientos de otra clase (superclase), permitiendo la reutilización de código y estableciendo relaciones jerárquicas entre clases.
4.2.3.
Polimorfismo El polimorfismo permite que objetos de diferentes clases respondan de manera específica al mismo mensaje o llamada a método. Esto se logra mediante la sobrecarga de métodos (mismo nombre, diferentes parámetros) o la sobrescritura (redefinición en subclases).
4.2.4.
Abstracción La abstracción es el proceso de identificar características esenciales de un objeto, ignorando los detalles irrelevantes para el contexto actual. En POO, se implementa mediante clases abstractas e interfaces que definen comportamientos sin proporcionar implementación completa.
4.2.5.
Clases Una clase es una plantilla o molde que define las propiedades (atributos) y comportamientos (métodos) comunes a un conjunto de objetos. Representa un concepto abstracto a partir del cual se crean instancias concretas (objetos).
4.2.6.
Métodos Los métodos son funciones o procedimientos asociados a una clase u objeto que definen su comportamiento. Operan sobre los datos del objeto (atributos) y definen las operaciones que pueden realizarse sobre él.
4.3.
Circuito Eléctrico Un circuito eléctrico de orden superior es aquel cuyo comportamiento dinámico se describe mediante una ecuación diferencial de segundo orden o superior, una característica que surge de la interacción de dos o más elementos almacenadores de energía distintos, típicamente inductores y condensadores. A diferencia de los circuitos de primer orden con un solo elemento almacenador, estos sistemas pueden exhibir comportamientos más complejos como oscilaciones y resonancia, donde la energía fluctúa entre los campos magnético de las bobinas y eléctrico de los capacitores.
4.3.1.
Voltaje El voltaje (o tensión) entre dos puntos en un circuito se define como la energía necesaria para mover una unidad de carga de un punto a otro. Se mide en voltios (V), representa la causa del movimiento de cargas y se interpreta como la diferencia de potencial eléctrico.
4.3.2.
Corriente la corriente eléctrica es la tasa de flujo de carga eléctrica a través de una sección transversal de un material conductor. Se define matemáticamente como la derivada de la carga respecto al tiempo y su unidad es el amperio (A). La corriente convencional se considera como el flujo de cargas positivas, aunque en los metales el flujo real corresponde a electrones (cargas negativas) moviéndose en sentido contrario.
4.3.3.
Resistencia La resistencia, es la oposición que presenta un material al flujo de corriente eléctrica. Su unidad es el ohmio (Ω). Para muchos materiales (llamados óhmicos), la resistencia es una constante que relaciona linealmente el voltaje aplicado y la corriente resultante, mediante la ecuación V=IR. Este valor depende de las propiedades físicas del material (resistividad), su longitud y su área transversal.
4.3.4.
Capacitancia un capacitor se define como un elemento de circuito pasivo que almacena energía en su campo eléctrico cuando hay una diferencia de potencial entre sus placas. La capacitancia (C) es la medida de la capacidad de un capacitor para almacenar carga por unidad de voltaje, dada por, C = q/v, donde q es la carga almacenada y V es el voltaje aplicado.
Su unidad es el faradio (F). Un capacitor ideal no disipa energía, sino que la almacena y la libera, y su corriente depende de la tasa de cambio del voltaje
4.3.5.
Inductancia Un inductor es un elemento de circuito pasivo que almacena energía en su campo magnético cuando circula corriente por él. La inductancia (L) es la medida de la capacidad de un inductor para oponerse a cambios en la corriente que lo atraviesa, debido a la fuerza electromotriz autoinducida. Su unidad es el henry (H). Un inductor ideal tampoco disipa energía, y el voltaje en sus terminales es proporcional a la tasa de cambio de la corriente.
4.3.6.
Estado Transitorio El estado transitorio es el régimen de comportamiento temporal que experimenta un circuito eléctrico inmediatamente después de una perturbación, como un cambio abrupto en la fuente de alimentación (al encenderla o apagarla) o una alteración en sus conexiones. Durante este período, que suele ser breve, las tensiones y corrientes en los elementos que almacenan energía (inductores y condensadores) evolucionan de forma dinámica desde sus condiciones iniciales hasta alcanzar un nuevo equilibrio, caracterizándose por una respuesta natural que a menudo decae exponencialmente o presenta oscilaciones amortiguadas, hasta que los efectos de este cambio inicial se disipan por completo y el circuito se estabiliza.
4.3.7.
Estado Estable El estado estable es la condición de operación permanente en la que se encuentra un circuito eléctrico una vez que ha transcurrido un tiempo suficiente luego de cualquier
perturbación y el régimen transitorio ha desaparecido por completo. En este estado, si el circuito es lineal y está alimentado por fuentes sinusoidales, la respuesta forzada domina completamente el comportamiento, manifestándose como tensiones y corrientes puramente sinusoidales de la misma frecuencia que la fuente, conocida como respuesta en estado estable sinusoidal; en sistemas con fuentes de corriente continua, el estado estable se alcanza cuando todas las corrientes y tensiones en el circuito se vuelven constantes, comportándose los capacitores como circuitos abiertos y los inductores como cortocircuitos en el análisis final.
4.4.
Conjunto de Ecuaciones Linealmente Independientes Un conjunto de ecuaciones es linealmente independiente (LI) cuando ninguna de las ecuaciones que lo componen puede ser expresada como una combinación lineal de las otras; es decir, cada ecuación aporta información nueva y esencial sobre las variables del sistema que no está contenida en las demás. En el análisis de circuitos, esta propiedad es crucial para evitar sistemas sobredeterminados o subdeterminados, garantizando que el conjunto de ecuaciones derivado de las Leyes de Kirchhoff sea el mínimo necesario y suficiente para encontrar una solución única para todas las incógnitas, como las corrientes o tensiones, sin redundancias que no aporten nuevo conocimiento.
4.5.
Método de Corrientes de Enlace El método se enuncia de la siguiente manera. Es posible encontrar cualquier voltaje o corriente en un circuito si se conocen todas las corrientes en los enlaces. Mediante la aplicación de la segunda ley de Kirchhoff a todos los anillos fundamentales se obtiene el conjunto de ecuaciones LI, posteriormente se despejan las corrientes de rama en función de las corrientes de enlace mediante el uso de ecuaciones auxiliares, para finalmente
obtener un sistema lineal de n x n donde sólo aparezcan corientes de enlace.
4.6.
Método Voltajes de Rama El método se enuncia de la siguiente manera. Es posible encontrar cualquier voltaje o corriente en un circuito si se conocen todos los voltajes en las ramas. Mediante la primera ley de Kirchhoff aplicada a todos los cortes fundamentales se obtiene un conjunto LI, posteriormente se depejan los voltajes de enlace en función de los voltajes de rama mediante ecuaciones auxiliares, para finalmente obtener un sistema lineal de n x n donde sólo aparezcan voltajes de rama.
4.7.
Ecuación Diferencial Ordinaria Una ecuación diferencial ordinaria (EDO) es una ecuación matemática que relaciona una función desconocida con una o más de sus derivadas, describiendo cómo la tasa de cambio de una cantidad (como la velocidad de variación de un voltaje o una corriente) depende de la propia cantidad y, potencialmente, del tiempo. En ingeniería eléctrica, es la herramienta fundamental para modelar el comportamiento dinámico de los circuitos que contienen elementos almacenadores de energía, como capacitores y inductores, ya que las leyes físicas que gobiernan estos elementos i(t) = CdV(t)/dt para un capacitor y v(t) = Ldi(t)/dt para un inductor. Estas relaciones establecen naturalmente ecuaciones diferenciales entre tensión y corriente.
4.8.
Cálculo Simbólico El cálculo simbólico, también conocido como Sistemas de Álgebra Computacional (CAS), es una disciplina que permite a los ordenadores manipular fórmulas matemáticas con
precisión analítica utilizando símbolos en lugar de aproximaciones numéricas, lo que lo convierte en una herramienta poderosa en ingeniería al facilitar la obtención de soluciones exactas, explorar parametrizaciones y comprender la estructura fundamental de los modelos, a diferencia de la computación numérica tradicional que trabaja con valores concretos, pues este opera con variables, constantes y expresiones matemáticas abstractas mediante un software especializado que implementa esta capacidad para realizar operaciones como derivación, integración, simplificación de expresiones y resolución de ecuaciones de forma analítica, preservando todas las variables y parámetros en su forma simbólica para proporcionar resultados generales y teóricos.
(página sin texto)
5.
METODOLOGÍA
5.1.
Descripción del circuito de estudio El circuito de análisis está compuesto por cinco interruptores, uno de dos vías y cuatro sencillos, tres resistencias, tres capacitancias, dos inductancias mutuamente acopladas y una inductancias sin acoplamiento, una fuente de voltaje DC y una fuente de corriente AC. Los parámetros de los elementos y la topología de conexión se muestran a continuación.
Figura 1. Diagrama del circuito empleado en el caso de estudio
5.2.
Enfoque topológico aplicado Para el análisis de este circuito se emplea el método topológico de voltajes de rama, el cual constituye una técnica sistemática basada en teoría de grafos que permite validar los algoritmos generados en la herramienta HACEOS. Este enfoque utiliza las matrices fundamentales de la topología del circuito - específicamente la Matriz de Cortes Fundamentales (MFC) y la Matriz de Anillos Fundamentales (MFA) - para formular completamente el conjunto de ecuaciones que describen el comportamiento dinámico del sistema.
(a) Grafo conectado con etiquetas (b) Árbol conectado (c) Grafo conectado y orientado con etiquetas La aplicación de este método inicia con la identificación del árbol y los enlaces del grafo del circuito, procediendo luego a establecer las relaciones entre voltajes de ra-
ma y voltajes de enlace mediante transformaciones algebraicas simbólicas. La implementación computacional genera automáticamente el Conjunto de Ecuaciones General Integro-Diferencial Linealmente Independiente (CEGIDLI), el cual se resuelve mediante técnicas de álgebra simbólica que incluyen factorización, sustitución de excitaciones y solución de sistemas matriciales. Esta metodología no solo garantiza la correcta formulación de las ecuaciones diferenciales ordinarias que gobiernan el circuito, sino que también valida la eficacia de los algoritmos desarrollados para el análisis de circuitos de orden superior, demostrando su capacidad para manejar configuraciones complejas con múltiples elementos almacenadores de energía y acoplamientos magnéticos.
5.3.
Formulación de las ecuaciones diferenciales La rutina principal de HACEOS realiza la extracción de información del circuito, posteriormente almacena la información de cada puerta como nodos de envio y recibo, naturaleza, tipo, parámetros, variables simbólicas de voltaje y corriente en dos objetos principales, uno de datos y otro matemático.
La función HACEOS implementa una metodología sistemática para el análisis simbólico de circuitos eléctricos de orden superior en el dominio del tiempo, iniciando con la validación de entradas donde verifica que el parámetro caso sea una estructura y carga configuraciones predeterminadas mediante hcs opciones si no se proporcionan opciones específicas. Posteriormente, construye un modelo de red base (hcs.modelo red()) y selecciona el modelo de datos apropiado según el estado de análisis (estacionario, transitorio, conmutación o combinaciones), utilizando métodos especializados de extracción e inicialización para cada caso. A continuación, procesa la información del circuito mediante md.construir() para crear objetos de cada componente e importa condiciones iniciales con md.importar(), mientras genera estadísticas del caso. Si está habilitada la opción dibujar graficos, genera representaciones gráficas de la topología del circuito. En la fase de modelado matemático, inicializa variables simbólicas para tensiones y corrientes, calcula matrices de incidencia de anillos (mm.calcular MFAs) y cortes (mm.calcular MFCs), determina inductancias mutuamente acopladas (mm.calcular MIMAs) y resuelve el sistema mediante el método de voltajes de rama, culminando con la estructuración de resultados que integra los modelos de datos, red y matemático para su posterior análisis.
Esta clase modelo matematico constituye el núcleo computacional del sistema HA- CEOS para el análisis simbólico de circuitos eléctricos de orden superior, iniciando con un constructor que establece la estructura de datos organizada en clases y modelos
para diferentes estados de operación (DC, SIN, EXP, etc.) y métodos de solución (VR, CE, VN, CM). El método construir objetos se encarga de instanciar cada elemento del circuito a partir de las definiciones de clases preconfiguradas, creando los objetos matemáticos correspondientes a puertas y marcas de polaridad. Los métodos calcular MIMAs, calcular MFAs y calcular MFCs implementan los algoritmos fundamentales de teoría de grafos para determinar respectivamente la matriz de inductancias mutuamente acopladas, la matriz fundamental de anillos (árbol de expansión y enlaces) y la matriz fundamental de cortes, esenciales para formular las ecuaciones de malla y nodo. La función voltajes enlace fx rama establece las relaciones de transformación entre variables de enlace y rama mediante manipulación simbólica, mientras que voltajes rama ejecuta el proceso completo de solución al sustituir corrientes por sus primitivas, aplicar la matriz de cortes para obtener el sistema de ecuaciones integro-diferenciales (CEGIDLI), separar excitaciones mediante factorización simbólica, construir las matrices de coeficientes A y vector de excitaciones b, resolver el sistema algebraico resultante y finalmente expresar la solución como ecuaciones diferenciales ordinarias listas para su resolución numérica o analítica, completando así el flujo desde la descripción topológica del circuito hasta la obtención de su modelo matemático completo.
5.4.
Implementación del cálculo simbólico function obj = modelo_matematico() Esta función inicializa la estructura completa del modelo matemático definiendo propiedades organizadas jerárquicamente para clasificar elementos según su comportamiento en dominio estacionario, conmutación y transitorio. Específicamente, crea estructuras anidadas que categorizan elementos en DC, SIN (sinusoidal), EXP (exponencial), No- Fuente y Combinada, cada una conteniendo subestructuras para puertas y marcas de
polaridad. Paralelamente, configura cuatro métodos de solución posibles: VR (Voltaje de Rama), CE (Corrientes de Enlace), VN (Voltajes de Nodo) y CM (Corrientes de Malla), inicializando matrices para MIMA (Matriz de Inductancias Mutuamente Acopladas), MAF (Matriz de Anillos Fundamentales) y MCF (Matriz de Cortes Fundamentales). Las variables simbólicas para voltajes y corrientes se inicializan como arreglos vacíos listos para su posterior definición durante el análisis del circuito. construir_objetos(obj,md) Este método realiza la instanciación concreta de objetos matemáticos a partir de las definiciones abstractas del modelo de datos (md). Mediante un sistema de doble iteración sobre etiquetas de islas (DC, SIN, EXP, NoFuente, Combinada) y campos (puertas, marcas pol), accede a las clases almacenadas en obj.clases para crear instancias específicas que se almacenan en obj.elementos. Cada objeto creado hereda las propiedades matemáticas de su clase correspondiente y se vincula con los parámetros físicos extraídos del modelo de datos, estableciendo así el mapeo completo entre la descripción física del circuito y su representación matemática operable simbólicamente. calcular_MIMAs(obj, mm, md, estados) Calcula la matriz de inductancias mutuamente acopladas (MIMA) para circuitos que contienen pares de inductores magnéticamente acoplados. La función identifica primero las inductancias acopladas en el circuito cero menos, extrayendo sus identificadores, marcas de polaridad y coeficiente de inductancia mutua (M). Construye una matriz 2x2 donde los elementos diagonales contienen las autoinductancias (L1, L2) y los no diagonales la inductancia mutua. Mediante análisis de las conexiones y polaridades relativas usando matrices auxiliares M_aux y M_val, determina el signo correcto de los términos mutuos según la convención del punto, asignando finalmente la MIMA completa a
todos los tipos de islas en el modelo matemático.
1 function
calcular_MIMAs(obj ,mm ,md ,estados)
2
if estados == "estacionario"
3
circuito = md. circuito_cero_menos ;
4
num_marcas_pol = md.stats_caso.num_marcas;
5
if num_marcas_pol == 1
6
MIMA
= zeros (2,2);
7
id_L1 = md. circuito_cero_menos .marcas_pol (2);
8
id_L2 = md. circuito_cero_menos .marcas_pol (4);
9
IDs = [id_L1 ,id_L2 ];
10
n_mark_L1 = md. circuito_cero_menos .marcas_pol (3);
11
n_mark_L2 = md. circuito_cero_menos .marcas_pol (5);
12
M = md. circuito_cero_menos .marcas_pol (6);
13
L1 = md. circuito_cero_menos .puertas(md. circuito_cero_menos .puertas (:,1) == id_L1 ,5);
14
L2 = md. circuito_cero_menos .puertas(md. circuito_cero_menos .puertas (:,1) == id_L2 ,5);
15
16
MIMA (1,1) = L1;
17
MIMA (2,2) = L2;
18
MIMA (1,2) = M;
19
MIMA (2,1) = M;
20
21
M_aux = zeros (2,2);
22
M_aux (1,:) = md. circuito_cero_menos .puertas(md. circuito_cero_menos .puertas (:,1) == id_L1 ,[2 3]);
23
M_aux (2,:) = md. circuito_cero_menos .puertas(md. circuito_cero_menos .puertas (:,1) == id_L2 ,[2 3]);
24
25
M_val = zeros (2,2);
for i = 1:2
27
if M_aux (1,i) == n_mark_L1
28
M_val(1,i) = 1;
29
else
30
M_val(1,i) = 0;
31
end
32
end
33
for i = 1:2
34
if M_aux (2,i) == n_mark_L2
35
M_val(2,i) = 1;
36
else
37
M_val(2,i) = 0;
38
end
39
end
40
41
if sum(M_val (:,1)) < 2
42
MIMA (1,2) = (-1) * M;
43
MIMA (2,1) = (-1) * M;
44
end
45
etiquetas_islas = {’DC’,’SIN’,’EXP’,’NoFuente ’,’Combinada ’ };
46
for i = 1: numel( etiquetas_islas )
47
mm.modelos .( estados).( etiquetas_islas {i}).MIMA = MIMA;
48
end
49
50
else
51
% El codigo funciona solo con 2 inductancias mutuamente acopladas
52
error (" modelo_matematico : calcular_MIMAs: Existen mas de dos inductancias acopladas ")
53
end
calcular_MFCs(obj, mr, estados) Construye la Matriz Fundamental de Cortes (MFC) mediante un proceso iterativo que identifica cortes fundamentales en el grafo del circuito. Para cada rama del árbol (weight=1), elimina temporalmente ramas y enlaces, luego analiza las componentes conexas resultantes usando conncomp. Al reconectar cada enlace individualmente, detecta cuando se cierra un lazo y registra los identificadores de los elementos involucrados en el corte. Los signos en la matriz se determinan según la posición relativa de los nodos respecto a las islas separadas por el corte, almacenando las relaciones en una matriz de cortes que posteriormente se asigna a todas las islas del modelo.
1 function
calcular_MFCs(obj ,mr ,estados)
2
G = mr. graficos_orientados .depurados .( estados);
3
matriz_cortes = zeros(1,max(mr. graficos_orientados .depurados .( estados).Edges.ID));
4
etiquetas_islas = {’DC’,’SIN’,’EXP’,’NoFuente ’,’Combinada ’};
5
for i = 1: numel( etiquetas_islas )
6
obj.modelos .( estados).( etiquetas_islas {i}).MCF = matriz_cortes ;
7
end
8
nodos = cellfun(@(x) str2double(x(2: end)), G.Edges.EndNodes);
9
matriz_enlaces = [];
10
numnodos = numnodes(G);
11
vecUnos = ones(1, numnodos);
12
contador_cortes = 1;
13
weak_bins = conncomp(G," Type","weak ");
14
if vecUnos == weak_bins
15
lineas = table2struct(G.Edges);
16
% Deteccion de posicion de Ramas en la Tabla
17
for e = 1: size(nodos ,1)
%fprintf(’Ciclo %d\n’, e);
19
var = lineas(e);
20
if var.Weights == 1
21
pos = [pos ,e];
22
% Deteccion de posicion de Enlaces en la Tabla
23
for i = 1: size(nodos ,1)
24
var2 = lineas(i);
25
if var2.Weights == 2
26
pos2 = [pos2 ,i];
27
pos_tabla = [pos ,pos2 ];
28
% disp(pos_tabla);
29
end
30
end
31
MF = rmedge(G,pos_tabla);
32
% Ciclo para agregar enlaces de 1 en 1
33
for f = 1: numel(pos2)
34
% Se analizan Islas de la rama para tomar referencia
35
[islas ,~] = conncomp(MF ," OutputForm ","cell","Type ","weak ");
36
nombres = {’Isla1 ’,’Isla2 ’};
37
a = cell2struct(islas ,nombres ,2);
38
rama_tabla = table(G.Edges.EndNodes(pos (1) ,:),G. Edges.Weights(pos (1)),G.Edges.ID(pos (1)),G.Edges.Labels(pos (1)),G. Edges.NAT(pos (1)),G.Edges.VAL_P(pos (1)) ,...
39
’VariableNames ’,{’EndNodes ’ ’Weights ’ ’Labels ’ ’ID’
’NAT’ ’VAL_P ’ });
40
ramaEstruct = table2struct(rama_tabla);
41
if ismember(ramaEstruct.EndNodes (1),a.Isla1) == 1
42
islaEnvio = a.Isla1;
43
else
islaEnvio = a.Isla2;
45
end
46
enlace_agregar = table(G.Edges.EndNodes(pos2(f) ,:) ,G.Edges.Weights(pos2(f)),G.Edges.Labels(pos2(f)),G.Edges.ID(pos2(f )),G.Edges.NAT(pos2(f)),G.Edges.VAL_P(pos2(f)), ...
47
’VariableNames ’,{’EndNodes ’ ’Weights ’ ’Labels ’
’ID’ ’NAT’ ’VAL_P ’});
48
enlaceEstruct = table2struct(enlace_agregar );
49
P = addedge(MF , enlace_agregar);
50
51
% Verificacion de islas con la conexion del enlace
52
num_nodos = numnodes(G);
53
vector_nodos = ones(1, num_nodos);
54
weak_bins = conncomp(P," Type","weak ");
55
if vector_nodos == weak_bins
56
vector_rama = G.Edges.ID(pos);
57
nombre_variable = sprintf(’corte_ %d’, vector_rama);
58
matriz_enlaces = [G.Edges.ID(pos2(f)), matriz_enlaces ];
59
valor_variable = [vector_rama ,matriz_enlaces ];
60
datos .( nombre_variable ) = valor_variable;
61
fields = fieldnames(datos);
62
campo_actual = fields{ contador_cortes };
63
rys = datos .( campo_actual);
64
65
matriz_cortes(contador_cortes ,rys) = 1;
66
67
% Se analiza el sentido de cada enlace
68
if ismember(enlaceEstruct.EndNodes (1), islaEnvio) == 1
else
70
posMenos = [contador_cortes ,G.Edges.ID( pos2(f));posMenos ];
71
end
72
end
73
enlace_agregar = table ();
74
end
75
matriz_enlaces = [];
76
contador_cortes = contador_cortes + 1;
77
end
78
% Reset de variables antes del nuevo ciclo
79
pos2 = [];
80
pos = [];
81
pos_tabla = [];
82
end
83
84
% Ciclo por para agregar signos a elementos
85
for w = 1: size(posMenos ,1)
86
matriz_cortes(posMenos(w,1),posMenos(w,2)) = -1;
87
end
88
89
% Rellenar MCF de cada isla con la matriz completa
90
for i = 1: numel( etiquetas_islas )
91
obj.modelos .( estados).( etiquetas_islas {i}).MCF = matriz_cortes;
92
end
93
end
94 end
calcular_MFAs(obj, mr, estados) Genera la Matriz Fundamental de Anillos (MFA) aplicando algoritmos de teoría de grafos al grafo orientado depurado del circuito. El proceso inicia eliminando temporalmente los enlaces (ramas con weight=2) para obtener un árbol de expansión, luego reintroduce secuencialmente cada enlace identificando el anillo fundamental correspondiente mediante la función allcycles. Cada fila de la MFA representa un anillo, con entradas +1/-1 según la coincidencia o oposición entre la orientación del elemento y la dirección del anillo. La función maneja especialmente la asignación de signos negativos mediante el registro en posMenos cuando la dirección de la rama se opone al sentido del anillo fundamental.
voltajes_enlace_fx_rama(obj, mm, md, estados) Establece las relaciones algebraicas entre voltajes de enlace y voltajes de rama mediante operaciones simbólicas con la Matriz Fundamental de Anillos (MFA). Para cada isla, extrae la submatriz correspondiente y aplica las ecuaciones de malla derivadas de la MFA para expresar cada voltaje de enlace como combinación lineal de voltajes de rama. La función maneja casos con múltiples filas en la MFA mediante iteraciones anidadas, y finalmente depura las expresiones simbólicas usando children y coeffs para eliminar coeficientes numéricos diferentes de ±1, produciendo una tabla T que contiene las relaciones transformadas listas para su uso en la formulación del sistema de ecuaciones.
1 function T = voltajes_enlace_fx_rama (obj ,mm ,md ,estados)
2
etiquetas_islas = {’DC’,’SIN’,’EXP’,’NoFuente ’,’Combinada ’};
3
T = table ();
4
for i = 1: numel( etiquetas_islas )
5
puertas_md = md.elementos .( estados).( etiquetas_islas{i}). puertas;
6
puertas_mm = mm.elementos .( estados).( etiquetas_islas{i}).
puertas;
7
MAF = mm.modelos .( estados).( etiquetas_islas {i}).MAF; isla
8
ids = [];
9
for x = 1: numel(puertas_md)
10
ids = [ids , puertas_md{x}.id];
11
end
12
A = MAF(:,ids);
13
indices_filas = any(A, 2);
14
A = A(indices_filas , :);
15
if size(A,1) == 1
16
voltajes_rama = 0;
17
for x = 1: size(A,2)
18
if A(x) == 0
19
continue
20
end
21
if A(x) > 0
22
if puertas_md{x}. tipo == 1
23
voltajes_rama = -1 * puertas_mm{x}. varV;
24
else
25
voltaje_enlace = puertas_mm{x}. varV;
26
end
27
end
28
if A(x) < 0
29
if puertas_md{x}. tipo == 1
30
voltajes_rama = voltajes_rama + puertas_mm{x}. varV;
31
else
32
voltaje_enlace = puertas_mm{x}. varV;
33
voltajes_rama = puertas_mm{x}. varV + voltajes_rama;
34
end
end
36
end
37
fila_temp = table(voltaje_enlace ,voltajes_rama ,’ VariableNames ’,{’voltaje_enlace ’ ’voltajes_rama ’});
38
T = [T; fila_temp ];
39
voltajes_rama = 0;
40
else
41
for r = 1: size(A,1)
42
for s = 1: size(A,2)
43
if A(r,s) == 0
44
continue
45
end
46
if A(r,s) > 0
47
if puertas_md{s}. tipo == 1
48
voltajes_rama = voltajes_rama + (-1) * puertas_mm{s}. varV;
49
else
50
voltaje_enlace = puertas_mm{s}. varV;
51
end
52
end
53
if A(r,s) < 0
54
if puertas_md{s}. tipo == 1
55
voltajes_rama = voltajes_rama + puertas_mm {s}. varV;
56
else
57
voltaje_enlace = puertas_mm{s}. varV;
58
voltajes_rama = puertas_mm{s}. varV + voltajes_rama;
59
end
60
end
61
end
fila_temp = table(voltaje_enlace ,voltajes_rama ,...
63
’VariableNames ’,{’voltaje_enlace ’ ’voltajes_rama ’ });
64
T = [T; fila_temp ];
65
end
66
end
67
end
68
for i = 1: size(T.voltajes_rama ,1)
69
V = children(T.voltajes_rama);
70
for j = 1: numel(V{i})
71
if abs(coeffs(V{i}{j})) ~= 1
72
V{i}{j} = 0;
73
end
74
V2{i}{j} = V{i}{j};
75
end
76
end
77
V = transpose(V2);
78
R = 0;
79
for i = 1: size(V,1)
80
for j = 1: numel(V{i})
81
R = V{i}{j} + R;
82
end
83
T.voltajes_rama(i) = R;
84
R = 0;
85
end
86 end
voltajes_rama(mm, md, estados, T) Ejecuta el proceso completo de solución del circuito mediante el método de voltajes de rama. Comienza aplicando la MFC a las corrientes primitivas para obtener el CEGID- LI (Conjunto de Ecuaciones General Integro-Diferencial Linealmente Independiente). Sustituye voltajes de enlace usando la tabla T de transformaciones, identifica y reemplaza fuentes de voltaje conocidas (constantes, sinusoidales, exponenciales) y separa el sistema en matriz de coeficientes A y vector de excitaciones b mediante factorización simbólica con collect y children. Resuelve el sistema algebraico usando inversión matricial (A−1·b), obtiene ecuaciones diferenciales mediante numden y presenta los resultados en formato tabular mostrando las EDOs para cada voltaje de rama, completando así la transición desde la descripción circuital hasta las ecuaciones dinámicas gobernantes.
1 function
cegidli = voltajes_rama(mm ,md ,estados ,T)
2
[R,L,C,LM ,VI ,II ,VD ,ID ,CTE ,SIN ,COS ,EXP ,INTS ,INTC] = id_col_caso;
3
% Llamar matriz de cortes fundamentales
4
MCF = mm.modelos .( estados).DC.MCF;
5
columnas_cero = all(MCF == 0, 1);
6
MCF = MCF(:, ~columnas_cero);
7
8
% Llamar vector de corrientes simbolicas
9
I = mm.variables.corrientes;
10
i_primitivas = sym ([]);
11
12
% Sustituir corrientes por sus respectivas primitivas
13
etiquetas_islas = {’DC’,’SIN’,’EXP’,’NoFuente ’,’Combinada ’};
14
15
for i = 1: numel(I)
16
for j = 1: numel( etiquetas_islas )
17
puertas_md = md.elementos .( estados).( etiquetas_islas{j}).
puertas;
18
puertas_mm = mm.elementos .( estados).( etiquetas_islas{j}). puertas;
19
for k = 1: numel(puertas_mm)
20
if puertas_mm{k}. varI == I(i)
21
i_primitivas(i,1) = puertas_mm{k}. primitiva_I;
22
end
23
end
24
end
25
end
26
indices_no_cero = find(i_primitivas ~= 0);
27
i_primitivas = i_primitivas( indices_no_cero);
28
29
% Detectar voltajes de enlace y pasarlos a voltajes de rama
30
i_final = i_primitivas;
31
for j = 1: size(T,1)
32
if any(has(i_primitivas ,T. voltaje_enlace (j)))
33
i_final = subs(i_final ,T. voltaje_enlace (j),T.voltajes_rama (j));
34
end
35
end
36
disp(T)
37
% Realizar la multiplicacion matriz por vector
38
cegidli = MCF * i_final;
39
disp (" CONJUNTO DE ECUACIONES
GENERALES
INTEGRO -DIFERENCIALES
LINEALMENTE
INDEPENDIENTES ")
40
disp(cegidli)
41
42
% Depurar cegidli (Eliminar corrientes simbolicas)
43
fila = has(cegidli ,mm.variables.corrientes);
44
cegidli = cegidli (~ fila);
T = table ();
46
for j = 1: numel( etiquetas_islas )
47
puertas_md = md.elementos .( estados).( etiquetas_islas{j}). puertas;
48
puertas_mm = mm.elementos .( estados).( etiquetas_islas{j}). puertas;
49
for k = 1: numel(puertas_md)
50
if puertas_md{k}.nat == VI
51
id = puertas_md{k}.id;
52
v_sym = puertas_mm{k}. varV;
53
switch puertas_md{k}. tipo_senal
54
case{CTE}
55
v_real = puertas_md{k}. parametro;
56
case{SIN}
57
A = puertas_md{k}. parametro.amplitud;
58
B = puertas_md{k}. parametro.w;
59
E = puertas_md{k}. parametro.desfase;
60
F = puertas_md{k}. parametro.offset;
61
v_real = A*sin(B*t+E)+F;
62
case{COS}
63
A = puertas_md{k}. parametro.amplitud;
64
B = puertas_md{k}. parametro.w;
65
E = puertas_md{k}. parametro.desfase;
66
F = puertas_md{k}. parametro.offset;
67
v_real = A*cos(B*t+E)+F;
68
case{EXP}
69
A = puertas_md{k}. parametro.amplitud;
70
B = puertas_md{k}. parametro.exponente;
71
E = puertas_md{k}. parametro.offset;
72
v_real = A*exp(B*t)+E;
73
end
fila_temp = table(id ,v_sym ,v_real ,’VariableNames ’,{’ID ’ ’voltaje_simbolico ’,’voltaje_real ’});
76
T = [T; fila_temp ];
77
end
78
end
79
end
80
81
for i = 1: size(T,1)
82
if any(has(cegidli ,T(i,:). voltaje_simbolico ))
83
vs = T(i,:). voltaje_simbolico ;
84
vr = T(i,:).voltaje_real;
85
cegidli = subs(cegidli ,vs ,vr);
86
end
87
end
88
89
% Separar excitaciones del sistema de ecuaciones
90
sym_variables = symvar(cegidli);
91
sym_voltages = mm.variables.voltajes;
92
v_target = transpose(intersect(sym_variables ,sym_voltages));
93
cegidli_factorizado = collect(cegidli ,v_target); % Se factorizan los coeficientes de cada voltaje
94
sub_expr = children( cegidli_factorizado );
95
% disp (" CONJUNTO DE ECUACIONES
GENERALES
INTEGRO -DIFERENCIALES
LINEALMENTE
INDEPENDIENTES ")
96
% disp( cegidli_factorizado )
97
temp_1 = 0;
98
temp_2 = 0;
99
A = str2sym(’[]’);
100
b = str2sym(’[]’);
101
for i = 1: numel(sub_expr)
for j = 1: numel(sub_expr{i})
103
if has(sub_expr{i}{j},mm.variables.voltajes)
104
temp_1 = temp_1 + sub_expr{i}{j};
105
else
106
temp_2 = temp_2 + sub_expr{i}{j};
107
end
108
end
109
A(i,1) = temp_1;
110
b(i,1) = temp_2;
111
temp_1 = 0;
112
temp_2 = 0;
113
end
114
115
% Obtener vector de soluciones b
116
b = (-1) * b;
117
disp (" VECTOR DE EXCITACIONES B")
118
disp(b)
119
120
% Obtener la matriz de coeficientes A
121
A_m = sym(zeros(numel(v_target),numel(v_target)));
122
logic_voltage = eye(numel(v_target),numel(v_target));
123
for i = 1: size(logic_voltage ,1)
124
for j = 1: size(A_m ,2)
125
A_m(i,j) = subs(A(i),v_target ,logic_voltage(j,:));
126
end
127
end
128
A = A_m;
129
disp (" MATRIZ DE COEFICIENTES A")
130
disp(A)
131
132
% Solucionar el sistema usando x = A^-1 * b
disp (" >>> SOLUCION
DEL SISTEMA :")
134
system_solution = A^-1 * b;
135
disp( system_solution )
136
137
% Obtener los denominadores de las funciones de transferencia
138
P = [];
139
Q = [];
140
for i = 1: numel( system_solution )
141
[num ,den] = numden( system_solution (i));
142
P = [P;num];
143
Q = [Q;den];
144
end
145
% EDO = horzcat(Q,P);
146
disp (" ECUACIONES
DIFERENCIALES DE CADA
VOLTAJE DE RAMA ")
147
tabla_edo = table(transpose(v_target),Q,P,’VariableNames ’,{’ Voltaje ’,’Denominador Q(t)’,’Numerador P(t)’});
148
disp(tabla_edo)
149 end
i_function_v(mm,md,estados) Realiza la asignación de la ecuación primitiva de corriente dependiendo de la naturaleza del elemento circuital, en caso de que el elemento sea una fuente de voltaje, la función devuelve la variable simbólica de corriente asociada a esa rama.
1 function
i_function_v(obj ,mm ,md ,estados)
2
[R,L,C,LM ,VI ,II ,VD ,ID ,CTE ,SIN ,COS ,EXP ,~,~] = id_col_caso;
3
etiquetas_islas = {’DC’,’SIN’,’EXP’,’NoFuente ’ ’Combinada ’};
4
D = sym(’D’); % Operador derivada
5
t = sym(’t’); % Variable simbolica de tiempo
6
7
for i = 1: numel( etiquetas_islas )
8
if ~isempty(md.elementos .( estados).( etiquetas_islas {i}). puertas) % Verificar si el elemento se NO se encuentra vacio
9
for j = 1: numel(md.elementos .( estados).( etiquetas_islas {i }).puertas)
10
obj_md = md.elementos .( estados).( etiquetas_islas {i}). puertas{j()};
11
obj_mm = mm.elementos .( estados).( etiquetas_islas {i}). puertas{j}();
12
switch obj_md.nat
13
case{R}
14
obj_mm.primitiva_I = obj_md.parametro ^-1 * obj_mm.varV;
15
case{L}
16
obj_mm.primitiva_I = obj_md.parametro ^-1 * D ^-1 * obj_mm.varV;
17
case{C}
18
obj_mm.primitiva_I = obj_md.parametro * D * obj_mm.varV;
case{LM}
20
id_acoples = md. circuito_cero_menos .puertas(md . circuito_cero_menos .puertas (:,4)==LM);
21
v_acoples = mm.variables.voltajes(md. circuito_cero_menos .puertas (:,4)==LM);
22
M = mm.modelos .( estados).( etiquetas_islas {i}).
MIMA;
23
m_primitivas = M^-1 * D^-1 * v_acoples;
24
T = table ();
25
for v = 1:2
26
fila_temp = table(id_acoples(v), m_primitivas(v,:),’VariableNames ’,{’ID’ ’primitiva ’});
27
T = [T; fila_temp ];
28
end
29
id = obj_md.id;
30
for v = 1:2
31
if T.ID(v) == id
32
obj_mm.primitiva_I = T.primitiva(v);
33
end
34
end
35
case{VI}
36
obj_mm.primitiva_I = obj_mm.varI;
37
case{II}
38
switch obj_md.tipo_senal
39
case{CTE}
40
obj_mm.primitiva_I = obj_md.parametro;
41
case{SIN}
42
A = obj_md.parametro.amplitud;
43
B = obj_md.parametro.w;
44
E = obj_md.parametro.desfase;
45
F = obj_md.parametro.offset;
obj_mm.primitiva_I = A*sin(B*t+E)+F;
47
case{COS}
48
A = obj_md.parametro.amplitud;
49
B = obj_md.parametro.w;
50
E = obj_md.parametro.desfase;
51
F = obj_md.parametro.offset;
52
obj_mm.primitiva_I = A*cos(B*t+E)+F;
53
case{EXP}
54
A = obj_md.parametro.amplitud;
55
B = obj_md.parametro.exponente;
56
E = obj_md.parametro.offset;
57
obj_mm.primitiva_I = A*exp(B*t)+E;
58
end
59
end
60
end
61
end
62
end
63 end
(página sin texto)
6.
IMPLEMENTACIÓN Y RESULTADOS
Para solucionar el circuito, el programa ejecuta una secuencia de rutinas de extracción y depuración de la información, mediante las cuales genera los objetos necesarios para el análisis posterior. A continuación, crea un conjunto de variables simbólicas. Una vez realizado el análisis de conectividad, el programa calcula las matrices de incidencia de cortes y de anillos. Esta información se almacena en las propiedades MFC (Matriz Fundamental de Cortes) y MFA (Matriz Fundamental de Anillos), respectivamente. Asimismo, se dispone de propiedades para almacenar las variables simbólicas de voltaje y corriente asociadas a cada elemento del circuito.
La multiplicación de la matriz fundamental de cortes por el vector de corrientes da como resultado la formulación de la primera ley de Kirchhoff para todos los cortes, como puede observarse en las figuras. De manera análoga, al multiplicar la matriz fundamental de anillos por el vector de voltajes se obtiene la expresión de la segunda ley de Kirchhoff para todos los anillos del circuito, tal como se muestra a continuación. En el caso del circuito de prueba, el análisis se lleva a cabo mediante el método de Voltajes de Rama, siguiendo el siguiente algoritmo de solución.
6.1.
Algoritmo para el método de Voltajes de Rama
1. Elegir como rama el elemento donde se pide la respuesta deseada.
2. Elegir como ramas los siguientes los elementos en el siguiente orden Fuentes
de voltaje independientes, resistencias, capacitancias, inductancias, inductancias mutuamente acopladas y finalmente fuentes de corriente (es recomendable siempre dejar esta como última opción). Tener en cuenta que el número de ramas se toma como el número de nodos menos uno. nramas = nnodos −1
(1)
3. Elegir como enlaces el resto de elementos del circuito
4. Plantear la matriz de voltajes en las inductancias mutuamente acopladas
teniendo en cuenta los sentidos de corriente asumidos y la ubicación de las marcas de polaridad.
5. Del paso anterior hacer la inversa de la matriz de acoples e integrar el vector
de tensiones con respecto al tiempo.
6. Plantear un vector de corrientes de n x 1 en donde n es el número de elementos
de circuito.
7. Recorrer en orden cada posición del vector anterior y reemplazar esa corriente
por la ecuación primitiva de corriente de ese elemento.
8. Realizar la matriz fundametal de cortes (MFC) para el circuito de análisis,
teniendo en cuenta los sentidos de corriente asumidos.
9. Realizar la matriz fundamental de anillos (MFA), teniendo en cuenta las
polaridades de los elementos.
10. Crear un vector de voltajes de n x 1 donde n es el número de elementos del
circuito.
11. Realizar la multiplicación de la MFA con el vector de voltajes. Esto da como
resultado la segunda ley de Kirchhoff de la siguiente forma: (P Vsubidas −P Vcaidas = 0).
12. Despejar todos los voltajes de enlace en función de los voltajes de rama.
13. Recorrer en orden el vector de corrientes con ecuaciones primitivas y despejar
por cada voltaje de enlace reemplazar con sus respectivos de voltajes de rama hallados en el paso anterior.
14. Realizar la multiplicación de MFC con este último vector.
15. Esta última multiplicación de como resultado el CEGIDLI igualado a cero.
16. Separar las excitaciones de las variables del anterior conjunto de ecuaciones.
17. Reemplazar las derivadas por el operador simbólico:
d dt =⇒D
18. Reemplazar las integrales por el operador simbólico:
R dt =⇒D−1
19. Si alguna ecuación del CEGIDLI tiene algún operador integral entonces mul-
tiplicar la expresión en ambos lados por el operador derivada de tal forma que no existan integrales en la ecuación.
20. Expresar de forma matricial el conjunto de ecuaciones de la siguiente forma:
[A] ·⃗x =⃗b donde:
[A]: es la matriz de coeficientes con el operador D⃗ x: es el vector de incógnitas⃗ b: es el vector de excitaciones NOTA: para este algoritmo el vector de incógnitas corresponde a los voltajes de rama
21. Encontrar la respuesta deseada usando el método de Crammer. En caso de
querer todas las respuestas, se puede realizar la siguiente operación matricial:⃗ x = [A]−1 ·⃗b NOTA: esta operación inversa se puede realizar a mano, pero también se puede mediante algunos comandos de MATLAB.
22. Una vez encontradas las ecuaciones diferenciales, estas se pueden resolver
usando algún método numérico o usando las funciones ode ó dsolve de MATLAB para hallar las respuesta exactas en el dominio del tiempo. .
6.2.
Obtención de las tres ecuaciones diferenciales Al ejecutar el programa sobre el caso caso10n11p5i, el software realiza un análisis completo de conectividad y posteriormente entrega un resultado a través de la venta de comandos de MATLAB donde se muestran las ecuaciones diferenciales simbólicas las cuales son las soluciones completas y exactas del circuito.
6.3.
Resultados MATLAB >> resultados = haceos(caso10n11p5i, hcs_opt) voltaje_enlace voltajes_rama v8 v9 −v10 v2 v1 v5 v1 v7 v1 v4 v6 Tabla de Primitivas Primitivas de Corriente En función de Voltajes de Rama v1/3000 v1/3000 v2/D v1/D v4/D + v8/D v6/D + (v9 −v10)/D sin(1000t + 5313/100)/250 sin(1000t + 5313/100)/250 v6/2000 v6/2000 (Dv7)/1000000 (Dv1)/1000000 v4/D + (2v8)/D v6/D + (2(v9 −v10))/D i9 i9 v10/1000 v10/1000
Vector de Excitaciones B B = − sin 1000t + 5313
100
250
−12 D
24
D Matriz de Coeficientes A A = D
1000000 + 1
D +
1
3000
0
0
0
1
D +
1
2000
−1 D
0
−1 D
2
D +
1
1000
Ecuaciones Diferenciales Voltaje Denominador Q(t) Numerador P(t) v1 3D2 + 1000D + 3000000 −12000D sin 1000t + 5313
100
v6 D2 + 4000D + 2000000 −24000D v10 D2 + 4000D + 2000000 24000D + 24000000 A continuación se presentan las ecuacions diferenciales obtenidas usando notación de Leibniz para las derivadas.
Tabla 1. Solución Entregada por la Herramienta Voltaje de Rama Ecuación Diferencial VR2(t)
3 d2
dt2v1(t) + 1000 d dtv1(t) + 3000000v1(t) = −12000 d dt sin (1000t + 53.13) VR3(t) d2 dt2v6(t) + 4000 d dtv6(t) + 2000000v6(t) = −24000 d dtv(t) VR1(t) d2 dt2v10(t) + 4000 d dtv10(t) + 2000000v10(t) = 24000 d dtv(t) + 24000000v(t)
6.4.
Solución simbólica de la EDO Para resolver las ecuaciones entregadas por el software, es necesario hacer uso de la función dsolve de MATLAB. Se realiza el análisis para la primea ecuación diferencial.
3 d2
dt2v1(t) + 1000 d dtv1(t) + 3000000v1(t) = −12000 d dt sin (1000t + 53.13)
(2)
1 % Resolver
ecuacion diferencial de segundo orden
2 % 3*y’’ + 1000*y’ + 3000000*y =
-12000* cos (1000*t + 53.13)
3
4 % Definir
variable simbolica
5 syms y(t)
6
7 % Definir
derivadas 8 Dy = diff(y, t); % Primera derivada 9 D2y = diff(y, t, 2); % Segunda derivada
10
11 % Definir
la ecuacion diferencial
12 eqn = 3* D2y + 1000* Dy + 3000000*y ==
-12000* cos (1000*t + 53.13);
13
14 % Resolver
la ecuacion diferencial 15 sol = dsolve(eqn);
16
17 % Mostrar
la solucion
18 disp(’Solucion
de la ecuacion diferencial :’)
19 pretty(sol)
Lo anterior da como resultado la siguiente función matemática en el dominio del tiempo que expresa la tensión de rama v1(t) o equivalente al voltaje en la resistencia vR2(t):
v1(t) = exp −500t
3
cos
500
√ 35t
3
! 3
250 sin
5313
100
+ 1 −sin
500
√ 35t
3
! "
3
500 cos
1000t −500 √ 35t
3
+ 5313
100
!
−
3
500 cos
1000t + 500 √ 35t
3
+ 5313
100
!
+ 9 √
35
8750 cos
1000t −500 √ 35t
3
+ 5313
100
!
+ 9 √
35
8750 cos
1000t + 500 √ 35t
3
+ 5313
100
!
+ 3 √
35
17500 sin
1000t −500 √ 35t
3
+ 5313
100
!
+ 3 √
35
17500 sin
1000t + 500 √ 35t
3
+ 5313
100
! # −cos
500
√ 35t
3
! "
3
500 sin
1000t −500 √ 35t
3
+ 5313
100
!
+
3
500 sin
1000t + 500 √ 35t
3
+ 5313
100
!
−3 √
35
17500 cos
1000t −500 √ 35t
3
+ 5313
100
!
+ 3 √
35
17500 cos
1000t + 500 √ 35t
3
+ 5313
100
!
+ 9 √
35
8750 sin
1000t −500 √ 35t
3
+ 5313
100
!
−9 √
35
8750 sin
1000t + 500 √ 35t
3
+ 5313
100
! #
(3)
De la expresión anterior se puede obtener la gráfica reemplazando la variable de tiempo por un vector y graficando punto por punto, la respuesta obtenida es la siguiente:
Figura 3. Respuesta completa para el voltaje de rama v1 correspondiente a la resistencia R2 Para la segunda ecuación diferencial correspondiente al voltaje de rama v10 se tiene la siguiente ecuación diferencial.
d2 dt2v10(t) + 4000 d dtv10(t) + 2000000v10(t) = 24000 d dtv(t) + 24000000v(t)
(4)
Se presenta la solución exacta en el dominio del tiempo para la ecuación (4) v10(t) = e−t(1000 √ 194+14000)
35
√
194
97
−5 !
−5 √ 194et(1000√194−14000))( √
194 + 14)
194
+ 12
(5)
Figura 4. Respuesta completa para el voltaje de rama v10 correspondiente a la resistencia R1 Se presenta la tercer ecuación diferencial la cual corresponde al voltaje de rama v6 d2 dt2v6(t) + 4000 d dtv6(t) + 2000000v6(t) = −24000 d dtv(t)
(6)
v6(t) = √
194 et(1000
√ 194−14000) √
194 + 14
194
−e−t(1000 √ 194+14000)
7
√
194
97
−1 !
(7)
La siguiente gráfica corresponde a la respuesta en el tiempo del voltaje de rama v6 Figura 5. Respuesta completa para el voltaje de rama v6 correspondiente a la resistencia R3
6.5.
Gráficas de las respuestas transitorias Para analizar el comportamiento transitorio de los voltajes en las ramas, es necesario retomar el sistema de ecuaciones diferenciales que modela la dinámica del circuito. Al igualar a cero el término independiente (lado derecho) de dichas ecuaciones, se eliminan las excitaciones externas del sistema. La solución del conjunto homogéneo resultante proporciona entonces la respuesta natural o transitoria, la cual depende únicamente de la energía almacenada inicialmente en los elementos reactivos y de la topología del circuito.
3 d2
dt2v1(t) + 1000 d dtv1(t) + 3000000 · v1(t) = 0
(8)
d2 dt2v6(t) + 4000 d dtv6(t) + 2000000 · v6(t) = 0
(9)
d2 dt2v10(t) + 4000 d dtv10(t) + 2000000 · v10(t) = 0
(10)
(a) Transitorio de v1 (b) Transitorio de v6 (c) Transitorio de v10 Figura 6. Respuestas transitorias para las tensiones de rama del circuito de prueba caso10n11p5i
(página sin texto)
7.
DISCUSIÓN
7.1.
Interpretación de los resultados Como se muestra en la sección 6.3, los algoritmos desarrollados calculan de manera satisfactoria los voltajes de enlace a partir de los voltajes de rama. Asimismo, se observa que el despeje de las ecuaciones de corriente, la construcción del vector de excitaciones y la generación de la matriz de coeficientes se realizan de forma correcta y automatizada. Este resultado es posible gracias a la utilización de las funciones del toolbox de cálculo simbólico de MATLAB, cuyas rutinas optimizadas garantizan precisión en las operaciones algebraicas requeridas.
La ecuación (5) se compone de tres términos: dos exponenciales que decaen en el tiempo y un tercer término constante de doce voltios, el cual representa la respuesta en estado estable. Como puede observarse en la figura 3, la curva resultante converge asintóticamente hacia este valor.
La figura 4 muestra la respuesta gráfica de la ecuación (7). Matemáticamente, su forma es similar a la anterior, ya que también está compuesta por dos exponenciales que decaen en el tiempo. No obstante, a diferencia del caso previo, esta ecuación no presenta un término constante; en consecuencia, su valor en estado estacionario es de cero voltios. La figura 2 ilustra el comportamiento descrito por la ecuación (2), que corresponde a una respuesta de tipo oscilatorio. Esta oscilación es el resultado de la presencia de funciones seno y coseno en sus términos, las cuales operan a distintas amplitudes. Además, la respuesta presenta un decaimiento progresivo debido al factor exponencial negativo que multiplica al primer término. En consecuencia, aunque la señal es oscilatoria, su amplitud decae asintóticamente hacia cero, lo que determina que su valor en estado estacionario sea de cero voltios.
7.2.
Ventajas y limitaciones del método propuesto El algoritmo desarrollado en esta tesis se presenta en sí como una herramienta que le permita al docente explicar de forma secuencial y detallada el procedimiento para resolver un circuito eléctrico mediante un método topológico. Sin embargo hay algunas limitaciones; el ingreso de los datos de un circuito en la herramienta es un trabajo tedioso que requiere un tiempo adicional para que el estudiante o docente entienda cómo se deben llenar todos los campos de forma correcta, esto en sí mismo puede llegar a presentar un problema si lo que se quiere es acortar los tiempos de enseñanza y aprendizaje de la asignatura de Circuitos Eléctricos I. Existe otra limitación la cual corresponde a la asignación de las ecuaciones primitivas para las inductancias mutuamente acopladas, esto debido a que el algoritmo presentado para calcular las MIMA’s funciona sólo si el circuito tiene como máximo dos inductancias mutuamente acopladas, si llegase a tener más de dos el algoritmo no se ejecuta, por este motivo se envía un mensaje de error advirtiendo al usuario que el circuito contiene más de dos inductancias acopladas.
En la versión presentada en esta tesis aún no se realizan pruebas para fuentes dependientes de tensión y corriente.
Tampoco se han realizado pruebas para fuentes independientes con señal de tipo exponencial.
7.3.
Comparación con otros enfoques o herramientas Se presenta una comparación con el software PROTEUS de las respuestas obtenidas en el dominio del tiempo para los voltajes en las ramas v1, v6 y v10, los cuales corresponde a los voltajes en las resistencias R2, R3 y R1 respectivamente.
A continuación se muestran las respuestas temporales para los voltajes de rama. (a) Resultado obtenido de con HACEOS (b) Resultado obtenido con PROTEUS (c) Resultado obtenido con Simulink
(a) Resultado obtenido de con HACEOS (b) Resultado obtenido con PROTEUS (c) Resultado obtenido con Simulink
(a) Resultado obtenido de con HACEOS (b) Resultado obtenido con PROTEUS (c) Resultado obtenido con Simulink
7.4.
Relevancia para la enseñanza de los circuitos eléctricos El desarrollo de esta tesis ha permitido no sólo desarrollar algoritmos para solucionar circuitos eléctricos, además, ha permitido desarrollar una metodología que permita al docente explicar de forma secuencial y ordenada la solución de un circuito eléctrico, esta metodología presentada de esta manera podría ayudar a que los estudiantes de la asignatura comprendan de mejor manera los conceptos que usarán el resto de su carrera, además de identificar aquellos items que se les dificulta a la hora de resolver un circuito eléctrico. La implementación de esta tesis en la enseñanza de esta asignatura puede llegar a impactar de forma positiva la forma en la que los estudiantes perciben la asignatura.
8.
CONCLUSIONES Y RECOMENDACIONES
8.1.
Logros del trabajo El desarrollo de este trabajo ha permitido alcanzar los siguientes logros: Se lograron generar los algoritmos necesarios para el análisis de circuitos en el estado transitorio, estos algoritmos permiten hacer análisis exactos de las respuestas transitorias que se presentan en un circuito eléctrico.
Se lograron obtener las respuestas simbólicas para el conjunto de ecuaciones dinámicas de un circuito eléctrico.
Se lograron obtener las soluciones exactas para el conjuntos de ecuaciones diferenciales que modelan las respuestas de los voltajes en los elementos circuitales. Un logro no esperado con esta tesis fue el desarrollo de un algoritmo más actualizado para el método de voltajes de rama el cual incluye análisis de conectividad mediante las matrices de incidencia de cortes y anillos.
8.2.
Contribuciones El desarrollo de esta tesis aportará a robustecer HACEOS mediante la implementación de sus algoritmos para análisis en el estado transitorio para circuitos eléctricos de orden superior. Asimismo contribuirá al proceso de enseñanza de la asignatura mediante el algoritmo presentado para resolver por el método de voltajes de rama.
8.3.
Recomendaciones para futuras extensiones Aunque esta tesis presente algoritmos para el análisis de circuitos en el estado transitorio mediante un enfoque topológico se recomienda que en el futuro se puedan integrar los métodos de análisis no topológicos ya que estos son más conocidos y son los que usualmente se enseñan a los estudiantes.
Asimismo, se prevé que, una vez que los algoritmos superen todas las etapas de validación, pueda desarrollarse una interfaz gráfica de usuario (GUI) para el software HACEOS. Este desarrollo tiene como objetivo principal superar la limitación actual en el ingreso de datos, mejorando así la experiencia del usuario.
BIBLIOGRAFÍA
[1] A. Acosto Montoya, Análisis de Circuitos Eléctricos: Un Enfoque Teórico. Bogotá, Colombia: Ediciones de la U, 2022.
[2] C. K. Alexander y M. N. O. Sadiku, Fundamentals of Electric Circuits, 7th ed. New York, NY, USA: McGraw-Hill, 2021. [ISBN: 978-1-260-47767-2] [3] T. L. Floyd, Principios de Circuitos Eléctricos, 8va ed. Naucalpan de Juárez, México: Pearson Educación, 2007.
[4] C. K. Alexander y M. N. O. Sadiku, Fundamentos de Circuitos Eléctricos, 5ta ed. Ciudad de México, México: McGraw-Hill Educación, 2013.
[5] L. Joyanes, Programación Orientada a Objetos, 2da ed. Madrid, España: McGraw- Hill / Interamericana de España, S.A., 1998.
[6] D. J. Barnes y M. Kölling, Programación orientada a objetos con Java, una introducción práctica usando BlueJ. Madrid, España: Pearson Educación, 2007. [7] A. Amhed y B. Prasad, Foundations of Software Design. EEUU: CRC Press, 2016. [8] D. B. West, Introduction to Graph Theory, 2nd ed. USA: Pearson, 2001. [9] J. A. Bondy y U. S. R. Murty, Graph Theory, ser. Graduate Texts in Mathematics. Springer, 2008.
[10] M. A. Henning y J. H. van Vuuren, Graph and Network Theory. An Applied Approach using Mathematica. Springer, 2022.
(página sin texto)
9.
ANEXOS
9.1.
Método de Cramer Si Ax=b es un sistema de ecuaciones, A es la matriz de coeficientes del sistema x = (x1,...,xn)’ es el vector columna de las incógnitas, y b es el vector columna de los términos independientes, entonces la solución al sistema se presenta así: xj = det(Aj) det(A) Donde Aj, es la matriz resultante de reemplazar la j-ésima columna de A por el vector columna b.
x = x1
...
xn b = b1
...
bn Aj = a1,1
· · ·
a1,j−1 b1 a1,j+1
· · ·
a1,n a2,1
· · ·
a2,j−1 b2 a2,j+1
· · ·
a2,n
...
...
...
...
...
...
...
an−1,1
· · ·
an−1,j−1 bn−1 an−1,j+1
· · ·
an−1,n an,1
· · ·
an,j−1 bn an,j+1
· · ·
an,n Usando las propiedades de la multiplicación de matrices:
Ax = b ⇔A−1Ax = A−1b ⇔Ix = A−1b ⇔x = A−1b Entonces:
x = A−1b = (Adj A)t |A| b Por lo tanto:
xj = (A−1b)j = n X i=1 Aij |A|bi = Pn i=1 Aijbi |A| = |Aj| |A| ,
Cita: Ospina-Rendón, Brandon Santiago (2026), Algoritmos computacionales para analizar circuitos eléctricos de orden superior en el estado transitorio: un enfoque topológico usando cálculo simbólico, Universidad Tecnológica de Pereira, p. N. https://hdl.handle.net/11059/16825