Matlab:使用ode45导出变化变量,以在单独的函数文件中求解ODE

Matlab:使用ode45导出变化变量,以在单独的函数文件中求解ODE,matlab,ode,numerical-integration,Matlab,Ode,Numerical Integration,我在函数文件中保存了相当长的方程组,system3。我需要这个系统中的一个参数随时间变化。我创建了第二个函数,calculate_a1,它在我的401个时间点的每个时间点生成参数a1的向量 tResult = []; xResult = []; tStep = linspace(0,400,401); y0 = [IC]; alpha = calculate_a1(); for index = 2:numel(tStep) % Integrate:

我在函数文件中保存了相当长的方程组,
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
行之前,它工作得很好,但是我正在努力用
ode45
导出
a1
,以便可以使用它来解决
system3
。任何帮助都将不胜感激。

这行不通
ode45
需要在更多的时间点计算此参数。首先,您给出的时间列表仅确定输出,其值是从位于动态调整的采样时间点的内部采样中插值的。第二,每个内部时间步包括在时间步的不同部分对ODE函数的5次求值

您所能做的最好的方法是将
calculate_a1
后面的函数作为参数,以便在每次对ODE函数求值时,都能计算出与此精确时间对应的正确
a1


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

寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。您知道RHS(在您的案例中是system3)可以接受时间作为参数,对吗?为什么不能在system3函数中实现时间依赖性?“我需要这个系统中的一个参数随时间变化。”——如果它取决于自变量时间,那么根据定义它不是一个参数。如@LutzL所述,您可以在积分函数中使用插值–请参阅。如果“参数”仅在几个关键时间点发生变化,那么您可以尝试分段积分每个部分–请参见或。我如何将calculate_a1作为参数?a1的值不是计算出来的,它来自我收集的数据。目前,我有一个与tStep长度相同的向量,其中包含a1的所有值。抱歉,如果我以错误的方式问这些问题,我对MatLab和StackExchange都是新手!然后你需要通过插值来接受低效率,或者你手工编写了一个多步骤的方法来离散化
tStep
,我不记得见过库函数,如果不将步长减小到允许的最小值以下,且图为空,则错误
无法满足集成公差要求。这可能是由于使用插值还是我的ODE系统中的错误造成的?