Análisis de redes mediante Análisis Nodal Modificado
Por Mariano Llamedo Soria
Resumen
En este documento se presentan …
Funciones de análisis de cuadripolos: smna
De presentación algebraica: print_latex, a_equal_b_latex_s, print_subtitle
De manipulación de sistemas lineales: tf2sos_analog, parametrize_sos
Introducción
Documento en elaboración. Algunas referencias para este tema:
GIC bicuad
A partir de una red de referencia:
se dibuja y parametriza en LTspice:
y luego este archivo será lo que se toma como entrada a las funciones de análisis nodal modificado.
"""
Referencias:
------------
Cap. 5. Schaumann Rolf. Design of Analog Filters.
Cap. 17. Vlach, Jiri - Linear Circuit Theory Matrices in Computer Applications (2014)
"""
import sympy as sp
from pytc2.sistemas_lineales import parametrize_sos
from pytc2.general import s, print_latex, print_subtitle, a_equal_b_latex_s
from pytc2.cuadripolos import smna
from IPython.display import display, Markdown
fileName_asc = './schematics/GIC bicuad.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = False)
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/GIC bicuad.net
Ecuación MNA
# tuning a mano de las ecuaciones
A0 = extra_results['A']
if extra_results['eps'] != 0:
A0 = A0.subs(extra_results['eps'], 0)
if extra_results['aop'] != 0:
A0 = A0.limit(extra_results['aop'], sp.oo)
equ_smna = sp.Eq(A0*extra_results['X'], extra_results['Z'])
print_subtitle('Ecuación MNA')
display(equ_smna)
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = u1[extra_results['v_out']] / u1[extra_results['v_in']]
display(H)
H0 = sp.collect(sp.simplify(sp.expand(H)),s)
H0 = parametrize_sos(H)[0]
display(H0)
Ackerberg Mossberg bicuad
Repetimos el procedimiento, a partir de una red de referencia:
se dibuja y parametriza en LTspice:
y luego procedemos al análisis
fileName_asc = './schematics/ACKMOSS bicuad.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = False)
# tuning a mano de las ecuaciones
A0 = extra_results['A']
if extra_results['eps'] != 0:
A0 = A0.subs(extra_results['eps'], 0)
if extra_results['aop'] != 0:
A0 = A0.limit(extra_results['aop'], sp.oo)
equ_smna = sp.Eq(A0*extra_results['X'], extra_results['Z'])
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/ACKMOSS bicuad.net
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = u1[extra_results['v_out']] / u1[extra_results['v_in']]
display(H)
H0 = sp.collect(sp.simplify(sp.expand(H)),s)
H0 = parametrize_sos(H)[0]
display(H0)
Lattice como ecualizador de fase de primer orden
Analizamos ahora una red pasiva balanceada de primer orden:
fileName_asc = './schematics/lattice_1ord_delay_eq.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = True)
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/lattice_1ord_delay_eq.net
Ecuación MNA
Notar que al tratarse de una salida desbalanceada debemos calcular: $\( H = \frac{v_3-v_4}{v1-v0} \)$
y qye \(v_0 = 0\)
u1 = sp.solve(equ_smna, extra_results['X'])
H = (u1[extra_results['X'][2]] - u1[extra_results['X'][3]]) / u1[extra_results['X'][1]]
H = sp.simplify(sp.expand(H))
display(H)
Tee con trafo como ecualizador de fase de primer orden
Analizamos ahora la versión desbalanceada del lattice anteriormente vista:
fileName_asc = './schematics/tee_1ord_delay_eq.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = True)
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/tee_1ord_delay_eq.net
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = u1[extra_results['v_out']] / u1[extra_results['v_in']]
H = sp.simplify(sp.expand(H))
display(H)
Lattice como ecualizador de fase de segundo orden
Analizamos ahora una red pasiva balanceada de segundo orden:
fileName_asc = './schematics/lattice_2ord_delay_eq.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = True)
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/lattice_2ord_delay_eq.net
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = (u1[extra_results['X'][2]] - u1[extra_results['X'][3]]) / u1[extra_results['X'][1]]
H = sp.simplify(sp.expand(H))
display(H)
Tee puenteada como ecualizador de demora de segundo orden
Analizamos ahora una red desbalanceada equivalente sin transformador:
fileName_asc = './schematics/tee_puen_2ord_delay_eq.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = True)
# tuning a mano de las ecuaciones
A0 = extra_results['A']
if extra_results['eps'] != 0:
A0 = A0.subs(extra_results['eps'], 0)
if extra_results['aop'] != 0:
A0 = A0.limit(extra_results['aop'], sp.oo)
equ_smna = sp.Eq(A0*extra_results['X'], extra_results['Z'])
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/tee_puen_2ord_delay_eq.net
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = u1[extra_results['v_out']] / u1[extra_results['v_in']]
H0 = sp.collect(sp.simplify(sp.expand(H)),s)
H0 = parametrize_sos(H)[0]
display(H0)
Tee puenteada con trafo
Ahora la misma red pero con un transformador para elevar un poco la complejidad:
fileName_asc = './schematics/tee_puen_2ord_delay_eq2.asc'
# symbolic MNA
equ_smna, extra_results = smna(fileName_asc,
bAplicarValoresComponentes = True,
bAplicarParametros = True)
# tuning a mano de las ecuaciones
A0 = extra_results['A']
if extra_results['eps'] != 0:
A0 = A0.subs(extra_results['eps'], 0)
if extra_results['aop'] != 0:
A0 = A0.limit(extra_results['aop'], sp.oo)
equ_smna = sp.Eq(A0*extra_results['X'], extra_results['Z'])
print_subtitle('Ecuación MNA')
display(equ_smna)
Utilizando netlist: ./schematics/tee_puen_2ord_delay_eq2.net
Ecuación MNA
u1 = sp.solve(equ_smna, extra_results['X'])
H = u1[extra_results['v_out']] / u1[extra_results['v_in']]
display(H)
H0 = H.subs(extra_results['dic_params'])
H0 = sp.collect(sp.simplify(sp.expand(H0)),s)
#H0 = parametrize_sos(H)[0]
display(H0)
No es el resultado que esperábamos, habrá que ver dónde quedó un error …





