【问题标题】:MATLAB: Pass class function handle to ode45()?MATLAB:将类函数句柄传递给 ode45()?
【发布时间】:2015-02-13 17:34:53
【问题描述】:

我有一个使用 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 的最佳方法是什么?

【问题讨论】:

    标签: matlab oop function-handle


    【解决方案1】:

    你的私有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
    

    【讨论】:

    • 太棒了,午饭后试试。 (tt, yy)的意义是什么?
    • 这是一种便于准备的语法糖。就个人而言,当我编写匿名方法时,我更喜欢编写 @(*parameters as passed by the caller*)MyFunction(*parameters that i want to effectively pass to MyFunction*) .... 这也适用于 varargin 和局部范围变量:@(varargin)MyFunction(localScopeVariable, varargin{end:-1:1})
    • 这里还有更多关于为什么将@MyClass.MyMethod与静态方法和@obj.MyMethod(或@(varargin)MyMethod(obj, varargin{:}))与非静态方法一起使用的详细信息:fr.mathworks.com/help/matlab/matlab_oop/…
    • 感谢您提供的所有信息。刚刚试了一下,效果很好!
    • 不客气......你会看到,随着时间的推移,编写匿名函数变得更加容易...... ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2023-03-17
    • 2014-04-10
    • 2020-02-23
    相关资源
    最近更新 更多