MATLAB:将 class 函数句柄传递给 ode45()?
MATLAB: Pass class function handle to ode45()?
我有一个 class 函数,它使用 ODE45 来求解一些方程。我还有另一个私有 class 函数,它代表 ODE45 需要求解的 odefunction。但是,我不知道如何将 class 的 ode 函数的句柄传递给 ODE45。这是示例代码:
class ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@ODEFunction, t, y0);
end
end
methods (Access = private)
function dy = ODEFunction(t,y)
% Calculate dy here.
end
end
end
当我 运行 这个时,我收到一条错误消息:
Undefined function 'ODEFunction' for input arguments of type 'double'.
如果我将 ODEFunction 移出 class 并将其放入自己的 *.m 文件中,代码 运行 就可以了。我也试过在 ode45 调用中使用“@obj.ODEFunction”,但它说:
Too many input arguments.
将 ODEFunction 保留在我的 class 中并且仍然能够将其句柄传递给 ode45 的最佳方法是什么?
你的私有ODEFunction
不是静态方法,所以你应该这样写:
classdef ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@(tt, yy)obj.ODEFunction(tt, yy), t, y0);
end
end
methods (Access = private)
function dy = ODEFunction(obj, t,y)
dy = 0.1; % Calculate dy here.
end
end
end
注意:您还忘记将 obj
作为 private ODEFunction
的第一个参数传递...我正在使用静态方法编写示例,并在测试后将其粘贴到此处。
编辑
如果您打算在 class 中使用 private static ODEFunction
:
,请按以下方式编写内容
classdef ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@(tt, yy)ODESolver.ODEFunction(tt, yy), t, y0);
end
end
methods (Static, Access = private)
function dy = ODEFunction(t,y)
dy = 0.1; % Calculate dy here.
end
end
end
我有一个 class 函数,它使用 ODE45 来求解一些方程。我还有另一个私有 class 函数,它代表 ODE45 需要求解的 odefunction。但是,我不知道如何将 class 的 ode 函数的句柄传递给 ODE45。这是示例代码:
class ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@ODEFunction, t, y0);
end
end
methods (Access = private)
function dy = ODEFunction(t,y)
% Calculate dy here.
end
end
end
当我 运行 这个时,我收到一条错误消息:
Undefined function 'ODEFunction' for input arguments of type 'double'.
如果我将 ODEFunction 移出 class 并将其放入自己的 *.m 文件中,代码 运行 就可以了。我也试过在 ode45 调用中使用“@obj.ODEFunction”,但它说:
Too many input arguments.
将 ODEFunction 保留在我的 class 中并且仍然能够将其句柄传递给 ode45 的最佳方法是什么?
你的私有ODEFunction
不是静态方法,所以你应该这样写:
classdef ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@(tt, yy)obj.ODEFunction(tt, yy), t, y0);
end
end
methods (Access = private)
function dy = ODEFunction(obj, t,y)
dy = 0.1; % Calculate dy here.
end
end
end
注意:您还忘记将 obj
作为 private ODEFunction
的第一个参数传递...我正在使用静态方法编写示例,并在测试后将其粘贴到此处。
编辑
如果您打算在 class 中使用 private static ODEFunction
:
classdef ODESolver < handle
methods (Access = public)
function obj = RunODE(obj, t, y0)
[~, Z] = ode45(@(tt, yy)ODESolver.ODEFunction(tt, yy), t, y0);
end
end
methods (Static, Access = private)
function dy = ODEFunction(t,y)
dy = 0.1; % Calculate dy here.
end
end
end