1

我有一个使用 ODE45 解决一些方程的类函数。我还有另一个私有类函数,它代表 ODE45 需要解决的 odefunction。但是,我不知道如何将类的 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 移出类并将其放入自己的 *.m 文件中,则代码运行良好。我也试过在 ode45 调用中使用“@obj.ODEFunction”,但它说:

Too many input arguments.

将 ODEFunction 保留在我的班级中并且仍然能够将其句柄传递给 ode45 的最佳方法是什么?

4

1 回答 1

2

您的私有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私有的第一个参数ODEFunction...我正在使用静态方法编写示例,并且一旦测试就会将其粘贴到此处。

编辑

如果您打算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
于 2015-02-13T17:53:39.173 回答