我有一组非常复杂的微分方程,有几个时间因变量。我在网上找到了我的代码的简化,就在这里; 它分为两部分。第一
`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))
,其中K
和d
是常量。当我将此fb
行替换为代码中的那一行时,我会收到错误。有什么想法吗?非常感谢你
答案 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
。