有兩個問題,我這個代碼中看到。主要的原因是這就是所謂的「可變指數」問題。我會解決這個問題。但首先,我想指出您的if
和when
子句未正確同步。我的意思是,您的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;
現在,無論是if
和when
條款被拴在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(雖然我不知道有足夠的瞭解您的問題或預期的結果,以這種模式運行真正驗證結果)。
我希望有幫助。
嗨邁克爾,非常感謝你!這非常有幫助! – world2005
如果這回答您的問題,請將其標記爲答案(單擊答案旁邊的複選標記)。 –
好吧,對不起,這是我第一次使用這個平臺。非常感謝! – world2005