2013-02-19 68 views
2

工作,我嘗試用Dymola的編譯如下代碼:採樣功能並不在Dymola的

class abc 
    import Modelica.SIunits; 
    parameter SIunits.Time delta_t=0.5; 

    constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6}; 
    Real x; 
    Integer j(start=1); 
    Integer k=size(a, 1); 

algorithm 
    when {(sample(0, delta_t) and j < k),j == 1} then 
    x := a[j]; 
    j := j + 1; 
    end when; 
end abc; 

time = 0變量j開始與2。但它應該從j = 1開始。
有沒有人有這個問題的想法?

+0

可以使用向量'{(sample(0,delta_t)和j matth 2013-02-19 09:14:41

+0

@matth不,條件j == 1在時間= 0時不_become_真,這是真的,因爲「j == 1和pre(j == 1)= false」。 – Willi 2013-02-19 13:06:08

回答

3

請記住,sample(x,y)表示樣本在x+i*y處爲真,其中i從零開始。也就是說sample(0, ...)time=0處變爲true。

由於j從1開始並且k大概超過1,因此sample(0, delta_t) and j<k在模擬開始時應該變爲真實並不意外。

我懷疑你想要的是:

class abc 
    import Modelica.SIunits; 
    parameter SIunits.Time delta_t=0.5; 

    constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6}; 
    Real x; 
    Integer j(start=1); 
    Integer k=size(a, 1); 

algorithm 
    when {(sample(delta_t, delta_t) and j < k),j == 1} then 
    x := a[pre(j)]; 
    j := pre(j) + 1; 
    end when; 
end abc; 

我實在不明白的j==1條件的點。從一開始就是這樣,這意味着它不會「變成」那麼真實。而且由於j永遠不會遞減,所以我不明白爲什麼一旦它第一次遞增就應該返回到值1

請注意,我在j的右側值周圍添加了pre。如果這是在 equation部分,我敢肯定pre將是必需的。由於它是algorithm部分,它主要是記錄代碼的意圖。它還使得代碼從equation切換到algorithm部分變得可靠。

+0

請注意,在時間= [0,delta_t)時x將爲0。我敢肯定,建模者是否會期待這一點。 – Willi 2013-02-19 14:03:59

+0

ok,現在j在時間0時從1開始。但是在時間t = 0.5時,j的值在1上返回,並在t = 1時開始遞增。你看到圖像中的課程。 ![Value_j](https://dl.dropbox.com/u/17773229/Variable_j_falsch.PNG)。 – lars 2013-02-19 15:45:17

1

當然,在表達式sample(0, delta_t) and j<k觸發的時間= 0時有一個事件成爲事實。

但是在舊版本的Dymola中,有一個離散變量初始化的錯誤。例如,即使您刪除了dymola74中的​​3210,j在時間= 0時也將變爲2。問題在於when子句的pre值,其中未初始化的是正確的。據我所知,這至少在版本FD1 2013中得到糾正。