2014-01-18 29 views
1

我想知道下面會發生在Modelica的工作:如果用在方程部分案件

suppose variables a,b 
Timetable object c 

    equation 
    if a>c.y then 
     b = f(a) // with f a mathematical function 
    else 
     b = g(a) // with g a mathematical function 
    end if; 

    der(a) = h(a,b) //with h a mathematical function 

如何Modelica的判斷的if語句是真的這種情況下?如果沒有在if語句中確定的「b」的值,它就不能計算「a」的值。

回答

3

首先,請注意a是狀態(至少根據公式,你已經證明)。這意味着在當前時間a將是已知的。從你的描述中,c也是已知的(顯然是時間的函數)。所以在任何時候,我們知道if聲明的哪個分支將被採用。

因此,對於任何給定的時間,我們可以計算b,因此der(a)。真正的問題在於if聲明中的條件發生了什麼變化。

答案是建立了一個「監視器」函數(由Modelica編譯器),並且當監視器函數過零時,Modelica運行時將通過在該點停止集成作出反應,然後通過集成重新啓動(使用另一個科)。這是因爲if語句中的條件表達式隱式生成事件。

另一種考慮此問題的方式是,存在一個「隱藏」布爾變量,指示我們是採取分支還是其他分支。起初,這聽起來很瘋狂,因爲您認爲Modelica運行時將根據是否a>c.y採取分支,但事實並非如此。它所做的是在模擬開始時根據a>c.y的值確定布爾值的初始值,然後嘗試確定它何時實際發生變化。它並不真正評估a>c.y。這導致奇怪的情況,一個分支即使不應該執行也是如此。 發生在Modelica中,並且與生成的候選解決方案相關,而 Modelica運行時正試圖確定事件發生的位置。

我知道這聽起來令人困惑,但是如果您擁抱這個「隱藏的布爾變量」概念,並且知道在Modelica運行時可以明確識別發生更改的點之前它不會更改(基於某些候選解決方案軌跡),這一切都是有道理的。

我希望有幫助。

+0

我想我明白你的意思。你也可以說有時一個分支被執行,而不應該執行。這將表明我的計劃效率不高。你知道一種更好的方式來實現它嗎? – barbar

+0

我覺得「不應該」這個詞太強大了。一個人不能爭論是否應該執行一個分支,直到你能確定哪一個分支需要切換爲止。我不認爲這一定意味着什麼是低效的。您可以使用'noEvent'運算符來使'if'語句像您期望的那樣工作。但不是默認行爲的原因是,如果你這樣做,它可能會給集成商造成更多的困惑。在您決定效率低下之前對其進行基準測試。 –