Can you use ODE45 in a for loop?
1 回表示 (過去 30 日間)
古いコメントを表示
Hi there, I am having to solve a pair of coupled 1st ODEs. I also need to change the integration time like this:
ti = 0
tf = 10
timestep = 0.1
num = (tf-ti)/timestep;
timerange = linspace(ts,tf,num);
for i = 1:length(timespan)
tt = timerange(i); %defining the integration time start.
[t,x]=ode45('func',[tt:0.01:tf],[0,0]); %solving the coupled odes.
end
So what is happening is that I am changing the start integration in the [T0 TFINAL] vector. Is there a way that I can save all of the t's and the x's as a matrix/for each iteration so that I can plot all of the solutions to the coupled odes?
Thanks
0 件のコメント
採用された回答
Matt Tearle
2013 年 2 月 4 日
編集済み: Matt Tearle
2013 年 2 月 4 日
Given that ode45 is a variable step solver, you don't know how many t and x values you'll get each time, so the simplest solution would be to save them all in cell arrays:
n = length(timerange);
allx = cell(n,1);
allt = cell(n,1);
for i = 1:n
...
allx{i} = x;
allt{i} = t;
end
But if all you're trying to do is plot them all, why not just plot each one as you go? Use a hold on or hold all and then plot(t,x) in the loop.
(Also, [t,x] = ode45(@func,[tt... -- function handles are cooler than strings :) )
14 件のコメント
Matt Tearle
2013 年 2 月 6 日
I'm guessing you're using the code I provided to define the event (using a function handle in odeset). If so, the problem might be that you're using a string to define the ODE rate equations and a function handle to define the event function. Try changing your call to ode45 to
[t,x]=ode45(@cwfield,tt:0.01:tf,[0,0],opts);
(BTW, not going through 0 isn't a problem -- it just means the event won't ever be triggered, so ode45 will integrate until tf).
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!