【问题标题】:Error using fzero使用 fzero 时出错
【发布时间】:2018-07-09 23:56:11
【问题描述】:
我需要知道使用fzero 的曲线y= sin(r)+r.^2 的最小值。
我创建了一个函数:
function w=myfun(r)
w=diff(sin(r)+r.^2);
end
然后在命令窗口:
r=[-pi:.01:pi];
fzero( @myfun,0)
但总是有错误:
|| 和 && 运算符的操作数必须可转换为逻辑标量值。
fzero 中的错误(第 327 行)
elseif ~isfinite(fx) || ~isreal(fx)
fzero(@myfun,0)
我该怎么办?
【问题讨论】:
标签:
matlab
function
minimum
【解决方案1】:
diff 计算了有限差分导数(即邻居之间的差异)。这里,r 是标量,所以diff 返回一个空数组。
您需要定义您的函数myfun,使其返回给定单个值的导数。因此,您必须手动计算导数函数并将其写入myfun。
【解决方案2】:
正如 Cris 所说,您不能使用 diff,因为它会发现相邻点之间的差异(使用一个值,这种差异是未定义的。
相反,您可以执行以下操作之一
自己取导数:
function w=myfun(r)
w=cos(r)+2*r;
end
进行数值微分
function dw=myfun(r)
h = sqrt(eps);
wh=(sin(r+h)+(r+h).^2;
w= (sin(r)+(r).^2;
dw = (wh - w)/(h);
end
或者,使用数值最小化器
w= @(r) (sin(r)+(r).^2;
xmin = fminsearch(w,0);