2

我正在用 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 上附加一个监控功能。(这里)。有谁知道如何做到这一点?谢谢
4

2 回答 2

1

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

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

  • IF y > threshold THEN f(t,y) = 0-- 由于 ODE45 中的步长控制,这应该会导致迭代快速结束
  • 或引发异常,仅取消当前迭代(不知道如何执行此操作;)
于 2013-03-28T17:10:40.927 回答
0

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

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

于 2013-03-29T15:38:02.097 回答