fzero
接受函数句柄作为第一个输入。正如你现在所拥有的,你试图通过一个声明作为第一个输入。这个语句甚至无法正确评估,因为您正在尝试对函数句柄执行数字操作(稍后会详细介绍)。
你需要,而不是做这样的事情,我们创建一个新的功能手柄,用于评估原功能处理和执行你所需要的其他操作。
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试图将^
操作适用于功能手柄本身,而不是评价功能的值处理。
相反,我们需要创建一个新功能手柄,基本上包装了另一个并执行任何附加选项:
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)))
就像我们刚刚出现,这将导致一个非常类似的错误
Undefined operator .^ for input arguments of type 'function_handle'
因此,我们需要包装成一个新的功能这一点。
newfunc = @(lambda)mean((r - b)*r1(lambda).^(1/(a - 1)));
现在我们可以安全地通过这fzero
。
result = fzero(newfunc, lambda0);
非常感谢你,它的工作! – Astrid
谢谢您的额外解释,它真的帮助我了解手头问题背后的机制。 – Astrid
我有一个后续问题:是否可以使用fzero来限制[0,1]中的lambdas的值? – Astrid