如何从与 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
,最后我会得到两个不同大小的数组 a
和 t
。
这是您可以编写 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
我有一个 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
,最后我会得到两个不同大小的数组 a
和 t
。
这是您可以编写 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