>我有一组非常复杂的微分方程,其中包含几个时间因变量。我在网上找到了我的代码的简化,它在这里; 它分为两个部分。第一
`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))
来添加一个"比例项",其中K
和d
是常数。当我用这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
。