我有一个函数J(x,y,z),它给出了这些坐标的结果。这个函数是凸的。我需要的是找到这个巨大矩阵的最小值。 起初我试图遍历所有这些,计算然后用min函数搜索,但这需要太长时间......
所以我决定利用凸性。
随机(现在)采用一组坐标,这将是我的小3x3x3矩阵的中心,找到局部最小值并使其成为下一个矩阵的中心。这将持续到我们达到全球最低标准。
另一个问题是函数不是完全凸起的,所以这个问题也可以出现
所以我正在考虑一个控制措施,当它找到一个假的最小值时,增加搜索范围以确保它。 你怎么建议我跟它一起去?这种做法好吗?或者我应该研究其他什么?
这是我自己开始的,但我对Matlab相当新,我不知道如何继续。
clear all
clc
min=100;
%the initial size of the search matrix 2*level +1
level=1;
i=input('Enter the starting coordinate for i (X) : ');
j=input('Enter the starting coordinate for j (Y) : ');
k=input('Enter the starting coordinate for k (Z) : ');
for m=i-level:i+level
for n=j-level:j+level
for p=k-level:k+level
A(m,n,p)=J(m,n,p);
if A(m,n,p)<min
min=A(m,n,p);
end
end
end
end
display(min, 'Minim');
[r,c,d] = ind2sub(size(A),find(A ==min));
display(r,'X');
display(c,'Y');
display(d,'Z');
对任何指导,改进和建设性批评表示赞赏。提前致谢。
答案 0 :(得分:1)
尝试使用fminsearch
,因为它非常通用且易于使用。如果您可以匿名指定您的功能,这将特别容易。例如:
aFunc = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
然后使用fminsearch
:
[x,fval] = fminsearch( aFunc, [-1.2, 1]);
如果您的三维函数J(x,y,z)可以匿名描述或作为常规函数描述,那么您可以尝试fminsearch
。输入采用向量,因此您需要将函数写为J(X),其中X是长度为3的向量,因此x = X(1),y = X(2),z = X(3)
fminseach
可能会失败。通常最好改进初始起点。例如,下面的代码围绕起始矢量采样补丁,通常可以提高找到全局最小值的几率。
% deltaR is used to refine the start vector with scatter min search over
% region defined by a path of [-deltaR+starVec(i):dx:deltaR+startVec(i)] on
% a side.
% Determine dx using maxIter.
maxIter = 1e4;
dx = max( ( 2*deltaR+1)^2/maxIter, 1/8);
dim = length( startVec);
[x,y] = meshgrid( [-deltaR:dx:deltaR]);
xV = zeros( length(x(:)), dim);
% Alternate patches as sequential x-y grids.
for ii = 1:2:dim
xV(:, ii) = startVec(ii) + x(:);
end
for ii = 2:2:dim
xV(:, ii) = startVec(ii) + y(:);
end
% Find the scatter min index to update startVec.
for ii = 1: length( xV)
nS(ii)=aFunc( xV(ii,:));
end
[fSmin, iw] = min( nS);
startVec = xV( iw,:);
fSmin = fSmin
startVec = startVec
[x,fval] = fminsearch( aFunc, startVec);
You can run a 2 dimensional test case f(x,y)=z on AlgorithmHub。该应用程序在Octave中运行上面的代码。您也可以在此网站上编辑内联功能(甚至可以尝试解决您的问题)。