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

How to save a variable from within the integration with ode113?

我有一个 ODE 要与 ode113 集成。在描述导数的函数中,我计算了一些我想要 "save" 的变量(存储到文件或数组中)。我该怎么做?

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

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

我想从 myfunc 中将 a 的值写入文件,但如您所见,myfunc 在实际存储独立变量的当前值之前被多次调用变量 t,最后我会得到两个不同大小的数组 at

这是您可以编写 myfunc 的一种方法。它将结果保存到全局向量 a,在每次调用 ode113. It uses a 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