我需要使用y= sin(r)+r.^2
知道曲线fzero
的最小值。
我创建了一个函数:
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)
我该怎么办?
答案 0 :(得分:1)
diff
计算了有限差分导数(即邻居之间的差异)。这里,r
是标量,因此diff
返回一个空数组。
您需要定义函数myfun
,以便返回给定单个值的导数。因此,您必须手动计算衍生函数并将其写入myfun
。
答案 1 :(得分:1)
正如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);