 . Please clarify.
. Please clarify.Combine two controllers in ODE45 environment
    6 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Telema Harry
 am 7 Jun. 2022
  
    
    
    
    
    Kommentiert: Telema Harry
 am 8 Jun. 2022
            Hi,
Please I need idea on how to implement the following problem on MATLAB.
My aim is to stabilize a plant using two dynamic controllers. Only one controller is implemented at a time. The controller to be implemented is depended on a logic variable q = 1 or q = 0. 
If q = 0, controller 1 is implemented and if q = 1, controller 2 is implemented.
The controller output is given by:
u = q* K2(x) + (1 - q) * K1(x).
K1 and K2 are dynamic controllers. so they are solved using ODE45.
By default controller 1 will be triggered at the start of the program until output variable is less than 5. and the second controller is triggered. 
The main challenge: 
The last output of controller  1 (The output just before controller 2 is triggered) should be used as the initial condition of controller 2 when controller 2 is triggered.
6 Kommentare
  Sam Chak
      
      
 am 7 Jun. 2022
				
      Bearbeitet: Sam Chak
      
      
 am 7 Jun. 2022
  
			Yes @Telema Harry
Thanks for clarifying the matter. I think I understand that the dynamics is something like  , where
, where  , in order to preserve the continuity of the control action. Actually, I'm thinking, "if this is a state-space, where do I put
, in order to preserve the continuity of the control action. Actually, I'm thinking, "if this is a state-space, where do I put  ?"
?" 
 , where
, where  , in order to preserve the continuity of the control action. Actually, I'm thinking, "if this is a state-space, where do I put
, in order to preserve the continuity of the control action. Actually, I'm thinking, "if this is a state-space, where do I put  ?"
?" Akzeptierte Antwort
  Sam Chak
      
      
 am 8 Jun. 2022
        Since you are unable to provide more info, here is a very simple example, which I'm not sure if this is what you want.
System:  , where
, where  is a sinusoidal disturbance.
 is a sinusoidal disturbance.
 , where
, where  is a sinusoidal disturbance.
 is a sinusoidal disturbance.function dxdt = odefcn(t, x)
    dxdt = zeros(2, 1);
    h = 0.2;                                   % activation if x < |h|
    q = (sign(x(1) + h) - sign(x(1) - h))/2;   % trigger condition for K2
    u1 = sign(x(1));                           % K1
    u2 = x(1)/h;                               % K2
    u = (1 - q)*u1 + q*u2;
    d = 0.75*cos(t*2*pi/10) + 0.5*sin(t*2*pi/5);	% disturbance
    dxdt(1) = d + x(2);
    dxdt(2) = (- u - x(2))/0.01;
end
Solving ODE
tspan = linspace(0, 20, 2001)';
x0 = [1 -1];
[t, x] = ode45(@odefcn, tspan, x0);
Plotting the results
plot(t, x, 'linewidth', 1.5)

Weitere Antworten (0)
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





