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
这一切看起来都很棒。您有一个输入参数,并从父工作区引用 r 和 b。
现在当您调用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);