2015-11-05 54 views
0

ode的主要功能如下所示。'ode45` matlab中的錯誤

function dxdt = state(t,x,vgth,vgval1,vgval2) 
vgval=vgval1+vgval2; 
p=1; 
k=10^0.7; 
window1=1-((2*x)-1).^(2*p); 
dxdt=k*(vgval-vgth+1.2)*window1; 
end 

腳本如下。

step=0.01; 
t = 0:step:10; 
f=4*0.157; 
vgate1= @(t) abs(5*sin(2*f*t)).*heaviside(5-t); 
[email protected](t) -abs(5*sin(2*f*t)).*heaviside(t-5); 

函數調用部分如下。

x0=0.01; 
vgth=1.9; 
[t,x] = ode45(@(t,x) state1 (t,x,vgth,vgate1(t),vgate2(t)), t, x0); 
plot(t,x) 

問題 當我使用負號與vgate2它給我的錯誤。 它工作正常如果我刪除vgate2的負號。

所需的結果 我想我在vgate2。其實一個負號我想用兩個正脈衝,正弦和兩個負號pulses.That情節就是爲什麼我用的vgate2負值。

+0

'state1'的輸出是什麼?你可以添加你的帖子中的錯誤消息嗎? – BillBokeey

+1

你可以嘗試明確整合到t = 5,然後重新啓動?之後將解決方案拼接在一起。非平滑事件對於步長適配器不利,跳轉是最糟糕的。 – LutzL

+0

@BillBokeey'x'是'state1'的輸出 –

回答

2

訂單p的ODE積分器預計微分方程爲p+2時間與體面大小的衍生物不斷可微。

任何與此有關的偏差都被步長適應策略視爲「僵硬」,並且通過逐步大幅度減小步長來應對。低階導數中的任何扭結或跳躍都被看作與高階導數中的野性振盪類似,並將循環的步長適配器拋出。

但是,如果積分在事件中直接停止,然後使用其中的值作爲初始值重新啓動,則積分器不會「看見」事件,因此無需對其作出反應。