2014-01-16 35 views
1

我爲可憐的標題道歉,但我發現很難用易理解的方式來描述問題。Modelica:同時使用der()和顯式聲明來計算變量

我想要做的是解決ODE,但我不想從time = 0開始集成。我希望初始值(即集成的起始點)可用於更改,直到集成開始。我試着用一段代碼來說明這一點:

model testModel "A test" 
    parameter Real startTime = 10 "Starting time of integration"; 
    parameter Real a = 0.1 "Some constant"; 
    Real x; 
    input Real x_init = 3; 
initial equation 
    x = x_init; 
equation 
    if time <= startTime then 
    x = x_init; 
    else 
    der(x) = -a*x; 
    end if; 
end testModel; 

請注意,x_init被聲明爲輸入,並且可以連續更改。這段代碼產生了一條錯誤信息,據我所知,這是由於我宣佈x爲der(x) =x =。錯誤消息是:

錯誤:對於der(x)=( - (如果時間< = 10,則x-x_init else a * x))/((如果時間< = 10則爲0.0其他)的奇異不一致標量系統1.0))= -1e-011/0

我考慮在if語句,這將避免該錯誤消息寫入

der(x) = 0 

代替

x = init_x 

。但是,這種方法存在的問題是,在集成開始之前,我失去了修改x_init的能力,即集成的起點。比方說,例如,x_init從3變爲4,在time = 7

是否有解決方案來執行我想要的操作?謝謝。

(我要用它來模擬幾個子模型作爲網絡的一部分,但子模型不會同時啓動,因此startTime-可變,並且能夠在集成之前更改初始條件。)

建議解決方案:我已經試過了以下工作:

when time >= startTime 
    reinit(x,x_init); 
end when; 
der(x) = 0替代組合

。這似乎工作。歡迎其他建議。

回答

1

如果你的輸入可微,這應該工作:

model testModel "A test" 
    parameter Real startTime = 10 "Starting time of integration"; 
    parameter Real a = 0.1 "Some constant"; 
    Real x; 
    input Real x_init = 3; 
initial equation 
    x = x_init; 
equation 
    if time <= startTime then 
    der(x) = der(x_init); 
    else 
    der(x) = -a*x; 
    end if; 
end testModel; 

否則,我懷疑你能做的最好的辦法是有你的x可變startTime之前是一個非常快的一階跟蹤。

這裏的根本問題是您正在嘗試對變量索引DAE建模。我知道的Modelica工具都不支持這種類型的可變索引系統。

+0

感謝您的反饋,邁克爾。我的問題是''x_init''不一定是一個平滑的信號,因此它可能有扭曲使它不可區分。儘管如此,你的解決方案仍然有幫助,在這方面對我來說最大的「啓示」就是你對可變指標系統的最後陳述。正如我在我原來的文章中所說的,我已經找到了使用''reinit()''函數解決特定問題的解決方法,但我不能說這是否是最佳解決方案。 – fredrikg