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



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

`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

但是我有一个问题,我想尝试在我的a(t)术语中添加PID控制器。我尝试首先通过将fb=sin(t)线更改为fb=-K*y(2)+d+K*int(y(2))+K*diff(y(2))来添加一个"比例项",其中Kd是常数。当我用这fb行替换代码中的行时,我得到错误。伙计们有什么想法吗?谢谢

你想从一个描述的系统

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

最新更新