Передача дополнительных зависящих от итерации входных данных в ode45 - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь решить дифференциальное уравнение, используя функцию ode45. Рассмотрим следующий код,

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

где параметры C1, C2, C3 и C4 - векторы столбцов, которые должны быть доступны для функции, на которую ссылается ode45 (fun.m). Я хочу, чтобы значения менялись после каждой итерации, поэтому, например, в начале запись C1, которую я хочу ввести, - C1(1), на следующей итерации - C1(2) и т. Д.

Как я могу это реализовать?

1 Ответ

1 голос
/ 19 мая 2019

Возможно, вы заметили, что официальные документы не слишком полезны в этом сценарии (поскольку они в значительной степени вынуждают вас использовать 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.

...