我有一个模型,它在matlab功能块中获取输入的根。输入应始终为正;但是,有时simulink会给出一个负数。原因是我使用隐式求解器(由于系统的其他部分是僵硬的ode15s)而且simulink具有无效估计。我的问题是:如何告诉simulink输入无效,这使得求解器采取较小的步骤(不停止)?我可以返回特殊值(例如,NaN)或抛出错误(不停止模拟)吗?
答案 0 :(得分:0)
如果输入为负,您可以在MATLAB功能块中返回0
:
if u<=0
y = 0;
else
y = sqrt(u);
end
其中u
是输入,y
是函数的输出。
答案 1 :(得分:0)
当信号接近零时,使用Hit Crossing Block强制求解器采取较小的时间步长。假设你的模型被正确设置为强制信号不低于零(即它的工作方式类似于Abs块,它将达到零,然后继续为正值),这将起作用。
答案 2 :(得分:0)
我的解决方案是添加另一个输出isInputValid。如果输入无效,则为0;如果输入有效,则为1。然后通过新的集成块集成此输出。看起来布尔变量产生的不连续性确保积分器采取较小的步骤。
示例:
if ( u<0)
y = -realmax;
isInputValid = 0;
else
y = sqrt(u);
isInputValid = 1;
end
然后将积分器附加到isInputValid的输出。