我有一个与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
,最后我会有两个不同大小的数组a
和t
。
答案 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