function [ param ] = NeldSearch( param ) %NERDSEARCH 此处显示有关此函数的摘要 % nelder mead simplex 单纯形直接搜索算法; %param r,g,b 初始三角形顶点; %% initPts = [param.b;param.g;param.w]; if(sum(max(initPts) - min(initPts)) < 1e-5) param.solve = mean(initPts); return; end if( ~isfield(param,'b') || ~isfield(param,'g') || ~isfield(param,'w') ) disp('输入参数不正确'); return; end %先排序; fvals = [func(param.b) func(param.g) func(param.w)]; [newSort,Index]= sort(fvals); %默认升序; %确定b,g,w; param.b = initPts(Index(1),:); param.g = initPts(Index(2),:); param.w = initPts(Index(3),:); param.m = (param.b + param.g)/2; param.r = 2 * param.m - param.w; if( func(param.r) < func(param.g) ) param = CaseI(param); else param = CaseII(param); end param = NeldSearch(param); %递归; disp('--END--'); end function param = CaseI(param) if(func(param.b) < func(param.r) ) param.w = param.r; else param.e = 2 * param.r - param.m; if(func(param.e) <func(param.b)) param.w = param.e; else param.w = param.r; end end end function param = CaseII(param) if( func(param.r) < func(param.w) ) param.w = param.r; end param.c = (param.w + param.m)/2; if( func(param.c) < func(param.w) ) param.w = param.c; else param.s = (param.b + param.w)/2; param.w = param.s; param.g = param.m; end end function f = func(point) x= point(1); y= point(2); f = x * x - 4 * x + y * y - y - x * y; end
Nelder mead simplex为单纯形直接搜索算法,可以对无约束多元函数进行寻优,不过该方法找到的解为局部最优解,优点在于能够对无导多元函数进行
优化处理;