matlab : Nelder mead simplex 单纯形直接搜索算法;

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为单纯形直接搜索算法,可以对无约束多元函数进行寻优,不过该方法找到的解为局部最优解,优点在于能够对无导多元函数进行

优化处理;