如何从与ode113的集成中保存变量?

时间:2017-07-26 15:56:42

标签: matlab numerical-integration

我有一个与ode113集成的ODE。在描述衍生物的函数内部,我计算了一些我想“保存”的变量(存储到文件中或存储到数组中)。我怎么能这样做?

这是一个例子(改编自文档)。运行以下脚本:

global number_of_calls
number_of_calls = 0;

[t, y] = ode113(@myfunc, [0 10], 0);
plot(t,y,'-o')
fprintf('Number of calls of ''myfunc'': %d\n', number_of_calls)
fprintf('Number of elements of ''t''  : %d\n', length(t))

调用包含要集成的ODE的函数:

function dydt = myfunc(t, y)

global number_of_calls

dydt = 2*t;
a = 2*y; % <--- how can I save a?

number_of_calls = number_of_calls + 1;

end

我想写入a来自myfunc内部的值,但正如您所见,myfunc在实际存储自变量的当前值之前被多次调用, t,最后我会有两个不同大小的数组at

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式编写myfunc来执行此操作。它会将结果保存到全局向量a,在每次调用ode113之前必须将其设置为[]。它使用persistent variable来跟踪上一个时间步骤:

function dydt = myfunc(t, y)

  dydt = 2*t;
  temp = 2*y;  % Extra value to save

  global a
  persistent tPrevious
  if isempty(a)  % Initialize
    a = temp;
  elseif (t > tPrevious)  % Moving to a new time step, so add an element
    a = [a; temp];
  else  % Refining time step downwards or recomputing at the same time step
    a(end) = temp;
  end
  tPrevious = t;  % Store prior time step

end

你可以检查它是否正常工作:

global a;
a = [];
[t, y] = ode113(@myfunc, [0 10], 0);
isequal(2.*y, a)

ans =
  logical
   1       % a exactly equals 2.*y