将附加的依赖于迭代的输入传递给 ode45
Passing additional iteration-dependent inputs to ode45
我正在尝试使用 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)
,等等
我该如何实现?
您可能已经注意到 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,@C1q.pop,@C2q.pop,@C3q.pop,@C4q.pop),t0,X01);
如您所见,在 fun
中我们使用 C1q()
而不是 C1
。
我正在尝试使用 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)
,等等
我该如何实现?
您可能已经注意到 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,@C1q.pop,@C2q.pop,@C3q.pop,@C4q.pop),t0,X01);
如您所见,在 fun
中我们使用 C1q()
而不是 C1
。