matlab中函数句柄的操作

Operations with function handle in matlab

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

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

我想找到最佳的 lambda 表达式,使我的平均函数为零,对于该函数内的给定幂集。我尝试做但没有成功,因为它 returns 我对 'function_handle' 类型的输入参数的未定义运算符的错误是:

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

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

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;

我们会得到一个错误!

Undefined operator '^' for input arguments of type '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)))

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

Undefined operator .^ for input arguments of type 'function_handle'

所以我们需要将其包装到一个新函数中。

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

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

result = fzero(newfunc, lambda0);