【问题标题】:Matlab: Export changing variable with ode45 to solve ODE in separate function fileMatlab:使用 ode45 导出更改变量以在单独的函数文件中求解 ODE
【发布时间】:2016-01-06 06:42:18
【问题描述】:

我在函数文件system3 中保存了相当长的方程组。我需要这个系统中的一个参数随时间变化。我创建了第二个函数calculate_a1,它在我的 401 个时间点中的每个时间点生成参数 a1 的向量。

  tResult = []; 
  xResult = []; 
  tStep = linspace(0,400,401); 
  y0    = [IC]; 
  alpha = calculate_a1();

  for index = 2:numel(tStep)

  % Integrate:

  a1 = alpha(1,index);
  t    = tStep(index-1:index);
  sol = ode45(@system3,t,y0,a1)

  % Collect the results:

  tResult = cat(1, tResult, t);
  xResult = cat(1, xResult, x);

  % Final value of x is initial value for next step:

  y0 = x(end, :);

  end

直到sol 行,这工作正常,但我正在努力导出a1ode45,以便它可以用来解决system3。任何帮助将不胜感激。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及 在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。
  • 您知道 RHS(在您的情况下是 system3)可以接受时间作为参数吗?为什么不能在 system3 函数内部实现时间依赖? se.mathworks.com/help/matlab/ref/ode45.html?refresh=true
  • “我需要这个系统中的一个参数来随时间改变。” – 如果它取决于自变量时间,那么根据定义,它不是参数。正如@LutzL 所提到的,您可以在积分函数中使用插值 - 请参阅this question/answer for an example。如果“参数”仅在几个关键时间点发生变化,那么您可以尝试分段整合每个部分——请参阅 herehere

标签: matlab ode numerical-integration


【解决方案1】:

那是行不通的。 ode45 需要在更多时间点评估此参数。首先,您提供的时间列表仅确定输出,其值是从位于动态调节的样本时间点的内部样本中插值的。其次,每个内部时间步都包含在时间步的不同部分对 ODE 函数的 5 次评估。

您能做的最好的就是将calculate_a1 后面的函数作为参数,这样在每次ODE 函数的评估中,都可以计算出与这个确切时间相对应的正确a1

插值不是一个好主意,因为在节点处,步长调节器将“感觉到”有限的平滑度作为系统的刚度,从而将步长调节下来,这大大增加了计算时间和浮点误差的累积.

【讨论】:

  • 我将如何将 calculate_a1 作为参数? a1 的值不是计算出来的,它来自我收集的数据。目前,我有一个与 tStep 长度相同的向量,其中包含 a1 的所有值。抱歉,如果我以错误的方式提出这些问题,我对 MatLab 和 StackExchange 的世界都是新手!
  • 那么你需要通过插值来接受低效率,或者你手动编写一个多步方法来离散化tStep,我不记得看到过相关的库函数。
  • 使用插值运行代码,我得到错误Unable to meet integration tolerances without reducing the step size below the smallest value allowed 和一个空图! .这可能是由于使用了插值还是我的 ODE 系统中的错误?
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多