Implement PID in ode45 code

조회 수: 99 (최근 30일)
Kashish Pilyal
Kashish Pilyal 2022년 8월 16일
댓글: Kashish Pilyal 2022년 8월 17일
So, I have a ode45 function and I have an error defined in it which changes at different iterations of the solver. I was able to define the derivative part by just differentiating the error formula but I am unable to implement the integral part. The error expression is:
, where q represents position and v represents velocity. Is it possible to get the PID part in the ode function.

채택된 답변

Sam Chak
Sam Chak 2022년 8월 16일
편집: Sam Chak 2022년 8월 17일
If the error is defined as
then
P part is
I part is
D part is
and you can arrange then in the state-space form. For example, a Double Integrator system
can be rewritten in state-space as:
.
The PID has 3 terms, and the state-space is in differential form. So you have no issue with the P and the D part, because they are part of the state variables. The I part is in integral form, so you have to create an additional state variable. See Example below:
[t, x] = ode45(@DIsystem, [0 20], [0; 0; 0]);
plot(t, x(:,1), 'linewidth', 1.5)
grid on, xlabel('t'), ylabel('y(t)'), % ylim([-0.2 1.2])
function dxdt = DIsystem(t, x)
dxdt = zeros(3, 1);
% construction of PID
r = 1; % reference signal
e = x(1) - r; % error signal
Kp = 1 + sqrt(2); % proportional gain
Ki = 1; % integral gain
Kd = 1 + sqrt(2); % derivative gain
u = - Kp*e - Ki*x(3) - Kd*x(2); % the PID thing
% the dynamics
A = [0 1; 0 0]; % state matrix
B = [0; 1]; % input matrix
dxdt(1:2) = A*[x(1); x(2)] + B*u; % the Double Integrator system
dxdt(3) = e; % for integral action in PID
end
  댓글 수: 3
Sam Chak
Sam Chak 2022년 8월 17일
I have provided an example in the Answer using a Double Integrator system:
You will get the idea of how to implement that. Hope it works out for your system.
Kashish Pilyal
Kashish Pilyal 2022년 8월 17일
Thanks I got the idea, in my case I have the error:
e_1=x(1)-( x(4)+(h_i*x(5)) );
So, If I am right I need to introduce a new state which I will be equal to this error at the end of every iteration like you did with dxdt=x(3) and in the next iteration use this state as the integral of the error.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 PID Controller Tuning에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by