将其他依赖于迭代的输入传递给ode45

时间:2019-05-19 10:40:43

标签: matlab parameters iteration anonymous-function ode45

我正在尝试使用ode45函数求解微分方程。考虑以下代码,

[t1,X2] = ode45(@(t,x)fun(t,x,C1,C2,C3,C4),t0,X01);

其中参数C1C2C3C4是列向量,ode45所引用的函数应该可以使用这些列向量({ {1}})。我希望值在每次迭代后都发生变化,例如,在开始时,我要输入的fun.m的条目是C1,在下一次迭代中的条目是C1(1),等等。 >

我该如何实现?

1 个答案:

答案 0 :(得分:1)

您可能已经注意到,official docs在这种情况下不是很有帮助(因为它们几乎迫使您使用global变量-可行,但不鼓励使用)。相反,我将向您展示如何使用类和函数句柄来完成此操作。请考虑以下内容:

classdef SimpleQueue < handle
  %SIMPLEQUEUE A simple FIFO data structure.

  properties (Access = private)
    data
    position
  end

  methods (Access = public)
    function obj = SimpleQueue(inputData)
      %SIMPLEQUEUE Construct an instance of this class
      obj.data = inputData;
      rewind(obj);
    end % constructor

    function out = pop(obj, howMany)
      %POP return the next howMany elements.
      if nargin < 2 
        howMany = 1; % default amount of values to return
      end
      finalPosition = obj.position + howMany;
      if finalPosition > numel(obj.data)
        error('Too many elements requested!');
      end      
      out = obj.data(obj.position + 1 : obj.position + howMany);
      obj.position = finalPosition;      
    end % pop

    function [] = rewind(obj)
      %REWIND restarts the element tracking
      % Subsequent calls to pop() shall return elements from the beginning.
      obj.position = 0;
    end % rewind
  end % methods  
end % classdef

如何使用它?简单:

C1q = SimpleQueue(C1);
C2q = SimpleQueue(C2);
C3q = SimpleQueue(C3);
C4q = SimpleQueue(C4);

[t1,X2] = ode45(@(t,x)fun(t,x,@C1.pop,@C2.pop,@C3.pop,@C4.pop),t0,X01);

然后,在fun内,您将使用C1()而不是C1