2014-07-16 74 views
2

我想問一個關於函數何時以及下面的源代碼無法正確運行的Modelica問題。變量Pstart_CONV是if語句中der(x_calc)的初始條件,當「when語句」變爲true時,Pstart_CONV值由x給出。因爲x是一個階梯函數,所以我想爲der(x_calc)指定一個初始條件,所以可以爲整個域繼續x。Modelica:step函數的初始條件

非常感謝你,

來源:

model Unnamed4 
    Real Pstart_CONV; 

    Real P_crit_ratio; 
    parameter Real P_crit_ratio_criteria = 2.00; 

    Real x; 
    Real x_calc(start=0); 

equation 
    P_crit_ratio = 10-time; 

    when P_crit_ratio <= P_crit_ratio_criteria then 
    Pstart_CONV = x; 
    end when; 

    if P_crit_ratio >= P_crit_ratio_criteria then 
    x = time^2; 
    x_calc = 0; 
    else 
    der(x_calc) = time * 5; 
    x = x_calc + Pstart_CONV; 
    end if; 
end Unnamed4; 

回答

4

有兩個問題,我這個代碼中看到。主要的原因是這就是所謂的「可變指數」問題。我會解決這個問題。但首先,我想指出您的ifwhen子句未正確同步。我的意思是,您的if陳述所代表的行爲變化不一定會發生在when子句被激活的同一瞬間。

爲了解決這個問題,你可以很容易地重構你的模型是這樣的:

model Model1 
    Real Pstart_CONV; 
    Real P_crit_ratio; 
    parameter Real P_crit_ratio_criteria=2.00; 
    Real x; 
    Real x_calc(start=0); 
    Boolean trigger(start=false); 
equation 
    P_crit_ratio = 10-time; 

    when P_crit_ratio <= P_crit_ratio_criteria then 
    Pstart_CONV = x; 
    trigger = true; 
    end when; 

    if trigger then 
    der(x_calc) = time * 5; 
    x = x_calc + Pstart_CONV; 
    else 
    x_calc = 0; 
    x = time^2; 
    end if; 
end Model1; 

現在,無論是ifwhen條款被拴在trigger變量。現在,我們可以這是你的if聲明的一側你有解決您的主要問題:

der(x_calc) = time * 5; 

...並在另一邊你有:

在實踐中,這是什麼意思是說,對於部分模擬,你使用微分方程求解x_calc,而在模擬的另一部分,你使用代數方程求解x_calc。這導致「可變指數」問題,因爲DAE的「索引」根據trigger的值是真還是假而改變。

對此的一種方法是稍微修改方程式。除了使用方程x_calc = 0,我們指定0的初始條件爲x_calc,然後執行表示x_calc的值不變的微分方程,即der(x_calc) = 0。換句話說,通過將代數方程設置x_calc去掉一個常數並用一個等式替換它,我們將x_calc的初始值設置爲期望值,然後添加一個微分方程,該方程實際上簡單地表示x_calc的值不會更改。

使你的情況下,這種改變導致以下模型:

model Model2 
    Real Pstart_CONV; 
    Real P_crit_ratio; 
    parameter Real P_crit_ratio_criteria=2.0; 
    Real x; 
    Real x_calc(start=0); 
    Boolean trigger(start=false); 
initial equation 
    x_calc = 0; 
equation 
    P_crit_ratio = 10-time; 

    when P_crit_ratio <= P_crit_ratio_criteria then 
    Pstart_CONV = x; 
    trigger = true; 
    end when; 

    if trigger then 
    der(x_calc) = time * 5; 
    x = x_calc + Pstart_CONV; 
    else 
    der(x_calc) = 0; 
    x = time^2; 
    end if; 
end Model2; 

我測試了它,並使用SystemModeler(雖然我不知道有足夠的瞭解您的問題或預期的結果,以這種模式運行真正驗證結果)。

我希望有幫助。

+0

嗨邁克爾,非常感謝你!這非常有幫助! – world2005

+0

如果這回答您的問題,請將其標記爲答案(單擊答案旁邊的複選標記)。 –

+0

好吧,對不起,這是我第一次使用這個平臺。非常感謝! – world2005