フィルターのクリア

Change parameter value during ode15s solution

2 ビュー (過去 30 日間)
gorilla3
gorilla3 2018 年 8 月 23 日
コメント済み: gorilla3 2018 年 8 月 23 日
Hi,
I'm solving a set of differential equations and I'd like to change the value of a constant (Pin) at a specific time during the solution. Meaning that during the timespan, I'd like to change the value of Pin. So it time>10, Pin=70, else Pin=60.
This is how I formulated it but it's not working:
tspan=0:0.1:100;
cond= [...];
[t,y] = ode15s(@fun2,tspan, cond,[]);
function dydt= fun2(t,y)
for i=1:1:length(tspan)
if tspan(i)<10
Pin=60;
else
Pin=70;
end
end
...
end

採用された回答

Torsten
Torsten 2018 年 8 月 23 日
function dydt= fun2(t,y)
...
if t<10
Pin=60;
else
Pin=70;
end
...
Better use the EVENT-facility of the ODE solvers than the if-construction.
Best wishes
Torsten.
  3 件のコメント
Steven Lord
Steven Lord 2018 年 8 月 23 日
In this case I wouldn't use the events functionality. I tend to recommend that when you don't know at write-time when the events you're looking for will occur. In this case, you know exactly when it will occur: at t = 10.
Therefore I'd solve this problem twice. The first call to ode15s would solve from t = 0 to t = 10. I'd use the final result of that call to generate the initial conditions for the second call to ode15s, running from t = 10 to t = 100. Doing so would be easier with a slightly different function signature:
function dydt= fun2(t,y,Pin)
and specifying an anonymous function as the ODE function.
@(t, y) fun2(t, y, desiredValueOfPinForThisOde15sCall)
Replace desiredValueOfPinForThisOde15sCall with 60 or 70 depending on whether you're passing this anonymous function into the first or second ode15s call.
gorilla3
gorilla3 2018 年 8 月 23 日
thanks for the suggestion but this gives me an "instantaneous" response. Meaning that the solutions for (Pin=60, t<10) and (Pin=70, t>10) are just joined together but there's no information on the transition / adaptation of the system to this change. (see fig instant.jpg)
If, instead, I solve it all in one go, using the if-else within the function I can see the transition yet it's a linear jump. What I meant with my initial question is: is there a way to get more data points so that the plot would be a curve rather than these coarse lines? Indeed, the ode15s solver provides me only with 44 solution points, despite the tspan being of 1001. (see fig 10sreponse.jpg)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeProgramming についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by