参考代码:
beta=[0.352857611372806 0.147037574095378 0.104674909015145 0.646763721286202 0.432786865123937 0.184573723821254 -72.2558042754852 -221.318306468610 -105.099496331776 -92.1692117077900 3.01793432332517 38.8257158044091 8.33224554279042 4.74414058982192 159.315211549941];
bb=beta;
f(x)=@(x)bb(15)+bb(1)*(x(1)*x(2))+bb(2)*(x(1)*x(3))+bb(3)*(x(1)*x(4))+bb(4)*(x(2)*x(3))+bb(5)*(x(2)*x(4))+bb(6)*(x(3)*x(4))+bb(7)*x(1)+bb(8)*x(2)+bb(9)*x(3)+bb(10)*x(4)+bb(11)*(x(1).^2)+bb(12)*(x(2).^2)+bb(13)*(x(3).^2)+bb(14)*(x(4).^2);%函数形式
lb = [5 1 1 2];
ub = [23 5.5 14.5 20];
% 初值
x0 = (lb+ub)/2;
opt = optimset('Display','off');
warning off optim:fmincon:SwitchingToMediumScale
% 求最小值
[x,fval,exitflag] = fmincon(fx,x0,[],[],[],[],lb,ub,[],opt);
fprintf('\nMin f(x) = %.5g, at x = %s, EXITFLAG = %i\n', fx(x), mat2str(x,5), exitflag);
% 求最大值
[x,fval,exitflag] = fmincon(@(x)-fx(x),x0,[],[],[],[],lb,ub,[],opt);
fprintf('Max f(x) = %.5g, at x = %s, EXITFLAG = %i\n', fx(x), mat2str(x,5), exitflag);
求得结果:
Min f(x) = -1300.6, at x = [11.505 2.6958 5.9972 9.3475], EXITFLAG = 5
Max f(x) = 627.87, at x = [23 5.5 14.5 20], EXITFLAG = 1
根据运行情况,最小值与初值选择关系不大,而最大值对初值比较敏感,选择不同的初值可能会收敛到不同的局部极值点。可以把初值改为
x0 = lb + rand(1,4).*(ub-lb);
多试几次。
x1=11.505267,x2= 2.695821, x3=6, 5.9971159, x4=9.3474538
Z=1300.58433018611 最大值
x1=5., x2= 5.5, x3=1., x4=2.
Z=411.244821379153 最小值
什么控制算法?