フィルターのクリア

Time varying force with ode23

2 ビュー (過去 30 日間)
Christo van Rensburg
Christo van Rensburg 2020 年 4 月 25 日
Hi there
I have the following code:
tf = 1;
t = linspace(0,3);
Ft = zeros(length(t),1);
% Here I generate the force values at different time intervals.
for i = 1:length(t)
if t(i) <= tf
Ft(i) = Fo*sin(2*pi*t(i)/tf);
elseif t(i) > tf
Ft(i) = 0;
end
end
ic = [0, 0]; % Initial conditions
dXdt = @(t, x) [x(2);
Ft * 1/(m1+m2)];
[t, x] = ode23(dXdt, [0, 3], ic);
I'm struggling to incorportate this time varying force F(t) into the ode23 function.
Any help as to how I can maybe get this done?
Thanks in advance!

採用された回答

darova
darova 2020 年 4 月 25 日
Use function handle
Ft = @(t) (t<=tf)*Fo*sin(2*pi*t/tf);
dXdt = @(t, x) [x(2);
Ft(t) * 1/(m1+m2)];
  2 件のコメント
Walter Roberson
Walter Roberson 2020 年 4 月 25 日
That would work if the driving force was not discontinuous.
Christo van Rensburg
Christo van Rensburg 2020 年 4 月 25 日
It seems to work though.
Walter I'll try your method now, because what you're saying makes sense.
Thanks for the help!

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

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2020 年 4 月 25 日
You cannot do that the way you want. The ode* routines cannot handle discontinuities in the driving functions. You need to break it up into two time periods, one with the force and one without the force.
tf = 1;
dXdt_F = @(t, x) [x(2); Fo*sin(2*pi*t/tf) / (m1+m2)];
dXdt_NF = @(t, x) [x(2); 0];
ic = [0, 0]; % Initial conditions
[t1, x1] = ode23(dXdt_F, [0, tf], ic);
ic2 = x1(end,:);
[t2, x2] = ode23(dXdt_NF, [tf, 3], ic2);
t = [t1; t2(2:end)];
x = [x1; x2(2:end,:)];
  1 件のコメント
Christo van Rensburg
Christo van Rensburg 2020 年 4 月 25 日
Both methods seem to work fine.
Thanks guys.

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

カテゴリ

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