2014-05-23 96 views
0

我有一個模型,它將輸入的根作爲一個matlab函數塊。投入應始終爲正;但是,有時simulink會給出一個負數。原因是我使用隱式解算器(由於系統的其他部分僵硬而導致ode15s),並且simulink具有無效估計。我的問題是:我怎麼能告訴simulink輸入無效,這使得求解器採取更小的步驟(不停止)?我可以返回一個特殊值(例如NaN)還是拋出錯誤(不停止模擬)?Simulink返回無效輸入

回答

0

我的解決方案是添加另一個輸出isInputValid。如果輸入無效,則爲0;如果輸入有效,則爲1。這個輸出然後被一個新的集成模塊集成。看起來布爾變量產生的不連續性確保積分器採取更小的步驟。

實施例:

if (u<0) 
    y = -realmax; 
    isInputValid = 0; 
else 
    y = sqrt(u); 
    isInputValid = 1; 
end 

然後積分器附加到isInputValid的輸出。

0

您可以在MATLAB功能塊返回0如果輸入的是否定的:

if u<=0 
    y = 0; 
else 
    y = sqrt(u); 
end 

其中u是輸入y函數的輸出。

+0

謝謝,但這將使仿真繼續以假模型。目標是集成商退後一步並採取較小的步驟,以便它不使用無效輸入。 –

+0

我不認爲你可以做你想做的事。我可以建議的唯一的事情是在模擬參數中指定一個較小的'MaxStepSize',但這會使模擬時間更長。 – am304

0

使用Hit Crossing Block強制求解器在信號接近零時花費很少的時間步長。假設你的模型設置正確,強制信號不低於零(即它的作用類似於一個Abs模塊,它將達到零,然後繼續一個正值),這將工作。