Problema 8.10#
Trazar el lugar de las raices para el control proporcional de un sistema de tres etapas con constantes de tiempo 1, 0.5 y 0.25 min, ganancia de proceso \(K_p=1\) y medidor \(H=1\). Determinar la estabilidad para los valores de \(K_c\) siguientes: 0.1, 10 y 15. ¿Qué valores tendrán el margen de ganancia y de fase para cada uno de esos tres casos?
Solución
Gráfico del lugar de las raíces
El lazo de control propuesto es:
Show code cell source
using PyCall, LaTeXStrings
schemdraw = pyimport("schemdraw")
dsp = pyimport("schemdraw.dsp")
d = schemdraw.Drawing(unit=1, fontsize=12)
d.add(dsp.Arrow().right())
comp = d.add(dsp.Mixer(W="+", S="-").anchor("W"))
d.add(dsp.Arrow().at(comp.E).right())
control = d.add(dsp.Box(h=1, w=1.5).label(L"K_c").anchor("W"))
d.add(dsp.Arrow().right().at(control.E))
proc1 = d.add(dsp.Box(h=1, w=1.5).label(L"\frac{1}{s+1}").anchor("W"))
d.add(dsp.Arrow().right().at(proc1.E))
proc2 = d.add(dsp.Box(h=1, w=1.5).label(L"\frac{1}{0.5s+1}").anchor("W"))
d.add(dsp.Arrow().right().at(proc2.E))
proc3 = d.add(dsp.Box(h=1, w=1.5).label(L"\frac{1}{0.25s+1}").anchor("W"))
d.add(dsp.Line().at(proc3.E).right())
dot = d.add(dsp.Dot(radius=0))
d.push()
d.add(dsp.Arrow().at(dot.center))
d.pop()
d.add(dsp.Line().down().at(dot.center).length(1.5))
d.add(dsp.Arrow().left().length(5))
sensor = d.add(dsp.Box(h=1, w=1.5).label(L"H").anchor("E"))
d.add(dsp.Line().at(sensor.W).tox(comp.S).left())
d.add(dsp.Arrow().up().to(comp.S))
d.draw(show=false)
Por tanto, su ecuación característica es:
Operando se encuentra:
Para dibujar el lugar de las raíces hay que encontrar las raíces de la ecuación anterior para diferentes valores de \(K_c\) y representarlas en el plano complejo.
Empezaremos cargando las librería necesarias y creando las variables que utilizaremos:
using SymPy, Plots
#plotly()
@vars s
t, Kc = symbols("t K_c", real=true)
(t, K_c)
Tal como se indicaba más arriba, la función de lazo abierto es:
Gol_s = Kc*1/(s+1)*1/(.5s+1)*1/(.25s+1)
Las raíces de la ecuación característica en función de \(K_c\), un polinomio de trecer grado tiene solución analítica:
rl = solve(1+Gol_s, s)
Para poder trabajar con la función de una manera más sencilla, vamos a convertirla en una función de Julia:
raiz = lambdify(rl)
#103 (generic function with 1 method)
Comprobamos que funciona calculando las raíces para \(Kc=3\):
raiz(3)
3-element Vector{Number}:
-0.7432742592131494 + 2.2916217498187774im
-0.7432742592131494 - 2.2916217498187774im
-5.513451481573702
Dibujaremos las raíces de la ecuación característica para valores de \(K_c\) entre 0 y 20:
# Definimos los valores de Kc para los que representaremos el lugar
#de las raíces
K = range(0, 20, step=.1)
lreal = []
limag = []
# En este bucle, en primer lugar encontramos las raíces para
# cada valor de Kc
# En el segundo
for k in K
root = raiz(Complex(k))
for i in root
push!(lreal, real(i))
push!(limag, imag(i))
end
end
scatter(lreal, limag, legend=false, xlabel="Re", ylabel="Im")
Dibujar el gráfico del lugar de las raíces no es complicado, pero sí es un poco laborioso. Una opción más simple, es utilizar la biblioteca ControlSystems.jl, que dibujar el lugar de las raíces utilizando métodos numéricos:
using ControlSystems
# Definimos la variable s
s = tf("s")
# Representación del lugar de las raíces para Gol para
# valores de Kc entre 0 y 20
rlocus(1/(s+1)*1/(.5s+1)*1/(.25s+1), K=20)
Pasando el ratón sobre las curvas, se puede leer los valor de la raices y el valor de la ganancia del controlador:

Estudio de estabilidad para los valores de \(K_c\) siguientes: 0.01, 10 y 15
Resolviendo la ecuación característica se puede construir la siguiente tabla:
Show code cell source
using Markdown
Kcs = [0.01, 10, 15]
tabla = "| _Kc_ | raíces\n------|-------"
for kc in Kcs
raices = raiz(kc+0im)
for j in 1:3
if j == 1
kc_print = string(kc)
else
kc_print = ""
end
if real(raices[j]) > 0
negrita = "**"
else
negrita = ""
end
tabla = tabla* "\n| " * kc_print * " | "* negrita * string(round(raices[j], digits=3)) * negrita
end
end
#tabla = tabla * "\""
println(Markdown.parse(tabla))
| *Kc* | raíces |
| ----:| -------------------:|
| 0.01 | -1.959 - 0.0im |
| | -1.028 + 0.0im |
| | -4.013 + 0.0im |
| 10.0 | -0.082 + 3.587im |
| | -0.082 - 3.587im |
| | -6.835 + 0.0im |
| 15.0 | **0.217 + 4.144im** |
| | **0.217 - 4.144im** |
| | -7.433 + 0.0im |
Se comprueba que dos de las raíces para \(K_c = 10\) tienen la parte real positiva.
A partir del gráfico del lugar de las raíces también se podría haber obtenido la tabla anterior.
Margen de ganancia y de fase
Al conocer la ganancia última del controlador proporcional (\(K_u = 11.3\)), el cálculo del margen de ganancia resulta trivial:
Por tanto:
\(K_c\) |
MG |
|---|---|
0.01 |
1130 |
10 |
1.13 |
15 |
0.753 |
También se puede calcular el margen de ganancia mediante análisis de frecuencia. Para ello hay que conocer la razón de amplitudes y el desfase de la función de transferencia de lazo abierto:
En primer lugar hay que encontrar la frecuencia de cruce (\(\varphi_{OL}(\omega_{co}) = - \pi\)). Tras resolver la ecuación se obtiene que \(\omega_{co} = 3.74 \text{ rad/min}\). Sustituyendo en la razón de amplitudes y fijando el límite de estabilidad (\(RA_{OL}(\omega_{co}) = 1\)), se obtiene: