⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculate_hinfinity_domain_analytical.m

📁 构建PID控制器
💻 M
字号:
%% 绘制H∞范数约束边界:通过绘制曲线族(参数方程)的判别曲线,包括包络线和奇点轨迹线,来求解
%% 范数约束边界线

clear all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                      Define the system
% N1=[1];a=0.5;
% D1=conv(conv(conv(conv([1 1],[a 1]),[a^2 1]),[a^3 1]),[[a^4 1]]);
N1=[-1.5 1];
D1=[1 3 3 1];

a=0.3;
N1=[1];
D1=conv(conv(conv([1 1],[a 1]),[a^2 1]),[a^3 1]);

L=0.; % the system delay
tao=0; % PID controller filter constant
pade_order=0; % pade approximation oder
[num_L,den_L]=pade(L,pade_order);
N=conv(N1,num_L);
D=[conv(conv(D1,den_L),[tao,1])];
if pade_order~=0
    L=0;
end

flag=3;
linewidth=1;
gama_KD=0.0; % for a fixed kd values
gama=1.3;
sita=0:0.1:2*pi;
v=0.01:0.1:2*pi;
v=v;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   define the syms: w=frequency, r=gama and t=sita.
syms w real;
syms t positive;
syms x;
kd=gama_KD;
r=gama;

N_s=poly2sym(N,'x');
D_s=poly2sym(D,'x');
N_w=subs(N_s,{x},{j*w})*(cos(w*L)-j*sin(w*L));%exp(-j*w*L);
D_w=subs(D_s,{x},{j*w});

s=j*w;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%    H∞范数形式
a=1/r*cos(t);
b=1/r*sin(t);
c=a+b*j;
switch flag
    case 1
    temp_NN=s*D_w+N_w*c; % Jv=1/s*Gp/(1+CGp)
    temp_DD=N_w;
    
    case 2
    temp_NN=s*D_w+s*N_w*c; % Jv=Gp/(1+CGp)
    temp_DD=N_w;    
    
    case 3
    temp_NN=s*D_w*(1+c); % Ms=1/(1+CGp)
    temp_DD=N_w;

    case 4
    temp_NN=s*D_w; % Mt=CGp/(1+CGp)
    temp_DD=N_w*(1+c);

    case 5
    temp_NN=s*D_w; % Ju=C/(1+CGp)
    temp_DD=(N_w+D_w*c);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sys=simplify(temp_NN/temp_DD);

Re_w_t=simplify(real(sys));
Im_w_t=simplify(imag(sys));

x=-Im_w_t/w;
y=kd*w^2-Re_w_t;
z=diff(y,w)*diff(x,t)-diff(y,t)*diff(x,w);%% 包络线方程和奇点轨迹线方程

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  plot the figure in the kp-ki plane
% w0=1;   %% method 1
% for k=1:length(sita)
%     fc=subs(z,{t},{sita(k)*pi});
%     ff=inline(char(fc));
%     tp_w=fzero(ff,w0);
% 
%     kp(k)=subs(x,{w,t},{tp_w,sita(k)*pi});
%     ki(k)=subs(y,{w,t},{tp_w,sita(k)*pi});
% end
  
for k=1:length(v) %% method 2
    fc=subs(z,{w},{v(k)});
    
    ff=inline(char(fc)); %% method 2
    
    tp_t(k)=fzero(ff,[0 pi]);
    kp1(k)=subs(x,{w,t},{v(k),tp_t(k)});
    ki1(k)=subs(y,{w,t},{v(k),tp_t(k)});
    
    tp_t1(k)=fzero(ff,[pi 2*pi]);
    kp2(k)=subs(x,{w,t},{v(k),tp_t1(k)});
    ki2(k)=subs(y,{w,t},{v(k),tp_t1(k)});    
end

kp=[kp1 kp2];
ki=[ki1 ki2];

