Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Simulink
Simulink
Control Automático
o
Control Automático, 2 GIA
Esta práctica permitirá que el alumno se familiarice con las herramientas disponibles en matlab
para el Control Automático, entre las que están el denominado Control Toolbox y el simulink.
Al mismo tiempo, la práctica servirá para que el alumno realice algunos ensayos relacionados
con funciones de transferencia y respuestas temporales.
Este enunciado incluye cierta cantidad de trabajo previo, que el alumno deberá llevar a cabo
con anterioridad a la sesión de la práctica en el Centro de Cálculo. Dicho estudio previo com-
prende la lectura detallada de las secciones 1 y 2, para la familiarización con los comandos de
matlab y herramientas de simulink que se usarán, ası́ como la realización de los subapartados
denominados Trabajo Previo que pueden encontrarse en las demás secciones.
En esta sección, se asumirá que el alumno está familiarizado con el uso del matlab en general,
para centrar la descripción en el juego de herramientas de que dispone matlab para tareas
relacionadas especı́ficamente con el Control Automático. Dichas herramientas están incluidas
en un complemento de matlab, denominado Control Toolbox.
La primera tarea que se puede plantear es la de definir una función de transferencia en matlab.
Para ello, en primer lugar, ha de recordarse cómo se pueden definir polinomios. Imaginemos que
queremos definir la función de transferencia:
2.5 s + 1
G(s) =
s2+ 3s + 2
Para ello, podemos definir los polinomios numerador y denominador, almacenándolos en sendas
variables a las que denominaremos, respectivamente, N y D:
N = [2.5,1];
D = [1,3,2];
Como puede verse, la forma de definir un polinomio es crear un vector cuyos elementos son
los coeficientes de dicho polinomio, siempre en orden decreciente de potencias de la variable
independiente. Como veremos, a partir de este momento, podemos trabajar con muchas de las
funciones del Control Toolbox, pasándoles como función de transferencia este par de polinomios.
1
Hay que tener ciertas precauciones, cuando alguno de los coeficientes sea nulo. Por ejemplo,
supongamos que la función de transferencia fuera la siguiente:
3
G(s) =
s2
+ 2s
Una forma incorrecta de introducir el polinomio denominador serı́a:
N = 3;
D = [1,2];
N = 3;
D = [1,2,0];
N = [2.5,1];
D = [1,3,2];
G = tf (N,D);
>> G
Transfer function:
2.5 s + 1
-------------
s^2 + 3 s + 2
roots (D)
Esta función devuelve, en general, un vector conteniendo los polos de la función de transferencia.
De forma análoga, los ceros de la función de transferencia vendrán dados por las raı́ces del
numerador.
Si se está trabajando con objetos funciones de transferencia, existe una forma directa de obtener
sus polos y ceros, usando los siguientes comandos:
2
polos = pole (G);
ceros = tzero (G);
La función step() simula la respuesta ante escalón unitario de una función de transferencia. Por
defecto, la escala temporal se elige automáticamente y se asume que el escalón se produce en el
instante cero.
La llamada a esta función lleva asociada la representación en una ventana gráfica de la salida
resultante.
En este caso, al igual que podrı́a haberse hecho en el caso anterior, se ha añadido el comando
grid, que permite visualizar una rejilla sobre el fondo de la gráfica.
Si queremos simular la respuesta para una escala temporal dada por nosotros mismos:
t = [0:0.001:10]’;
step (G, t);
El primer comando genera un vector columna (el operador de trasposición, que transforma lo
que inicialmente serı́a un vector fila en un vector columna, es la comilla simple que aparece a la
derecha del vector definido entre corchetes), conteniendo una secuencia de valores comenzando
en 0 y terminando en 10, con un paso o incremento de 0.001. Esta variable t contendrá nuestro
vector de instantes de tiempo a emplear en la simulación. Para ello, en la llamada a la función
step() se le pasa este vector tiempo como último parámetro.
Si se desea representar dos respuestas escalón en la misma gráfica, con fines comparativos, puede
hacerse del siguiente modo:
G1 = tf (N,D);
G2 = tf (3,[1,2,1]);
t = [0:0.001:10]’;
y1 = step (G1, t);
y2 = step (G2, t);
figure(1); plot(t,y1,t,y2); grid;
Como se ve, la función step() puede devolver un vector conteniendo los valores que resulten
para la señal de salida en cada instante de la simulación. En este caso, dicha función no realiza
3
representación gráfica alguna. El comando plot(), por su parte, permite realizar representaciones
gráficas de dos dimensiones. En este caso particular, se están representando dos señales, las
contenidas en los vectores y1 e y2, frente a la misma escala temporal.
Existen otras funciones para simular la respuesta ante señales de entrada. Por ejemplo, la función
impulse(), simula la respuesta ante impulso unitario a la entrada. La función lsim() permite
la simulación de la respuesta ante cualquier señal de entrada que deseemos. Por ejemplo, si
queremos simular la respuesta ante una rampa de pendiente 3 a la entrada, podrı́amos escribir:
t = [0:0.001:10]’;
rampa = 3*t;
lsim (G, rampa, t);
Tanto la función impulse() como la función lsim() tienen caracterı́sticas similares a la función
step(), en cuanto a que realizan la representación de forma automática, a menos que en la
llamada se almacene el valor devuelto por la función en alguna variable.
Existen funciones para realizar operaciones de álgebra de bloques con funciones de transferencia.
A continuación, se mostrarán algunos ejemplos.
La operación más elemental consiste en obtener una única función de transferencia equivalente
a otras dos que estén dispuestas en serie. Imaginemos definidos los polinomios numerador y
denominador de dos funciones de transferencia, N 1, D1, N 2 y D2. Dado que el resultado de la
operación mencionada serı́a el producto de ambas funciones de transferencia, podemos realizar el
producto de los polinomios numerador por un lado y, por otro, el de los polinomios denominador.
La función que nos permite realizar producto de polinomios es conv():
N1 = [2.5,1];
D1 = [1,3,2];
N2 = 3;
D2 = [1,2,1];
Tras estas operaciones, la función de transferencia dada por el par de polinomios N , D, serı́a la
resultante.
Otra forma de realizar la misma operación, en un sólo paso, es emplear la función series(),
que, a diferencia de la función conv(), sı́ es especı́fica del Control Toolbox y, por tanto, puede
interpretar pares de polinomios como una función de transferencia:
4
Si se recurre a los objetos función de transferencia, todo resulta mucho más intuitivo:
G1 = tf (N1,D1);
G2 = tf (N2,D2);
G = G1*G2;
Como se ve, directamente se puede realizar el producto de dos objetos función de transferencia.
Esto no impide que la función series() pueda seguir siendo usada con este tipo de objetos:
donde el último parámetro indica que se trata de realimentación negativa (1 serı́a realimentación
positiva). Si hacemos uso de objetos función de transferencia, tenemos que recurrir a la función
feedback():
5
2 Introducción al simulink
Para arrancar el simulink, basta teclear simulink en la ventana de comandos de matlab. Con
ello, se abrirá la llamada biblioteca de bloques de simulink, de la que podremos tomar todos los
elementos que necesitemos para nuestras simulaciones. La figura 1 muestra el aspecto de esta
ventana.
Para comenzar a usar simulink es preciso abrir un nuevo diagrama. Para ello, se puede pulsar
sobre el icono de la hoja en blanco que aparece en la ventana de herramientas mostrada, o
bien a través del menú File→New→Model. Con ello, aparecerá una nueva ventana en la que
se confeccionará el modelo del sistema dinámico que se quiere simular. Esta ventana recibe el
nombre de ventana del modelo o ventana del diagrama del modelo.
6
2.1 Integradores
Los integradores nos permiten modelar sistemas dinámicos lineales y no lineales descritos median-
te un modelo en ecuaciones diferenciales. El hecho de que los sistemas sean representados me-
diante ecuaciones diferenciales implica que será necesario integrar dichas ecuaciones para poder
simular cuál será la evolución temporal del sistema. simulink ofrece una herramienta de in-
tegración numérica que incluye varios métodos de integración. Esto permite integrar señales
temporales, independientemente de que el sistema sea lineal o no.
Para integrar directamente señales temporales, simulink incluye un bloque llamado “integrador”
(Integrator), el cual puede obtenerse de la biblioteca de elementos de tiempo continuo (Contin-
uous). Este
∫
componente proporciona una salida y igual a la integración temporal de su entrada
u (y(t) = 0t u(τ )dτ ).
En la figura 2, se propone un pequeño modelo para ilustrar cómo funciona el bloque integrador.
Se introduce a su entrada un escalón y se observa que la salida del integrador será una rampa.
1
s
Mux Scope
Step
Integrator
La señal de entrada del integrador proviene en este ejemplo de un bloque escalón (Step) sacado
de la biblioteca de fuentes (Sources). La salida del bloque integrador se reúne con la entrada en
el bloque multiplexor (Mux, del apartado Signal Routing de la biblioteca), para que ambas sean
mostradas en la gráfica dibujada con el bloque visor (Scope, del apartado Sinks). En la figura
3, puede verse el resultado de la simulación visto a través del visor.
7
2.2 Funciones de transferencia
Para utilizar funciones de transferencia dentro de simulink, basta con incluir un bloque Transfer
Function del apartado de tiempo continuo (Continuous) de la biblioteca, tal y como se presenta
en la figura 4.
s+2
s2 +s+3 Scope
Step Mux
Transfer Fcn
El resultado de la simulación del diagrama anterior puede visualizarse a través del visor (figura
6).
8
Figure 6: Respuesta resultante de la simulación del diagrama previo.
Sum
s+2
K
s2 +s+3 Scope
Step Gain Transfer Function
Un sumador o restador se implementa mediante un bloque Add ó Sum del apartado de Math
Operations de la biblioteca. Por su parte, una ganancia se implementa mediante el bloque de
forma triangular que aparece en el diagrama, obtenido a partir de un bloque Gain del apartado
Math Operations. Fı́jese que el valor introducido como ganancia no es una constante, sino una
variable de nombre K.
Para que la simulación del modelo pueda llevarse a cabo, será necesario que previamente se haya
definido dicha variable desde matlab. Esto ilustra las posibilidades de interacción entre matlab
y simulink: variables definidas en el espacio de trabajo de matlab pueden ser usadas desde
simulink, ası́ como variables que tomen valores como resultado de la simulación de un diagrama
de simulink estarán disponibles para su uso desde la ventana de comandos de matlab, como
se verá a continuación.
En el otro extremo, tenemos elementos que son “sumideros” de señales, es decir, que sólo reciben
señales, sin producir ninguna salida. Estos elementos se encuentran en el apartado Sinks. Entre
estos elementos, encontramos los visores, como el Scope ya empleado. Otro elemento interesante
9
de este grupo es el denominado To Workspace. Se trata de un bloque que almacena, en una
variable cuyo nombre debemos especificar, un vector conteniendo los valores que va tomando la
señal que se recibe como entrada del bloque, para cada instante de simulación.
tSim
Clock To Workspace2
r
To Workspace1
Sum
s+2
K y
s2 +s+3
Step To Workspace
Gain Transfer Function
Figure 8: Diagrama de bloques para ilustrar el uso de los bloques Clock y To Workspace.
En principio, se recomienda configurar los parámetros de los elementos To Workspace tal y como
se muestra en la figura 9, en particular con el formato de almacenamiento de tipo Array. La
justificación está en la simplicidad que eso aporta, a posteriori, para la manipulación de estas
variables desde matlab.
Una vez realizada la simulación, dispondremos de las variables tSim, r e y, con las que podremos
realizar una representación gráfica a voluntad, usando el comando plot() ya conocido:
10
3 Trabajo a desarrollar en relación con el Control Toolbox de
matlab
En esta parte de la práctica, se parte directamente de una función de transferencia dada por la
expresión siguiente:
K (s + c)
G1 (s) = (1)
(s + p) (s2 + 2 δ wn s + wn2 )
Se trata de una función de transferencia que será estable, con un polo real, que resultará ser
el elemento más dominante respecto a los demás, un cero que será de fase mı́nima1 y un par
de polos complejos conjugados, que serán menos dominantes que los demás elementos (si bien,
ninguno de los factores citados será totalmente despreciable frente a los demás).
Cada alumno elegirá los valores numéricos de los parámetros, a partir de las siguientes relaciones:
135 + 15 D8
K =
90
45 + 7 D7
p =
90
207 + 12 D6
c =
90
45 + 2 D5
δ =
90
wn = 6 p
Siendo D8 el dı́gito menos significativo del DNI, D7 el anterior y ası́ sucesivamente. Por ejemplo,
para el DNI número: 53568447, se tendrı́a D8 = 7, D7 = 4, D6 = 4, D5 = 8, con lo que
resultarı́an los siguientes valores de los parámetros:
En primer lugar, se desea obtener una función de transferencia de orden reducido, que aproxime
el comportamiento del sistema de partida.
1
Un cero de fase mı́nima es aquél que se encuentra en el semiplano izquierdo del plano complejo; dicho de otra
forma, aquél cuya parte real es negativa.
11
Si se simula la respuesta ante escalón del sistema dado, puede comprobarse que se puede identi-
ficar fácilmente una única constante de tiempo dominante y aproximar al sistema por un modelo
de primer orden, de la forma:
K̃
G1 (s) ≈ (2)
1 + τ̃ s
A partir de la representación gráfica de la respuesta ante escalón del sistema, pueden estimarse
los dos parámetros requeridos en (2). Como es sabido, para un sistema que sea verdaderamente
de primer orden, la identificación de la constante de tiempo puede realizarse con exactitud de
varias formas: una de ellas se basa en que: y(τ̃ ) = y(0) + 0.63 (y(∞) − y(0)). Otra forma se
basa en que el 95% del valor final se alcanza una vez transcurrido un tiempo equivalente a tres
veces la constante de tiempo de dicho sistema: y(3 τ̃ ) = y(0) + 0.95 (y(∞) − y(0)). De acuerdo
con lo anterior, se definen: t63% = τ̃ y te95% = 3 τ̃ .
• Simule la respuesta ante escalón del sistema original (1). A la vista de esa respuesta,
identifique empı́ricamente los parámetros de la función de transferencia aproximada (2):
ganancia estática K̃ [p1], y constante de tiempo τ̃ [p2](estimada a partir de la regla
t63% = τ̃ ).
• Compare la respuesta ante escalón unitario del sistema original y del reducido. Para
realizar esta comparación de forma gráfica, puede recurrirse a los comandos de matlab
vistos anteriormente. Mida el valor de la respuesta del sistema original (1), transcurrido
un intervalo de tiempo en segundos igual al doble de la constante de tiempo después de
producirse el escalón de entrada, y(2 τ̃ ) [p3], y análogamente para el sistema aproximado
(2) en ese mismo instante, yaprox (2 τ̃ ) [p4].
Nota: Si está utilizando el comando step() sugerido anteriormente, tenga en cuenta que
puede conseguirse un paso de simulación tan pequeño como se quiera, proporcionando a
dicha función un vector tiempo con el paso o incremento correspondiente.
• Habida cuenta de que, dependiendo del modelo concreto, puede obtenerse una mejor
aproximación estimando la constante de tiempo mediante la regla te95% = 3 τ̃ , se pide
realizar esta estimación alternativa de la constante de tiempo, a la que se llamará τ̃2 [p5].
• Con objeto de poder hacer la comparación con el nuevo modelo aproximado resultante del
punto anterior, indique el valor de la respuesta del sistema original (1), transcurrido un
intervalo igual a la nueva constante de tiempo, después de producirse el escalón de entrada,
y(τ̃2 ) [p6]. Análogamente para el nuevo sistema aproximado yaprox2 (τ̃2 ) [p7].
En este apartado, se trabajará con una función de transferencia similar a la dada en (1), con
la diferencia de que los polos complejos conjugados se harán más significativos. Para ello, se
modifica el valor original de los parámetros δ y wn :
12
K (s + c)
G2 (s) = ; δ2 = δ − 0.2 ; wn2 = wn /6 = p (3)
(s + p) (s2 + 2 δ2 wn2 s + wn2 2 )
Se desea obtener una función de transferencia de segundo orden, que aproxime el comportamiento
del sistema de partida dado.
Simulando la respuesta ante escalón del sistema dado, puede comprobarse que, efectivamente,
dicha respuesta se puede aproximar mediante una función de transferencia de segundo orden
subamortiguada, de la forma:
K̃ w̃n2
G2 (s) ≈ (4)
s2 + 2 δ̃ w̃n s + w̃n2
√−δ̃ π
˜ = e
SO 1−δ̃ 2
π
t̃p = √ (5)
w̃n 1 − δ̃ 2
• Simule la respuesta ante escalón del sistema original (3). A la vista de esa respuesta,
identifique empı́ricamente los parámetros de la función de transferencia aproximada (4):
ganancia estática K̃ [p8], coeficiente de amortiguamiento δ̃ [p9], y frecuencia natural no
amortiguada w̃n [p10].
Nota: Tal y como se ha dicho anteriormente, debe emplearse la expresión (5) para la
estimación de w̃n .
• Compare la respuesta ante escalón unitario del sistema original y del reducido. Mida el
valor de la respuesta del sistema original (3), transcurrido un intervalo igual al tiempo de
subida, después de producirse el escalón de entrada, y(t̃s ) [p11]. Análogamente para el
sistema aproximado (4) en ese mismo instante, yaprox (t̃s ) [p12].
Nota: Emplee la siguiente expresión para obtener el valor del tiempo de subida en el que
tomar las medidas:
π − arccos(δ̃)
t̃s = √
w̃n 1 − δ̃ 2
13
4 Trabajo a desarrollar en relación con simulink
Los parámetros del modelo se obtienen a partir del DNI de cada alumno, según las siguientes
expresiones:
18 + 8 D8
Km = [N · m/V ]
90
225 + 15 D7 [ ]
I = Kg · m2
90
45 + 15 D6 [ ]
b = Kg · m2 /s
9
Donde D6 , D7 y D8 son las tres últimas cifras del DNI. Por ejemplo, para el DNI número:
53568447, se tendrı́a D8 = 7, D7 = 4, D6 = 4, con lo que resultarı́an los siguientes valores
de los parámetros: Km = 0.82222, I = 3.16667 y b = 11.66667 2 .
Dado que este sistema es lineal, suponiendo condiciones iniciales nulas, puede obtenerse su
función de transferencia de forma inmediata, resultando Gv (s) para la salida en velocidad y
2
A diferencia de lo que ocurre con los demás parámetros, el denominador de la expresión que define el parámetro
b es 9, en lugar de 90.
14
Gp (s) para la salida en posición:
K 1 K
Gv (s) = ; Gp (s) = Gv (s) = (7)
1+τs s s (1 + τ s)
Pueden calcularse de forma directa los parámetros K y τ de las expresiones anteriores, a partir
de los parámetros del modelo (6). Una vez hecho esto, una forma equivalente de modelar el
motor, a través de su función de transferencia, serı́a mediante un único bloque de simulink,
como se muestra en la figura 11.
u K velAng 1 ang
tau .s+1 s
Scope
Desde el punto de vista práctico, la única diferencia entre el modelo representado en la figura
10 y el mostrado en la figura 11 es que, en el primero de ellos, se puede simular la evolución
del sistema ante condiciones iniciales no nulas para velocidad y que existen señales intermedias
directamente accesibles, como la aceleración angular, θ̈, o el par de fricción, b θ̇.
• Implemente el diagrama de bloques mostrado en la figura 10, pero haciendo que entre
también en el visor la velocidad angular 3 . Configure una condición inicial no nula, θ(t =
0) = 0.2 [rad], para la salida en posición, a través de las propiedades del integrador
correspondiente. Mantenga, sin embargo, condición inicial nula para la velocidad angular,
θ̇(t = 0) = 0 [rad/s].
Nota: De cara al siguiente punto, tenga precaución para no pasar por alto el instante en
el que se produce el escalón, dado que, por defecto, no es cero.
• Simule la respuesta del sistema ante una entrada de tipo escalón: u(t) = 4V . Tome nota
de los valores θ(t) [p13] y θ̇(t) [p14], 0.3 segundos después de producirse dicho escalón.
Nota: En algunos casos, si se observa que las curvas de respuesta tienen pocos puntos,
significa que la simulación puede requerir un paso de integración máximo más reducido.
Esto puede dar lugar a medidas imprecisas, a partir de las representaciones gráficas de las
señales de interés. El parámetro que controla este paso de integración puede establecerse
en (Menu→Simulation→Configuration Parameters→Max. step size) del método numérico
de integración de simulink (ver figura 12). Por defecto, el valor de este parámetro suele
ser auto, pero puede modificarse este valor a voluntad, para forzar a que el número de
puntos en los que se lleva a cabo la simulación se incremente sustancialmente.
Si, como consecuencia de lo anterior, el número de puntos a registrar durante una simu-
lación aumenta considerablemente, y la simulación dura el tiempo suficiente, puede ser
necesario tener en cuenta un detalle adicional, en relación con los elementos Scope, en caso
3
A través de las propiedades del multiplexor, puede configurar libremente el número de entradas del mismo.
15
Figure 12: Opción para cambiar el paso máximo de integración de simulink.
de que éstos se estén usando. Estos visores, poseen un buffer para el registro de las variables
que se reciben como entrada, el cual puede verse desbordado. Esto llevarı́a a la pérdida del
registro de la primera parte del experimento. Por defecto, los bloques Scope sólo mantienen
el registro de los últimos 5000 puntos de una simulación. Este problema puede solventarse
de forma inmediata, accediendo a las propiedades del Scope y desactivando, en la pestaña
Data History, la limitación del buffer, tal y como se muestra en la figura 13.
Figure 13: Opción para desactivar la limitación del buffer del Scope.
16
4.2 Motor en realimentación
A partir de la función de transferencia del motor, resulta muy cómodo establecer una configu-
ración en realimentación, añadiendo una ganancia ajustable en la cadena directa, como se mues-
tra en la figura 14. Como puede apreciarse, en este caso, se ha usado directamente la función
de transferencia de salida en posición, siendo ésta la señal que se realimenta.
r e u K ang
Kc
tau .s2 +s Scope
Debe tenerse en cuenta que la señal de tipo escalón es, en este caso, de naturaleza distinta a la
que tenı́a en los diagramas en bucle abierto, figuras 10 y 11. En los casos anteriores, al estar el
sistema en bucle abierto, el escalón se usaba para proporcionar directamente la señal de entrada
al sistema o actuación, u(t). Sin embargo, en el esquema realimentado, la señal proporcionada
por el escalón será una señal de referencia, r(t), que debe ser comparada con la salida y, por
tanto, debe ser una señal de la misma naturaleza que ésta; es decir, se trata de una referencia
para el ángulo de salida del motor. Por otro lado, como puede comprobarse, se ha añadido una
ganancia ajustable que, a partir del error observado en el ángulo de salida respecto a la referencia
fijada, e(t), proporciona una actuación directamente proporcional a dicho error: u(t) = Kc e(t).
Si se realiza la reducción del diagrama de bloques, para un valor genérico de ganancia Kc , puede
comprobarse que la función de transferencia equivalente al conjunto es una de segundo orden, que
puede hacerse corresponder con la forma tı́pica de sistema de segundo orden subamortiguado:
Kbc wn2 bc
Gbc = (8)
s2 + 2 δbc wnbc s + wn2 bc
17
5 Instrucciones para entregar las respuestas en Goodle
Las respuestas del módulo entregarán en Goodle. La página web del servidor de docencia es:
http://bono.us.es/sdocencia
Para entregar el proyecto hay que darse de alta en Goodle siguiendo las instrucciones de la guı́a
que puede encontrarse en el entorno de Enseñanza Virtual (apartado Contenido del Curso /
Tutoriales / Guı́a de Goodle GMS). La entrega de los resultados consiste en rellenar el formulario
de texto siguiendo las siguientes instrucciones:
• Para cada respuesta hay que escribir una lı́nea con el siguiente formato:
nombre = valor;
p2 = 0.3;
• En caso de que hubiera que dar una respuesta que correspondiera a un polinomio (por
ejemplo, el denominador de una función de transferencia), hay que utilizar el formato
explicado al principio para introducir polinomios en matlab en la Sección 1.1. En caso
de que alguno de los polinomios fuera una constante, los corchetes deben obviarse. Por
ejemplo, para indicar:
7
Gbc(s) = 2
3s + 0.45
habrı́a que escribir las siguientes lı́neas:
p14 = 7;
p15 = [3, 0, 0.45];
• Si desconoce alguno de los datos solicitados, evite dar respuestas que provoquen error de
sintaxis, como las siguientes:
18
p5 = ;
p6 =
p5 = 0;
p6 = 0;
p1 = 3;
p2 = 4.3;
p3 = 0.65;
p4 = 23.4;
p5 = 34;
p6 = -4;
p7 = 76.5;
p8 = 12;
p9 = 1;
p10 = 9;
p11 = 43;
p12 = 3.1;
p13 = 5.2;
p14 = 2.4;
p15 = 29.5;
p16 = 0.0005;
p17 = -92.4;
p18 = 2.84;
p19 = 4.17;
19