【问题标题】:Operations with function handle in matlabmatlab中函数句柄的操作
【发布时间】:2016-03-18 13:07:17
【问题描述】:

您能帮我解决以下问题吗:我有以下函数句柄:

r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data

对于该函数中给定的一组幂,我想找到将平均函数设置为零的最佳 lambda。我试图做但没有奏效,因为它返回了一个错误,即未定义运算符的输入参数类型为“function_handle”是:

lambda0 = 0.3;
for a = 2:10    %power coefficient
S1(a) = fzero(mean((r - b)*r1.^(1/(a - 1))),lambda0);
end

非常感谢任何有关如何解决此问题的建议!提前谢谢你。

【问题讨论】:

    标签: matlab equation-solving function-handle


    【解决方案1】:

    fzero 接受函数句柄作为第一个输入。正如您目前拥有的那样,您正在尝试将语句作为第一个输入传递。甚至无法正确评估此语句,因为您正在尝试对函数句柄执行数字运算(稍后会详细介绍)。

    您需要做这样的事情,我们创建一个 new 函数句柄来评估 original 函数句柄并执行您需要的其他操作。

    S1(a) = fzero(@(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))),lambda0);
    

    进一步说明

    对函数句柄执行操作与对结果执行操作相同。

    例如,如果我们有一个函数句柄:

    func = @(x)2*x;
    

    如果我们对此进行评估,则使用x 的输入值调用它

    func(2)
    
        4
    

    这符合我们的预期。如果现在我们真的想要 (2*x)^2 的值,我们可以尝试按照您在问题中编写语句的方式编写它

    func2 = func^2;
    

    我们会得到一个错误!

    “function_handle”类型的输入参数的未定义运算符“^”。

    这不起作用,因为 MATLAB 尝试将^ 操作应用于函数句柄本身,而不是计算函数句柄的值

    相反,我们需要创建一个 new 函数句柄,该句柄基本上包装了另一个函数句柄并执行任何附加选项:

    func2 = @(x)func(x)^2;
    func2(2)
    
        16
    

    把它全圈起来

    因此,如果我们回到您的问题,您将匿名函数 r1 定义为这样。

    r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data
    

    这一切看起来都很棒。您有一个输入参数,并从父工作区引用 rb

    现在当您调用fzero 时,您会尝试对该函数句柄执行操作,以期创建一个新的函数句柄。

    mean((r - b)*r1.^(1/(a - 1)))
    

    就像我们刚刚展示的那样,这将导致非常相似的错误

    “function_handle”类型的输入参数的未定义运算符 .^

    所以我们需要把它包装成一个新的函数。

    newfunc = @(lambda)mean((r - b)*r1(lambda).^(1 / (a - 1)));
    

    现在我们可以安全地将其传递给fzero

    result = fzero(newfunc, lambda0);
    

    【讨论】:

    • 感谢您的额外解释,它确实帮助我理解了手头问题背后的机制。
    • 我有一个后续问题:是否可以使用 fzero 约束 [0,1] 中的 lambda 值?
    • @Astrid 您将传递 lambda 的 [lower, upper] 边界作为第二个输入,而不是指定 lambda0The Documentation
    • 感谢您的快速回复。如果我将 lambda0 替换为 [0,1],则会收到以下错误:Error using fzero (line 273) The function values at the interval endpoint must have different in sign.
    • @Astrid 是的。检查上面的文档链接,它解释了为什么会这样。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多