我正在努力理解以下代码是如何优化目标函数的。
我想,如果我使用向量作为fminsearch的输入,如下所示,结果"Kp"应该会给我目标函数最小化的点。
例如,Kp[1]应该给我一个点,在这个点上,对于给定的K[1]和Z[1],目标函数是最小化的。所以它只是求解一元函数。
但如果我有如下的目标函数。Kp[4]也应该影响Kp[1],因为函数内部有flipud(Vs(,反之亦然。
fminsearch仍然给了我结果,没有显示任何错误信息。
如果是这样的话,fminsearch到底能最小化什么?对于给定的K[1]和Z[1],Kp[1]是否仍然最小化目标函数?
在没有flipud(Vs(的情况下,fminsearch是否将其视为多变量优化问题,而不是单变量优化问题?
如果是这样的话,fminsearch如何最小化目标函数,因为在这种情况下有不止一个方程要最小化?
clear
clc
R = 1.008;
sig = 0.75;
tempkgrid = linspace(-2,6,2)';
K = [tempkgrid ; tempkgrid];
Z = [2*ones(2,1);4*ones(2,1)];
aconst1 = -2*ones(4,1);
aconst2 = 6*ones(4,1);
const = R * (K + Z);
obj = @(Vs) -((1/(1-1/sig)) * ((Z + K - Vs./R) > 0) .* (Z + K - Vs./R).^(1-1/sig) + flipud(Vs));
Kp = fminsearchbnd(@(c) norm(obj(c)) ,aconst1, aconst1, const);
当输入是向量时,fminsearch
解决了多变量最小化问题。换句话说,它最小化了一个多变量函数,例如
f(x1,x2,x3,…(
不是同时最小化多个单变量函数
f(x1,x2=x2_0,x3=x3_0,…(,
f(x1=x1_0,x2,x3=x3_0,…(,
f(x1=x1_0,x2=x2_0,x3,…(,…
为了了解它是如何在N维空间中找到局部极小值的,它有助于理解梯度下降法的思想。尽管fminsearch
使用了不同的算法(Nelder-Mead方法(,但所有最小化方法背后的基本思想是相似的。
它的wiki页面提供了一个很好的梯度下降方法:
一个困在山上的人正试图下山(即试图找到全局最小值(。
雾很大,所以看不见下山的路;他们必须使用本地信息来找到最小值。
他们可以使用梯度下降法:
查看当前位置的山丘陡峭程度,然后朝着最陡的下降方向前进(即下坡(。使用这种方法,他们最终会找到下山的路,或者可能陷入某种"困境";"洞";(即局部最小值或鞍点(,就像一个山湖。
fminsearch
使用Nelder-Mead单纯形算法,您可以在matlab的参考页面或其wiki页面上查看它。