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