【问题标题】:How to save a variable from within the integration with ode113?如何从与 ode113 的集成中保存变量?
【发布时间】:2018-01-02 01:44:35
【问题描述】:

我有一个要与 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

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

【问题讨论】:

  • 你为什么不对待类似于number_of_calls
  • @Wolfie:我想过做一些类似于附加到 a:a(end+1)=current_a; 但我仍然会有不同长度的 at。或者这不是你的意思?
  • @Wolfie:我认为问题在于 myfunc 在集成之前的某些初始化步骤中被调用了几次,因此它被调用的次数超过了返回的 t 和 @ 中的值987654336@ 数据。对吗,皮埃尔?
  • @Wolfie:是的,据我了解。 ode113 是一个变量-step 集成,所以我认为myfunc 在每一步之前被多次调用,以便实际计算当前的step 宽度。
  • a 可以在给定的t 上变化,那么您想要a哪个 值?在您的示例中也是字面意义上的2*y 吗?如果它是根据y 定义的,那么您可以事后计算...

标签: matlab numerical-integration


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2011-04-23
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多