figure(1);
hold on;
plot(kp1,ki1,'b.');
hold on;
plot(kp2,ki2,'r.');
xlabel('K_p');
ylabel('K_i');
grid on;
hold on;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  plot the inter curves
if flag==1
    no=length(ki1);
    for i=1:no-1
        error(i)=abs(ki1(i+1)-ki1(i));
        stand=ki1(2)-ki1(1);
        if error(i)>1.
            KK=i+1;
            break;
        end
    end
    figure(13);
    kp_in=[kp2(find(kp2<kp2(KK))) kp1(find(kp1>kp2(KK-1) & ki1>=ki2(1)-0.15))];
    ki_in=[ki2(find(kp2<kp2(KK))) ki1(find(kp1>kp2(KK-1) & ki1>=ki2(1)-0.15))];
    tpx=kp_in(1):0.0001:max(kp_in);
    tpy=interp1(kp_in(find(kp_in>kp_in(1))),ki_in(find(kp_in>kp_in(1))),tpx,'spline');
    plot(tpx(find(tpy>=ki_in(1))),tpy(find(tpy>=ki_in(1))),'b-','LineWidth',linewidth);
    
    hold on
    plot(kp_in(find(kp_in<=kp_in(1)+0.05)),ki_in(find(kp_in<=kp_in(1)+0.05)),'b-','LineWidth',linewidth);
    
    kix=1/gama.*ones(size(tpx(find(tpy>=ki_in(1)))));
    hold on;
    plot(tpx(find(tpy>=ki_in(1))),kix,'b-','LineWidth',linewidth);
end
if flag==2 || flag==4 || flag==5
    figure(13);
    hold on;
    
    tpx=kp2(1):0.0001:max(kp2);
    tpy=interp1(kp2(find(ki2>=0)),ki2(find(ki2>=0)),tpx,'spline');
    plot(tpx(find(tpy>=0)),tpy(find(tpy>=0)),'b-','LineWidth',linewidth);
    kix=zeros(size(tpx(find(tpy>=0))));
    hold on;
    plot(tpx(find(tpy>=0)),kix,'b-','LineWidth',linewidth);
    
%     tpx=kp2; %% method 2
%     tpy=ki2;
%     plot(tpx(find(tpy>=0)),tpy(find(tpy>=0)),'b-','LineWidth',linewidth);
%     kix=zeros(size(tpx(find(tpy>=0))));
%     hold on;
%     plot(tpx(find(tpy>=0)),kix,'b-','LineWidth',linewidth);
end
if flag==3
    figure(13);
    hold on;
    
    tpx=kp1(1):0.0001:max(kp1);%% method 1
    tpy=interp1(kp1(find(ki1>=0)),ki1(find(ki1>=0)),tpx,'spline');
    plot(tpx(find(tpy>=0)),tpy(find(tpy>=0)),'b-','LineWidth',linewidth);
    kix=zeros(size(tpx(find(tpy>=0))));
    hold on;
    plot(tpx(find(tpy>=0)),kix,'b-','LineWidth',linewidth);
    
%     [tpnum,M1]=max(kp1);%% method 2
%     [tpnum,M2]=max(ki1);
%     tpx1=kp1(1):0.0001:kp1(M1);%% method 2
%     tpy1=interp1(kp1(1:M1),ki1(1:M1),tpx1,'spline');
%     plot(tpx1,tpy1,'b-','LineWidth',linewidth);
%     hold on;
%     tpx2=kp1(M1):-0.0001:kp1(M2);%% method 2
%     tpy2=interp1(kp1(M1:M2),ki1(M1:M2),tpx2);%,'spline');
%     plot(tpx2,tpy2,'b-','LineWidth',linewidth);
%     hold on;
%     tpx3=kp1(M2):-0.0001:kp1(end);%% method 2
%     tpy3=interp1(kp1(M2:end),ki1(M2:end),tpx3);%,'spline');
%     plot(tpx3(find(tpy3>=0)),tpy3(find(tpy3>=0)),'b-','LineWidth',linewidth);
%     kix=zeros(size(tpx1(find(tpy1>=0))));
%     hold on;
%     plot(tpx1(find(tpy1>=0)),kix,'b-','LineWidth',linewidth);
    
%     tpx=kp1; %% method 3
%     tpy=ki1;
%     plot(tpx(find(tpy>=-0.02)),tpy(find(tpy>=-0.02)),'b-','LineWidth',linewidth);
%     kix=zeros(size(tpx(find(tpy>=-0.02))));
%     hold on;
%     plot(tpx(find(tpy>=-0.02)),kix,'b-','LineWidth',linewidth);
end
xlabel('K_p');
ylabel('K_i');
box on;
hold on;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  start guess point
KP_start=kp2(1)
KI_start=ki2(1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -