我的机械系统有以下等式:
xdot = Ax+ Bu
我想在一个循环中解决这个等式,因为在每个步骤中我都需要更新你,但求解器如 ode45
或 lsim
解决了时间间隔的微分方程 .
for i = 1:10001
if x(i,:)>= Sin1 & x(i,:)<=Sout2
U(i,:) = Ueq - (K*(S/Alpha))
else
U(i,:) = Ueq - (K*S)
end
% [y(i,:),t,x(i+1,:)]=lsim(sys,U(i,:),(time=i/1000),x(i,:));
or %[t,x] = ode45(@(t,x)furuta(t,x,A,B,U),(time=i/1000),x)
end
我是否有另一种方法可以在一个循环中解决这个等式一次(非单一时间步) .
1 回答
有许多方法可以跨函数调用更新和存储数据 . 对于ODE套件,我开始喜欢所谓的“闭包” . 闭包基本上是从其父函数访问或修改变量的嵌套函数 .
下面的代码通过将传递给ode45的右侧函数和'OutputFcn'包装在名为
odeClosure()
的父函数中来利用此功能 .您会注意到我使用的是逻辑索引而不是
if
-statement .if
-statements中的向量仅在所有元素都为真时才为真,反之亦然为假 . 因此,我创建一个逻辑数组并使用它来分母1
或Alpha
,具体取决于x
/U
的每一行的信号值 .'OutputFcn'
storeU()
在ode45
的成功时间步之后被调用 . 该函数会增加U
存储阵列并对其进行适当更新 . 数组U
将具有与tspan所请求的解决方案点数相同的列数(在此示例中为12) . 如果一个成功的完整步骤超过任何请求的点,则调用该函数,其中包含所有请求的中间时间及其相关的解决方案值(因此x
可以是矩形而不仅仅是矢量);这就是我在storeU
中使用bsxfun
而不是rhs
的原因 .功能示例: