Linearize non-linear system using Matlab/Simulink
Ältere Kommentare anzeigen
I have a non-linear system;

This system corresponds to the following blockdiagram in Simulink;

With
g = 9.81; % gravitational force [m/s^2]
rho = 980; % mass density [kg/m^3]
A = 1; % area [m^2]
K = 0.01; % valve coefficient [-]
A_v = 0.001; % valve cross-sectional area [m^2]
phi_o_0 = 0.001; % initial flow out
m_0 = (phi_o_0 / (K * A_v))^2 * A / g; % initial mass [kg]
I need to linearize this system around the working point m_0. With A_v and phi_i as inputs and phi_o, m, h and p_i as outputs.
This I did easily using just plain Matlab code;
close all;
clear all;
clc;
% model variables (Area = V instead of A).
syms V rho g K;
% state variables
syms phi_i A_v h m p phi_o;
% state vectors
u = [phi_i; A_v];
x = [m];
y = [h; m; p; phi_o];
% non-linear system, dx(t)/dt = f(x,u,t)
F1 = rho * phi_i - rho * K * A_v * sqrt((g / V) * m);
F = [F1];
% non-linear system, y(t) = g(x,u,t)
G2 = m;
G1 = rho * V * G2;
G3 = (g * G2) / V;
G4 = K * A_v * sqrt(G3);
G = [G1; G2; G3; G4];
% compute jacobian
A.symbolic = jacobian(F, x);
B.symbolic = jacobian(F, u);
C.symbolic = jacobian(G, x);
D.symbolic = jacobian(G, u);
% Algebraic value of operating point see ex1a.
m_0 = sym(8966455680130479/8796093022208);
% compute matrices A, B, C, D
A.algebraic = simplify(subs(A.symbolic, {A_v V rho g K m}, ...
[sym(0.01) sym(1) sym(980) sym(9.81) sym(0.01) m_0]));
B.algebraic = simplify(subs(B.symbolic, {A_v V rho g K m}, ...
[sym(0.01) sym(1) sym(980) sym(9.81) sym(0.01) m_0]));
C.algebraic = simplify(subs(C.symbolic, {A_v V rho g K m}, ...
[sym(0.01) sym(1) sym(980) sym(9.81) sym(0.01) m_0]));
D.algebraic = simplify(subs(D.symbolic, {A_v V rho g K m}, ...
[sym(0.01) sym(1) sym(980) sym(9.81) sym(0.01) m_0]));
% compute numerical values
A.eval = eval(A.algebraic);
B.eval = eval(B.algebraic);
C.eval = eval(C.algebraic);
D.eval = eval(D.algebraic);
% linearized system
linsys = ss(A.eval, B.eval, C.eval, D.eval);
However just out of curiousity I also wanted Matlab compute the linearized system, http://www.mathworks.nl/help/slcontrol/ug/linearize.html.
I however miserably fail using the linearize functionality and I am not exactly sure what I am doing wrong. So I was hoping someone can help me to get this fixed.
Currently I have
sys = 'ex1a_model';
load_system(sys);
open_system(sys);
% Inputs
sys_io(1) = linio('ex1a_model/phi_i(t)',1,'in');
sys_io(2) = linio('ex1a_model/A_v',2,'in');
% Outputs
sys_io(3) = linio('ex1a_model/Out m(t)',1,'out');
sys_io(4) = linio('ex1a_model/Out h(t)',2,'out');
sys_io(5) = linio('ex1a_model/Out p_i(t)',3,'out');
sys_io(6) = linio('ex1a_model/Out phi_o(t)',6,'out');
% update linio
setlinio(sys,sys_io);
% Set openloop
sys_io(3).OpenLoop='on';
sys_io(4).OpenLoop='on';
sys_io(5).OpenLoop='on';
sys_io(6).OpenLoop='on';
% Linearize
linsys = linearize(sys,sys_io);
I hope someone can help me with this.
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Linearization finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!