如何将一个非常简单的控制器添加到一组微分方程中

时间:2017-11-21 16:29:05

标签: matlab controls ode differential-equations matlab-compiler

我有一组非常复杂的微分方程,有几个时间因变量。我在网上找到了我的代码的简化,就在这里; 它分为两部分。第一

`t_values=linspace(0,10,101); 
 initial_cond=[1 ; 0 ; 0];  
 [tv,Yv]=ode45('simplemodel',t_values,initial_cond);
 plot(tv,Yv(:,1),'+',tv,Yv(:,2),'x',tv,Yv(:,3),'o');
 legend('y1','y2','y3');`

然后另一个

function Dy = simplemodel(t,y)

Dy=[ a(t)*y(1)+b(t)*y(2); ...
-a(t)*y(3)+b(t)*y(1); ...
 a(t)*y(2)] ;
 end

function fa=a(t);
    fa=cos(t); % or place whatever you want to place for a(t)..
end

function fb=b(t);
  fb=sin(t) % or place whatever you want to place for b(t)..
end

但是我有一个问题,我想尝试将PID控制器添加到我的a(t)术语中。我试图通过更改fb=sin(t)行来添加“比例术语”到fb=-K*y(2)+d+K*int(y(2))+K*diff(y(2)),其中Kd是常量。当我将此fb行替换为代码中的那一行时,我会收到错误。有什么想法吗?非常感谢你

1 个答案:

答案 0 :(得分:0)

您想要从

描述的系统转到
function Dy = simplemodel(t,y)
  a = cos(t)
  b = sin(t)
  Dy=[ a*y(1)+b*y(2); ...
      -a*y(3)+b*y(1); ...
       a*y(2)] ;
 end

到了

的东西
  b = -K*y(2)+d+K*Iy2+K*Dy2

其中Dy2是衍生物,Iy2是第二组分的反衍生物。第一个问题是

Dy(2) = -a*y(3)+b*y(1)

取决于b,这取决于Dy(2),因此您可以获得一些反馈。您必须解决的依赖关系圈。这可以通过解决

来完成
Dy(2) = -a*y(3)+(b1+K*Dy(2))*y(1);

代表Dy(2)b1包含b的所有其他部分,因此总的来说,圆圈已解决为

b1 = -K*y(2)+d+K*Iy2
Dy(2) = (-a*y(3) + b1*y(1))/(1-K*y(1))
b = b1+K*Dy(2);

这仍然包含尚未解决的反衍生价值。换句话说,我们需要一个导数为y(2)的函数。由于系统中不存在这样的功能,我们必须为其添加一个额外的组件,

function Dy = simplemodel(t,y)
  a = cos(t)
  Dy(4) = y(2) % y(4) = integral(y(2))
  b1 = -K*y(2)+d+K*y(4) % missing +K*Dy(2)
  Dy(2) = (-a*y(3) + b1*y(1))/(1-K*y(1))
  b2 = K*Dy(2); 
  b = b1+b2;
  Dy(1) = a*y(1)+b*y(2)
  Dy(3) = a*y(2)
end

你仍然需要一些反衍生物的初始值,如果系统被认为在休息状态后被打开,那么它很可能是0