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

在MATLAB ode45输出上设置条件(运行时),matlab,ode,Matlab,Ode,我正在用ode45求解一个ode45系统的许多不同参数(这些参数是微分方程的系数),我想找到解小于(而不是大于)给定值的参数 我如何在ode45上设置一个条件,以便在解决系统问题时,自动“检测”解决方案(其中一些参数)是否大于该(给定)值,并停止解决进一步的步骤 Jan建议在输入函数的定义中加入以下条件,这样int就可以了。我试过了,但不起作用:经过几个步骤(尽管条件还不正确),迭代很快结束,输出保持在某个数字不变。(输出不正确) (qm、U、V等为常数,X有4列) 上面的代码有什么问题 有人

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

我如何在ode45上设置一个条件,以便在解决系统问题时,自动“检测”解决方案(其中一些参数)是否大于该(给定)值,并停止解决进一步的步骤

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

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

  • 上面的代码有什么问题
  • 有人建议在ode45上附加监控功能。() . 有人知道怎么做吗? 谢谢

我看不到Matlab ODE解算器中的内置选项可能(mis)用于您的目的

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

  • 如果y>阈值,则f(t,y)=0
    ——由于ODE45中的步长控制,这将导致迭代的快速结束
  • 或者引发一个仅取消当前迭代的异常(不确定如何执行;)

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


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

谢谢你的帮助。我以前在scicomp.stackexchange上问过这个问题,有人建议在ode45上附加一个监控功能。此处:。你现在知道怎么做了吗?我尝试了你的建议(正如我在问题中写的那样)。但它不起作用。(如上所述)这有什么问题?行为如预期。也许你的转换条件不对。是否要检查第四个部件?尝试检查尺寸X是否符合您的要求。。。
[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