在MATLAB ode45输出上设置条件(运行时)

时间:2013-03-28 14:58:41

标签: matlab ode

我正在使用ode45为许多不同的参数求解一个ODE系统(这些参数是微分方程的系数),我想找到解决方案比给定值更小(不大于)的参数。

我如何在ode45上设置条件,如果解决方案(对于某些参数)在解决系统时大于(给定)值时自动“检测”停止解决进一步的步骤

Jan建议在输入函数的定义中添加以下条件,以便int。我尝试了这个,但是它不起作用:经过几个步骤(虽然条件不正确)迭代很快就会结束,输出保持在某个数字不变。 (输出不正确)

(qm,U,V等是常数,X有4列)

[T,X]=ode45(@acceleration,tspan,x0);


function xprime=acceleration(T,X)
   size_X=length(X);
    xprime=zeros (4,1);
        if X(size_X,1)>threshold

  xprime(1)=0;
  xprime(2)=0;
  xprime(3)=0;
  xprime(4)=0;

        else

  xprime(1)=X(3);
  xprime(2)=X(4);
  xprime(3)=X(1)*X(4)^2 - 2*qm*(U+V*(cos(w*T)))*F1(num,X(1),X(2));
  xprime(4)= -2*X(3)*X(4)/X(1) - qm*((U+V*(cos(w*T)))/(X(1)))*F2(num,X(1),X(2));

        end
  end
  • 上述代码有什么问题?
  • 有人建议将监控功能附加到ode45。 (here)。有谁知道如何做到这一点? 感谢

2 个答案:

答案 0 :(得分:1)

我没有在Matlab ODE解算器中看到可能(错误)用于您的目的的内置选项。

但您可以相应地修改y' = f(t,y)中的右侧。我可能会想到

  • IF y > threshold THEN f(t,y) = 0 - 由于ODE45中的步长控制,这应该导致迭代的快速结束
  • 或者引发异常,只取消当前的迭代(不确定如何执行此操作;)

答案 1 :(得分:0)

您是在解决一组方程式还是试图随时间积分?没有更多信息,听起来你应该使用fsolve或fmincon?

如果您真的在进行集成,我认为您可以使用“事件”功能向ode45指示您要停止。气球示例可能会有所帮助。