一、介绍
fminunc
是 MATLAB 中用于求解无约束多变量非线性优化问题的函数。它尝试找到给定函数的最小值点,不需要用户提供函数的导数信息(尽管如果提供了导数信息,算法通常会更快更准确地收敛)。fminunc
使用的是拟牛顿法(Quasi-Newton methods),特别是 BFGS 算法,这是处理无约束优化问题的一种有效方法。
二、函数语法
fminunc
的基本语法如下:
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
[x,fval] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)
fun
是待优化的函数,它接受一个向量x
作为输入,并返回一个标量,即函数在x
处的值。如果提供了梯度(导数),fun
也可以返回两个输出:函数值和梯度向量。x0
是搜索的起始点,一个n维向量。options
是用于控制优化过程的选项结构体(可选)。x
是找到的最小值点。fval
是在x
处的函数值。exitflag
描述了算法退出的条件。output
提供了优化过程的详细信息。grad
在函数fun
返回梯度时可用,是在x
处的梯度值(可选输出)。hessian
是x
处的 Hessian 矩阵的近似值(如果算法计算了 Hessian,并且options.Hessian
设置为'on'
,则为可选输出)。
三、示例
假设我们想要找到函数 f(x,y)=x^2+y^2 的最小值点,这个函数有一个全局最小值在 (0,0)。我们可以定义这个函数并使用
fminunc
来找到它的最小值点:
function f = myfun(x)
f = x(1)^2 + x(2)^2;
end
% 初始猜测
x0 = [1, 1];
% 执行fminunc
[x_min, fval] = fminunc(@myfun, x0);
% 显示结果
disp(['最小值点: ', num2str(x_min)]);
disp(['最小值: ', num2str(fval)]);
在这个例子中,
@myfun
是一个指向我们定义的myfun
函数的句柄,x0
是我们选择的初始点。fminunc
会从x0
开始搜索,并返回它找到的最小值点x_min
和该点处的函数值fval
。
四、注意
请注意,虽然
fminunc
不要求提供梯度信息,但如果你知道函数的梯度,并且能够以有效的方式计算它,那么将梯度信息提供给fminunc
可以显著提高算法的性能。这可以通过在fun
函数中返回函数值和梯度向量来实现,或者通过设置options
结构体中的相应字段来指定梯度函数。
结语
山高自有客行路
水深自有渡船人
!!!