在matlab中使用ode45解决一个条件系统

问题描述:

位新手在这里... 我试图解决一个系统的6个代码,但条件是,如果(x(1)< = 0.1),那么x(6)= x(6)/2.0。我如何将它放入代码? 谢谢!在matlab中使用ode45解决一个条件系统

+0

请以数学形式陈述条件。 x(6)= x(6)/2.0作为一项任务是有意义的,但不是一种条件。 – 2015-07-04 02:29:07

+0

如果'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

+0

基本上,如果x(1)> 0.1,那么六个笛子就像正常那样求解,但是当它 Fred

这稍微从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那么它减半。

+0

谢谢你的所有建议。我终于在昨天得到了它的工作。 – Fred