Disturbance observer and prescribed time controller
25 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
controlEE
le 6 Fév 2026 à 16:47
Réponse apportée : CHANDRA BABU GUTTIKONDA
le 11 Fév 2026 à 6:47
Hi, I simulated a disturbance observer based prescribed time controller, but I'm facing two problems :
1- When I choose a really small Tfc in the follwoing code, a singularity is resulted in the second state.
2- I wanted to see the performance of the disturbance observer. Unfortunately, it doesn't change. No matter what I choose as its settling time.
clear all
close all
clc
t0 = 0;
tf = 10;
dt = 0.001;
t = t0:dt:tf;
a = 0.01;
tau = 6.65/7;
h = 3;
delay = h/dt;
Tfc = 5;
eps1 = -2;
eps2 = 3;
d = 2*sin(0.2*pi*t)+0.15*sin(2*pi*t);
% d = 0*ones(1,length(t));
D1 = 0.7*pi;
x10 = 1;
x20 = -1;
d_hat(1) = -2;
x1(1) = x10;
x2(1) = x20;
mu(1) = 0.3;
mu0 = mu(1);
b1 = 2;
b2 = 3;
phi(1) = mu(1)+x2(1);
phi1(1) = -b1*(1-exp(-x1(1)))/(Tfc-t(1));
Sd0 = 8;
W = @(s) exp(a*s).*(s-h).^5.*(2*h-s).^5;
Wc = 1/(integral(W,h,2*h));
for i=1:length(t)-1
if t(i)<h
Rh(i) = 0;
elseif t(i)>=h && t(i)<= 2*h
% Rh(i) = sin(pi*t(i)/h)^2;
Rh(i) = (t(i)-h).^5*(2*h-t(i)).^5;
else
Rh(i) = 0;
end
if (i-delay)<=0
mud(i) = mu0;
Sdd(i) = Sd0;
else
Sdd(i) = Sd(i-delay);
mud(i) = mu(i-delay);
end
z2(i) = x2(i)-phi1(i);
%% Predefined-time Backstepping controller
if t(i)<Tfc-0.0001
dphi1_dt(i) = -b1*(1-exp(-x1(i)))/(Tfc - t(i))^2-b1*x2(i)*exp(-x1(i))/(Tfc - t(i));
phi1(i+1) = phi1(i)+dphi1_dt(i)*(t(i+1)-t(i));
dphi1_dx1(i) = -b1*exp(-x1(i))/(Tfc - t(i));
phi2(i) = -b2*1/(Tfc - t(i))*(1-exp(-z2(i)));
else
dphi1_dt(i) = 0;
dphi1_dx1(i) = -1500;
phi1(i+1) = 0;
phi2(i) = 0;
end
u(i) = -(x1(i)+eps1*x1(i)+eps2*x2(i)*(1-(x1(i))^2)+d_hat(i)-dphi1_dt(i)-dphi1_dx1(i)*x2(i)-phi2(i));
K(i) = Rh(i)*Wc*exp(-a*(h-2*t(i)));
dx1(i) = x2(i);
x1(i+1) = x1(i)+dx1(i)*(t(i+1)-t(i));
dx2(i) = eps1*x1(i)+eps2*(1-x1(i)^2)*x2(i)+d(i)+u(i);
x2(i+1) = x2(i)+(t(i+1)-t(i))*dx2(i);
dphi(i) = eps1*x1(i)+eps2*(1-x1(i)^2)*x2(i)+u(i)+d_hat(i)-(a/(2*(1-tau))*mu(i)+K(i)/(2*(1-tau))*sign(mu(i))*(abs(mu(i)))^(2*tau-1)*abs(mud(i))^(2*(1-tau)));
phi(i+1) = phi(i)+dphi(i)*(t(i+1)-t(i));
mu(i+1) = phi(i+1)-x2(i+1);
%% Arbitrary Time Sliding Mode Disturbance Observer
dmu(i) = (mu(i+1)-mu(i))/dt;
Sd(i) = dmu(i)+a/(2*(1-tau))*mu(i)+K(i)/(2*(1-tau))*sign(mu(i))*(abs(mu(i)))^(2*tau-1)*abs(mud(i))^(2*(1-tau));
%dd_hat(i) = -(D1*sign(Sd(i))+a/(1-tau)*Sd(i)+K(i)/(1-tau)*abs(Sd(i))^(2*tau-1)*sign(Sd(i))*abs(Sdd(i))^(2*(1-tau)));
dd_hat(i) = -(D1+a/(2*(1-tau))*abs(Sd(i))+K(i)/(2*(1-tau))*abs(Sd(i))^(2*tau-1)*sign(Sd(i))*abs((Sdd(i)))^(2*(1-tau)))*sign(Sd(i));
d_hat(i+1) = d_hat(i)+(t(i+1)-t(i))*dd_hat(i);
end
set(gcf,'color','white')
subplot(2,2,1)
plot(t,x1,'r','LineWidth',1.2);grid minor
leg1 = legend({'$x_1(t)$'});
set(leg1,'Interpreter','latex');
xlabel('t(s)')
ylabel('x1')
ylim([-1 1])
subplot(2,2,2)
plot(t,x2,'b','LineWidth',1.2);grid minor
leg2 = legend({'$x_2(t)$'});
set(leg2,'Interpreter','latex');
xlabel('t(s)')
ylabel('x2')
ylim([-1 1])
subplot(2,2,3)
plot(t,d,'c',t,d_hat,'m','LineWidth',1.2);grid minor
leg3 = legend({'$d(t)$';'$\hat{d}(t)$'});
set(leg3,'Interpreter','latex');
xlabel('t(s)')
ylabel('d(t)')
subplot(2,2,4)
plot(t(1:end-1),Sd,'LineWidth',1.2);grid minor
leg4 = legend({'$S_d(t)$'});
set(leg4,'Interpreter','latex');
xlabel('t(s)')
ylabel('Sd(t)')
leg = [leg1 leg2 leg3 leg4];
set(leg, 'FontSize', 12)
0 commentaires
Réponses (1)
CHANDRA BABU GUTTIKONDA
le 11 Fév 2026 à 6:47
Prescribed-time terms 1/(Tfc−t)1/(T_{fc}-t)1/(Tfc−t) blow up near TfcT_{fc}Tfc in discrete simulation, creating an impulsive control that drives x2x_2x2 unstable.
0 commentaires
Voir également
Catégories
En savoir plus sur Switches and Breakers dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
