www.gusucode.com > control_featured 案例源码程序 matlab代码 > control_featured/NDDRootSensitivity.m
%% Sensitivity of Multiple Roots % This example shows that high-multiplicity poles have high numerical % sensitivity and can shift by significant amounts when switching model % representation. % Copyright 1986-2012 The MathWorks, Inc. %% Example % Poles with high multiplicity and clusters of nearby poles can be very % sensitive to rounding errors, which can sometimes have dramatic consequences. % This example uses a 15th-order discrete-time % state-space model |Hss| with a cluster of stable poles near |z=1|: load numdemo Hss %% % Convert the model to transfer function using |tf|: Htf = tf(Hss); %% Response Comparison % Compare the step responses of |Hss| and |Htf| to see how pole sensitivity % can affect the stability of the model and cause large variations in the % computed time and frequency responses: step(Hss,'b',Htf,'r',20) legend('Hss','Htf') %% % The step response of |Htf| diverges even though the state-space model % |Hss| is stable (all its poles lie in the unit circle). The Bode plot % also shows a large discrepancy between the state-space and transfer % function models: bode(Hss,'b',Htf,'r--') legend('Hss','Htf') %% % The algorithm used to convert from state space to transfer % function is not causing this discrepancy. If you convert from state space to % zero-pole-gain, the first step in any SS to TF conversion, the % discrepancies disappear: Hzpk = zpk(Hss); step(Hss,'b',Hzpk,'r--') legend('Hss','Hzpk') %% bode(Hss,'b',Hzpk,'r--') %% % This analysis shows that discrepancies arise in the ZPK to TF conversion, which % merely involves computing a polynomial from its roots. %% Cause of Discrepancy % To understand the cause of these large discrepancies, compare the pole/zero % maps of the state-space model and its transfer function: pzplot(Hss,'b',Htf,'r') legend('Hss','Htf') %% % Note the tightly packed cluster of poles near z=1 in |Hss|. When these % poles are recombined into the transfer function denominator, roundoff % errors perturb the pole cluster into an evenly-distributed ring of poles % around z=1 (a typical pattern for perturbed multiple roots). % Unfortunately, some perturbed poles cross the unit circle and make % the transfer function unstable. Zoom in on the plot to see these poles: pzplot(Hss,'b',Htf,'r'); axis([0.5 1.5 -.4 .4]) %% % You can confirm this explanation with a simple experiment. Construct a % polynomial whose roots are the poles |R1| of |Hss|, compute the roots % of this polynomial, and compare these roots with |R1|: R1 = pole(Hss); % poles of Hss Den = poly(R1); % polynomial with roots R1 R2 = roots(Den); % roots of this polynomial plot(real(R1),imag(R1),'bx',real(R2),imag(R2),'r*') legend('R1','roots(poly(R1))'); %% % This plot shows that |ROOTS(POLY(R1))| is quite different from |R1| because % of the clustered roots. As a result, the roots of the transfer function % denominator differ significantly from the poles of the original state-space % model |Hss|. % % In conclusion, you should avoid converting state-space or zero-pole-gain models to transfer % function form because this process can incur significant loss of accuracy.