Теория управления Observer дизайн MATLAB - PullRequest
0 голосов
/ 15 мая 2019

Я проектирую наблюдатель для реальной системы.У меня есть модель моей системы, и я хочу, чтобы x1 -> x1_est и x2-> x2_est. Предположим, x1 известен Система:

x1'=(-Kmi*Ko/Kt)*x2
x2'=(-1/Tm)*x2 + (Km*Kt/Tm)*u
or
X'=A*x+B*u
y=x1
or
y=C*X

Наблюдатель det (sI-A + LC) = s ^ 2 + a1 * s + a2 =>

l1=a1-1/Tm
l2=(l1/Tm-a2)*Kt/(Kmi*Ko)

CODE:

function [x1] = test100(u,a1,a2)
%Run test100(0,60,900) so as x1->x1_est and x2->x2_est
Tm=0.507;
Kmi=1/36;
Km=306;
Kt=0.003;
Ko=0.24;

V_7805=5.48;
Vref_arduino=5;

l1=a1 - 1/Tm
l2=(l1*Kt)/(Tm*Kmi*Ko) - (a2*Kt)/(Kmi*Ko)

positionData = [];
velocityData = [];
positionEstData = [];
velocityEstData = [];
timeData = [];

timeData = [timeData 0];
positionEstData = [positionEstData 0]; %INITIAL VALUE = 0
velocityEstData = [velocityEstData 0]; %INITIAL VALUE = 0
positionData = [positionData 0];
velocityData = [velocityData 0];

t=0;
x1_est=0;
x2_est=0;
tic

while(t<12)
    x1=10+5*cos(5*t);%random x1 
    x2=10+5*cos(5*t);%random x2
    y=x1;

    x1_est=(t-timeData(end)) * (-l1*positionEstData(end) - Kmi*Ko*velocityEstData(end)/Kt + 0*u + l1*y) + positionEstData(end);       %POSITION ESTIMATION VIA EULERS METHOD
    x2_est=(t-timeData(end)) * (-l2*positionEstData(end) - velocityEstData(end)/Tm + Km*Kt*u/Tm + l2*y) + velocityEstData(end);       %VELOCITY ESTIMATION VIA EULERS METHOD

    timeData = [timeData t];
    positionData = [positionData x1]; %REAL X1
    velocityData = [velocityData x2]; %REAL X2
    positionEstData = [positionEstData x1_est]; %ESTIMATED X1
    velocityEstData = [velocityEstData x2_est]; %ESTIMATED X2
end

figure
plot(timeData,positionData,'-r',   timeData,positionEstData,':b');
legend('x1','x1_{est}')
xlabel('Time(sec)')

figure
plot(timeData,velocityData,'-r',   timeData,velocityEstData,':b');
legend('x2','x2_{est}')
xlabel('Time(sec)')

end

Я ожидаю, что x1_est будет x1 через некоторое время, а x2_est будет x2 через некоторое время. Когда я запускаю скрипт, x1_est близок к x1, но x2_est равен NO x, мои математические выражения кажутся нормальными, носимуляция не рядом с ним.Для решения ODE я использую метод Эйлера: y '= f (x, y) => y (i + 1) = Dt * f (x (i), y) + y (i).по умолчанию, но это не должно быть проблемой. Наблюдатель должен наблюдать за любым начальным значением

...