MATLAB函数调用fzero报错:未识别变量p的问题求助
问题原因
你的报错是因为fzero调用的匿名函数无法访问到log_likelihood的输入参数p。虽然匿名函数理论上应该捕获定义时所在函数工作区的变量,但在部分场景下(比如函数被作为句柄传递给其他优化工具时),这种捕获会失效。最稳妥的解决方式是显式将p作为额外参数传递给匿名函数。
解决方案
修改fzero的调用方式,让匿名函数接收p作为参数,并通过fzero的额外参数机制传递进去:
function llik = log_likelihood(p) global d; N = length(d); % 显式将p作为参数传入匿名函数,并用fzero的额外参数传递 tau = fzero(@(t, p_val) (t - (t^2 * p_val + 1 - p_val) / (2 * (t * p_val + 1 - p_val))), [0,1], [], p); loglik = 0; for i = 1 : N % 修正原代码中的括号错误(原逻辑的括号位置会导致计算错误) loglik = loglik + log(isnan(d(i))*(1 - p*(1 - tau)) + ~isnan(d(i))*p*(1 - tau)); end llik = loglik / N; end
额外说明
- 原代码中
log内的表达式存在括号错误:isnan(d(i)) * (1 - p*(1-tau) + ~isnan(d(i))*p*(1-tau))会导致错误的权重计算,修正为分情况相加的逻辑(当d(i)为NaN时取1-p*(1-tau),否则取p*(1-tau))。 fzero的第四个参数及之后的参数会被传递给匿名函数作为额外输入,这里我们将p传递给匿名函数的p_val参数,确保作用域正确。
内容的提问来源于stack exchange,提问作者SZ2022
相关产品推荐
相关产品推荐

