public virtual double TheveninVoltage(Node referenceNode, double t)
        {
            double v      = 0;
            Dipole compo1 = null;
            Node   node1  = null;

            foreach (var item in Components)
            {
                if (item.Nodes[0] == referenceNode || item.Nodes[1] == referenceNode)
                {
                    compo1 = item;
                    break;
                }
            }
            node1 = referenceNode;
            do
            {
                if (compo1 is Branch)
                {
                    v += ((Branch)compo1).TheveninVoltage(node1, t);
                }
                else
                {
                    v += compo1.voltage(node1, t);
                }
                node1  = compo1.OtherNode(node1);
                compo1 = node1.OtherComponent(compo1);
            } while (InternalNodes.Contains(node1));

            return(v);
        }
        public virtual double NortonCurrent(Node referenceNode, double t)
        {
            if (CurrentImposser != null)
            {
                return(Current(referenceNode, t));
            }

            double v = 0, z = 0;
            Dipole compo1 = null;
            Node   node1  = null;

            foreach (var item in Components)
            {
                if (item.Nodes[0] == referenceNode || item.Nodes[1] == referenceNode)
                {
                    compo1 = item;
                    break;
                }
            }
            node1 = referenceNode;
            do
            {
                if (compo1 is Branch)
                {
                    v += ((Branch)compo1).TheveninVoltage(node1, t);
                }
                else
                {
                    v += compo1.voltage(node1, t);
                }
                z     += compo1.Impedance().Real;
                node1  = compo1.OtherNode(node1);
                compo1 = node1.OtherComponent(compo1);
            } while (InternalNodes.Contains(node1));

            return(v / z);
        }
        public virtual Complex32 NortonCurrent(Node referenceNode, Complex32?W = null)
        {
            Complex32 v = 0, z = 0;
            Dipole    compo1 = null;
            Node      node1  = null;

            //encuentro el componente unido al nodo de referencia
            foreach (var item in Components)
            {
                if (item.Nodes[0] == referenceNode || item.Nodes[1] == referenceNode)
                {
                    compo1 = item;
                    break;
                }
            }

            //a partir del nodo y el componente, escaneo la ramaenbusca de la Vthevenin y la Rthevenin
            node1 = referenceNode;
            do
            {
                if (compo1 is Branch)
                {
                    v += ((Branch)compo1).TheveninVoltage(node1, W);
                }
                else if (compo1 is ACVoltageGenerator)
                {
                    v += compo1.voltage(node1, W);
                }

                //los componentes pasivos no tienen tension en barrido en frecuencia
                z     += compo1.Impedance(W);
                node1  = compo1.OtherNode(node1);
                compo1 = node1.OtherComponent(compo1);
            } while (InternalNodes.Contains(node1));

            return(v / z);
        }
        /// <summary>
        /// barre una rama desde un nodo interno hacia la izquierda o derecha
        /// calculando la suma de las tensiones de generadores V1
        /// y la suma de impedancias Z1
        /// </summary>
        /// <param name="nodo"></param>
        /// <param name="compo1"></param>
        /// <param name="t"></param>
        /// <param name="v1"></param>
        /// <param name="z1"></param>
        private static void NavigateBranch(Node nodo, Dipole compo1, double t, ref double v1, ref double z1)
        {
            Node nodo1 = nodo;

            while (!(nodo1.TypeOfNode == Node.NodeType.MultibranchCurrentNode || nodo1.IsReference))
            {
                if (compo1 is Resistor)
                {
                    z1 += compo1.Impedance().Real;
                }
                else if (compo1 is VoltageGenerator || compo1 is Capacitor)
                {
                    v1 += compo1.voltage(nodo1, t);
                }
                else
                {
                    throw new NotImplementedException();
                }
                nodo1 = compo1.OtherNode(nodo1);
                compo1 = nodo1.OtherComponent(compo1);
            }
            if (nodo1.TypeOfNode == Node.NodeType.MultibranchCurrentNode)
            {
                v1 += nodo1.Voltage.Real;
            }
        }
        /// <summary>
        /// barre una rama desde un nodo interno hacia la izquierda o derecha
        /// calculando la suma de las tensiones de generadores V1
        /// y la suma de impedancias Z1
        /// </summary>
        /// <param name="nodo"></param>
        /// <param name="compo1"></param>
        /// <param name="W"></param>
        /// <param name="v1"></param>
        /// <param name="z1"></param>
        private static void NavigateBranch(Node nodo , Dipole compo1, Complex32 W, ref Complex32 v1, ref Complex32 z1)
        {
            Node nodo1 = nodo;

            while (!(nodo1.TypeOfNode == Node.NodeType.MultibranchCurrentNode || nodo1.IsReference)) 
            {
                if (nodo1.TypeOfNode == Node.NodeType.VoltageFixedNode)
                {
                    //llegue al final de la rama
                    v1 += nodo1.Voltage;
                    break;
                }
                if (compo1 is PasiveComponent)
                {
                    z1 += compo1.Impedance(W);
                }
                else if (compo1 is VoltageGenerator)
                {
                    v1 += compo1.voltage(nodo1, W);
                }
                else
                {
                    throw new NotImplementedException();
                }
                nodo1 = compo1.OtherNode(nodo1);
                compo1 = nodo1.OtherComponent(compo1);
            }
            if (nodo1.TypeOfNode == Node.NodeType.MultibranchCurrentNode && !nodo1.IsReference)
            {
                v1 += nodo1.Voltage;
            }
        }