📄 jetdemo.m
字号:
echo on
% This file demonstrates MATLAB's ability for classical control system
% design by going through the design of a YAW DAMPER for a Jet Transport
% aircraft.
echo off
% Copyright (c) 1986-93 by the MathWorks, Inc.
echo on
pause % Press any key to continue ...
% Define Jet Transport model MACH=0.8 H=40,000ft
A=[-.0558 -.9968 .0802 .0415
.598 -.115 -.0318 0
-3.05 .388 -.4650 0
0 0.0805 1 0];
B=[.0729 .0001
-4.75 1.23
1.53 10.63
0 0];
C=[0 1 0 0
0 0 0 1];
D=[0 0
0 0];
states='beta yaw roll phi';
inputs='rudder aileron';
outputs='yaw-rate bank-angle';
printsys(A,B,C,D,inputs,outputs,states)
% These are the state space matrices for a Jet Transport during cruise flight.
% The model has two inputs and two outputs. The units are radians for beta
% (sideslip angle) and phi (bank angle) and radians/sec for yaw (yaw rate) and
% roll (roll rate). The rudder and aileron deflections are in degrees.
pause % Press any key to continue ...
% This model has one set of eigenvalues that are lightly damped. They
% correspond to what is called the Dutch Roll Mode. We need to design
% a compensator that increases the damping of these poles.
disp('Open Loop Eigenvalues'), damp(A);
subplot(111)
pzmap(A,[],[],[]); pause % Press any key after plot ...
% Our design criteria is to provide damping ratio, zeta > 0.35, with natural
% frequency Wn < 1.0 rad/sec. We want to design the compensator using
% classical methods.
% Let's do some open loop analysis to determine possible control strategies.
% Time response (we could use STEP or IMPULSE here)
impulse(A,B,C,D); pause % Press any key after plot ...
% The time responses show that the system is indeed lightly damped. But the
% time frame is much to long. Let's look at the response over a smaller
% time frame. Define the time vector T before invoking IMPULSE.
T = 0:0.2:20; % Define time vector from 0 to 20 secs in steps of 0.2
pause % Press any key to continue ...
% Plot responses as separate graphs
%subplot(221), impulse(A,B,C(1,:),D(1,:),1,T); title('Input 1 Output 1')
%subplot(222), impulse(A,B,C(2,:),D(2,:),1,T); title('Input 1 Output 2')
%subplot(223), impulse(A,B,C(1,:),D(1,:),2,T); title('Input 2 Output 1')
%subplot(224), impulse(A,B,C(2,:),D(2,:),2,T); title('Input 2 Output 2')
%pause % Press any key after plot ...
echo off
subplot(221), impulse(A,B,C(1,:),D(1,:),1,T); title('Input 1 Output 1')
subplot(222), impulse(A,B,C(2,:),D(2,:),1,T); title('Input 1 Output 2')
subplot(223), impulse(A,B,C(1,:),D(1,:),2,T); title('Input 2 Output 1')
subplot(224), impulse(A,B,C(2,:),D(2,:),2,T); title('Input 2 Output 2')
pause
echo on
% Look at the plot from aileron (input 2) to bank_angle (output 2). The
% aircraft is oscillating around a non-zero bank angle. Thus the aircraft
% turns in response to an aileron impulse. This behavior will be important
% later.
pause % Press any key to continue ...
% Typically yaw dampers are designed using yaw-rate as the sensed output
% and rudder as the input. Let's look at that frequency response.
bode(A,B,C(1,:),D(1,:),1);pause % Press any key after plot ...
% From this frequency responses we see that the rudder has much effect around
% the lightly damped Dutch roll mode (at 1 rad/sec).
% To make the design easier, extract of the subsystem from rudder to yaw_rate.
[a,b,c,d] = ssselect(A,B,C,D,1,1); % Extract system with input 1 and output 1
% Let's do some designs. The simplest compensator is a gain. We can determine
% values for this gain using the root locus
clg
rlocus(a,b,c,d); pause % Press any key after plot ...
% Oops, looks like we need positive feedback.
rlocus(a,b,-c,-d); sgrid, pause % Press any key after plot ...
% That looks better. So using just simple feedback we can achieve a
% damping ratio of zeta=0.45.
% Now its your turn, Use RLOCFIND to select the point on the root locus
% with maximum damping.
pause % Press any key and then select point on the plot ...
[k,poles] = rlocfind(a,b,-c,-d);
disp(['You chose gain: ',num2str(k)]), damp(esort(poles));
pause % Press any key to continue ...
% Let's form the closed loop system so that we can analyze the design.
[ac,bc,cc,dc] = feedback(a,b,c,d,[],[],[],-k);
% These eigenvalues should match the ones you chose.
disp('Closed loop eigenvalues'), damp(ac);
% Time response using our time vector T
impulse(ac,bc,cc,dc,1,T); pause % Press any key after plot ...
% So the response looks pretty good. Let's close the loop on the original
% model and see how the response from the aileron looks. Feedback using
% input 1 and output 1 of plant.
% Feedback with selection vectors assumes positive feedback
[Ac,Bc,Cc,Dc] = feedback(A,B,C,D,[],[],[],k,[1],[1]);
disp('Closed loop eigenvalues'), damp(Ac);
% Time response
%subplot(221), impulse(Ac,Bc,Cc(1,:),Dc(1,:),1,T); title('Input 1 Output 1')
%subplot(222), impulse(Ac,Bc,Cc(2,:),Dc(2,:),1,T); title('Input 1 Output 2')
%subplot(223), impulse(Ac,Bc,Cc(1,:),Dc(1,:),2,T); title('Input 2 Output 1')
%subplot(224), impulse(Ac,Bc,Cc(2,:),Dc(2,:),2,T); title('Input 2 Output 2')
%pause % Press any key after plot ...
echo off
subplot(221), impulse(Ac,Bc,Cc(1,:),Dc(1,:),1,T); title('Input 1 Output 1')
subplot(222), impulse(Ac,Bc,Cc(2,:),Dc(2,:),1,T); title('Input 1 Output 2')
subplot(223), impulse(Ac,Bc,Cc(1,:),Dc(1,:),2,T); title('Input 2 Output 1')
subplot(224), impulse(Ac,Bc,Cc(2,:),Dc(2,:),2,T); title('Input 2 Output 2')
pause
echo on
% Look at the plot from aileron (input 2) to bank_angle (output 2). When
% we move the aileron the system no longer continues to bank like a normal
% aircraft. We have over-stabilized the spiral mode. The spiral mode is
% typically a very slow mode and allows the aircraft to bank and turn without
% constant aileron input. Pilots are used to this behavior and will not like
% our design if it doesn't allow them to fly normally. Our design has moved
% the spiral mode so that it has a faster frequency.
pause % Press any key to continue ...
% What we need to do is make sure the spiral mode doesn't move farther into
% the left half plane when we close the loop. One way flight control designers
% have fixed this problem is to use a washout filter, i.e.
% Ks
% H(s) = --------
% (s + a)
% Choosing a = 0.333 for a time constant of 3 seconds, form the washout
[aw,bw,cw,dw] = zp2ss([0],[-.333],1);
% Connect the washout in series with our design model
[a,b,c,d] = series(a,b,c,d,aw,bw,cw,dw);
% Do another root locus
clg
rlocus(a,b,-c,-d); sgrid, pause % Press any key after plot
% Now the maximum damping is zeta = 0.25 Using RLOCFIND chose the gain for
% maximum damping:
pause % Press any key and then select point on plot ...
[k,poles] = rlocfind(a,b,-c,-d);
disp(['You chose gain: ',num2str(k)]), damp(esort(poles));
% Look at the closed loop response
[ac,bc,cc,dc] = feedback(a,b,c,d,[],[],[],-k);
impulse(ac,bc,cc,dc,1,T); pause % Press any key to continue ...
% Now form the controller (washout + gain)
[aw,bw,cw,dw] = series(aw,bw,cw,dw,[],[],[],k);
% Close the loop with the original model
[Ac,Bc,Cc,Dc] = feedback(A,B,C,D,aw,bw,cw,dw,[1],[1]);
% Final closed-loop response
%subplot(221), impulse(Ac,Bc,Cc(1,:),Dc(1,:),1,T); title('Input 1 Output 1')
%subplot(222), impulse(Ac,Bc,Cc(2,:),Dc(2,:),1,T); title('Input 1 Output 2')
%subplot(223), impulse(Ac,Bc,Cc(1,:),Dc(1,:),2,T); title('Input 2 Output 1')
%subplot(224), impulse(Ac,Bc,Cc(2,:),Dc(2,:),2,T); title('Input 2 Output 2')
%pause % Press any key after plot
echo off
subplot(221), impulse(Ac,Bc,Cc(1,:),Dc(1,:),1,T); title('Input 1 Output 1')
subplot(222), impulse(Ac,Bc,Cc(2,:),Dc(2,:),1,T); title('Input 1 Output 2')
subplot(223), impulse(Ac,Bc,Cc(1,:),Dc(1,:),2,T); title('Input 2 Output 1')
subplot(224), impulse(Ac,Bc,Cc(2,:),Dc(2,:),2,T); title('Input 2 Output 2')
pause % Press any key to continue ...
echo on
% Although we didn't quite meet the criteria, our design increased the damping
% of the system substantially and the design does allow the pilots to fly the
% aircraft normally.
echo off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -