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; } }