0
位新手在這裏... 我試圖解決一個系統的6個代碼,但條件是,如果(x(1)< = 0.1),那麼x(6)= x(6)/2.0。我如何將它放入代碼? 謝謝!在matlab中使用ode45解決一個條件系統
位新手在這裏... 我試圖解決一個系統的6個代碼,但條件是,如果(x(1)< = 0.1),那麼x(6)= x(6)/2.0。我如何將它放入代碼? 謝謝!在matlab中使用ode45解決一個條件系統
這稍微從http://www.mathworks.com/help/matlab/ref/ode45.html
首先使一個新的MATLAB函數,並調用它rigid.m
修改後的基本實施例1。你可以把任何代碼裏面,但試試這個:
function dy = rigid(t,y)
dy = zeros(6,1); % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
dy(4) = y(5) * y(6);
dy(5) = -y(4) * y(6);
dy(6) = -0.51 * y(4) * y(5);
if(dy(6)<0.5)
dy(6)=dy(6)/2;
end
end
現在運行以下三行:
options = odeset('RelTol',1e-4,'AbsTol',1e-4);
[T,Y] = ode45(@rigid,[0 12],[0 1 1,0 1 1],options);
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.',T,Y(:,4),'-',T,Y(:,5),'-.',T,Y(:,6),'.');
,它完成。 Matlab求解器應該很好地處理導數中的不連續性,但這取決於你的問題。無論如何,在這種情況下,如果dy(6)< 0.5那麼它減半。
謝謝你的所有建議。我終於在昨天得到了它的工作。 – Fred
請以數學形式陳述條件。 x(6)= x(6)/2.0作爲一項任務是有意義的,但不是一種條件。 – 2015-07-04 02:29:07
如果'x(1)> 0.1'會怎麼樣?你試過什麼了?從我可以告訴,這聽起來像你應該看看[事件](http://mathworks.com/help/matlab/ref/odeset.html#f92-1017470)。您想要集成到發生更改的地方,停止然後重新啓動與不同參數的新集成。示例:[1](http://stackoverflow.com/q/22818556/2278029),[2](http://stackoverflow.com/q/13755352/2278029)。 – horchler
基本上,如果x(1)> 0.1,那麼六個笛子就像正常那樣求解,但是當它<= 0.1時,第六個變量被減半。 我正在嘗試重新創建已經完成的任務,並且可以從他們的圖中看到第一個變量在仿真期間多次跨越閾值。這聽起來像一個事件(可以處理多個事件)嗎?到目前爲止,我試圖把一個if語句放在ode函數中...... 非常感謝您的幫助! – Fred