matlab中使用函数句柄的操作

时间:2016-03-18 13:07:18

标签: matlab equation-solving function-handle

请您帮我解决以下问题:我有以下功能句柄:

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

对于该函数中给定的一组幂,我想找到最优的lambdas,它将平均函数设置为零。我尝试做了什么并且没有工作,因为它为未定义的运算符返回了一个错误,输入参数类型为' function_handle'是:

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

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

1 个答案:

答案 0 :(得分:1)

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

你需要做一些类似的事情,我们创建一个 new 函数句柄来评估原始函数句柄并执行你需要的其他操作。

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);