robust vibration control in flexible beam -凯发k8网页登录
this example shows how to robustly tune a controller for reducing vibrations in a flexible beam. this example is adapted from "control system design" by g. goodwin, s. graebe, and m. salgado.
uncertain model of flexible beam
figure 1 depicts an active vibration control system for a flexible beam.
figure 1: active control of flexible beam
in this setup, a sensor measures the tip position and the actuator is a piezoelectric patch delivering a force . we can model the transfer function from control input to tip position using finite-element analysis. keeping only the first six modes, we obtain a plant model of the form
with the following nominal values for the amplitudes and natural frequencies :
the damping factors are often poorly known and are assumed to range between 0.0002 and 0.02. similarly, the natural frequencies are only approximately known and we assume 20% uncertainty on their location. to construct an uncertain model of the flexible beam, use the ureal
object to specify the uncertainty range for the damping and natural frequencies. to simplify, we assume that all modes have the same damping factor .
% damping factor zeta = ureal('zeta',0.002,'range',[0.0002,0.02]); % natural frequencies w1 = ureal('w1',18.95,'percent',20); w2 = ureal('w2',118.76,'percent',20); w3 = ureal('w3',332.54,'percent',20); w4 = ureal('w4',651.66,'percent',20); w5 = ureal('w5',1077.2,'percent',20); w6 = ureal('w6',1609.2,'percent',20);
next combine these uncertain coefficients into the expression for .
alpha = [9.72e-4 0.0122 0.0012 -0.0583 -0.0013 0.1199]; g = tf(alpha(1),[1 2*zeta*w1 w1^2]) tf(alpha(2),[1 2*zeta*w2 w2^2]) ... tf(alpha(3),[1 2*zeta*w3 w3^2]) tf(alpha(4),[1 2*zeta*w4 w4^2]) ... tf(alpha(5),[1 2*zeta*w5 w5^2]) tf(alpha(6),[1 2*zeta*w6 w6^2]); g.inputname = 'ug'; g.outputname = 'y';
visualize the impact of uncertainty on the transfer function from to . the bode
function automatically shows the responses for 20 randomly selected values of the uncertain parameters.
rng(0), bode(g,{1e0,1e4}), grid
title('uncertain beam model')
robust lqg control
lqg control is a natural formulation for active vibration control. with systune
, you are not limited to a full-order optimal lqg controller and can tune controllers of any order. here, for example, let's tune a 6th-order state-space controller (half the plant order).
c = tunabless('c',6,1,1);
the lqg control setup is depicted in figure 2. the signals and are the process and measurement noise, respectively.
figure 2: lqg control structure
build a closed-loop model of the block diagram in figure 2.
c.inputname = 'yn'; c.outputname = 'u'; s1 = sumblk('yn = y n'); s2 = sumblk('ug = u d'); cl0 = connect(g,c,s1,s2,{'d','n'},{'y','u'});
note that cl0
depends on both the tunable controller c
and the uncertain damping and natural frequencies.
cl0
generalized continuous-time state-space model with 2 outputs, 2 inputs, 18 states, and the following blocks: c: tunable 1x1 state-space model, 6 states, 1 occurrences. w1: uncertain real, nominal = 18.9, variability = [-20,20]%, 3 occurrences w2: uncertain real, nominal = 119, variability = [-20,20]%, 3 occurrences w3: uncertain real, nominal = 333, variability = [-20,20]%, 3 occurrences w4: uncertain real, nominal = 652, variability = [-20,20]%, 3 occurrences w5: uncertain real, nominal = 1.08e 03, variability = [-20,20]%, 3 occurrences w6: uncertain real, nominal = 1.61e 03, variability = [-20,20]%, 3 occurrences zeta: uncertain real, nominal = 0.002, range = [0.0002,0.02], 6 occurrences type "ss(cl0)" to see the current value and "cl0.blocks" to interact with the blocks.
use an lqg criterion as control objective. this tuning goal lets you specify the noise covariances and the weights on the performance variables.
r = tuninggoal.lqg({'d','n'},{'y','u'},diag([1,1e-10]),diag([1 1e-12]));
now tune the controller c
to minimize the lqg cost over the entire uncertainty range.
[cl,fsoft,~,info] = systune(cl0,r);
soft: [5.41e-05,0.000106], hard: [-inf,-inf], iterations = 156 soft: [6.7e-05,inf], hard: [-inf,inf], iterations = 72 soft: [6.96e-05,7.39e-05], hard: [-inf,-inf], iterations = 52 soft: [7.21e-05,7.21e-05], hard: [-inf,-inf], iterations = 30 final: soft = 7.21e-05, hard = -inf, iterations = 310
validation
compare the open- and closed-loop bode responses from to for 20 randomly chosen values of the uncertain parameters. note how the controller clips the first three peaks in the bode response.
tdy = getiotransfer(cl,'d','y'); bode(g,tdy,{1e0,1e4}) title('transfer from disturbance to tip position') legend('open loop','closed loop')
next plot the open- and closed-loop responses to an impulse disturbance . for readability, the open-loop response is plotted only for the nominal plant.
impulse(getnominal(g),tdy,5) title('response to impulse disturbance d') legend('open loop','closed loop')
finally, systune
also provides insight into the worst-case combinations of damping and natural frequency values. this information is available in the output argument info
.
wcu = info.wcpert
wcu=3×1 struct array with fields:
w1
w2
w3
w4
w5
w6
zeta
use this data to plot the impulse response for the two worst-case scenarios.
impulse(usubs(tdy,wcu),5)
title('worst-case response to impulse disturbance d')