一、程序目的和要求
1.掌握无约束优化问题求解;
2.了解线性约束问题求解。
二、实验内容和步骤(写出实验的步骤、方法和所得结果)
1.求函数的最大值。
程序:
clear;
clc;
x1=0;
x2=2;
[x,fval]=fminbnd('-(1+x^2)/(1+x^4)',x1,x2);
fval=-fval;
fprintf('f(x)在x=%f处取得最大值f(%f)=%f\n',x,x,fval);
运行结果:
f(x)在x=0.643604处取得最大值f(0.643604)=1.207107
2.已知,求的单调递增区间和极值。
程序:
clear;
clc;
x1=0;
x2=0.5*pi;
f='-2*sin(x)-cos(2*x)';
[x01,fval1]=fminbnd(f,x1,x2);
fval1=-fval1;
[x02,fval2]=fminbnd(f,x1,x2);
fprintf('y的单调递增区间为:[%f,%f],极大值点x=%f,极大值y=%f,极小值点x=%f,极小值y=%f\n',x1,x01,x01,fval1,x02,fval2);
运行结果:
y的单调递增区间为:[0.000000,0.523583],极大值点x=0.523583,极大值y=1.500000,极小值点x=0.523583,极小值y=-1.500000
3.在区间内,求的极值点和单调区间。
程序:
clear;
clc;
x0=[30 50];
fplot(@(x)5.*sin(x)-2.*log10(x)./log10(3)+1.8,x0);
x11=[31,38,44];
x12=[33,40,46];
x21=[35,42,48];
x22=[37,44,50];
for i=1:1:3
[x1(i),fval1(i)]=fminbnd(@(x)-5.*sin(x)+2.*log10(x)./log10(3)-1.8,x11(i),x12(i));
[x2(i),fval2(i)]=fminbnd(@(x)5.*sin(x)-2.*log10(x)./log10(3)+1.8,x21(i),x22(i));
end
fprintf('f(x)的极大值点:');
disp(x1);
fprintf('%c',8);
fprintf('f(x)的极小值点:');
disp(x2);
fprintf('%c',8);
jd=[x1,50];
jx=[30,x2];
fprintf('f(x)的单调增区间:');
for i=1:1:4
fprintf('[%f,%f] ',jx(i),jd(i));
end
fprintf('\n');
fprintf('f(x)的单调减区间:');
for i=2:1:4
fprintf('[%f,%f] ',jd(i-1),jx(i));
end
fprintf('\n');
运行结果:
f(x)的极大值点: 32.9757 39.2606 45.5451
f(x)的极小值点: 36.1384 42.4201 48.7022
f(x)的单调增区间:[30.000000,32.975680] [36.138391,39.260634] [42.420087,45.545084] [48.702162,50.000000]
f(x)的单调减区间:[32.975680,36.138391] [39.260634,42.420087] [45.545084,48.702162]
4.求解线性约束最优化问题
程序:
function f=fx12(x)
f=0.5*x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-6*x(2);
end
%以上代码生成fx12.m
clear;clc;
x0=[0;0]; %列向量
A=[1,1;-1,2;2,1];
b=[2;2;3];
lb=[0;0]; %列向量
options=optimset('Display','off');
[x,f]=fmincon(@fx12,x0,A,b,[],[],lb,[],[],options);
fprintf('当x1=%f,x2=%f时,f(x)取得min=%f\n',x(1),x(2),f);
%以上代码生成P100_4.m
运行结果:
当x1=0.666668,x2=1.333331时,f(x)取得min=-8.222218
5.对边长为3cm的正方形铁板,在4个角剪去相等的正方形以制成方形无盖水槽。问何种剪法使水槽容积最大?
程序:
function V=V(a)
V=-(3-2*a)^2*a;
end
%以上代码生成V.m
clear;
clc;
a0=[0.5];
lb=[0];
ub=[1.5];
options=optimset('Display','off');
[a,f]=fmincon(@V,a0,[],[],[],[],lb,ub,[],options);
fprintf('当边长为%.1f时,容积最大为%.1f\n',a,-f);
%以上代码生成P100_5.m
运行结果:
当边长为0.5时,容积最大为2.0
6.求解非线性约束最优化问题
程序:
function [f,g]=nfx12(x)
% 计算目标 f
f = 100*(x(1)^2-x(2))^2 + (1-x(1))^2;
%nargout 针对当前正在执行的函数,返回该函数调用中指定的函数输出参数的数目。该语法仅可在函数体内使用。
if nargout > 1 % 所需坡度
g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));200*(x(2)-x(1)^2)];
end
end
%以上代码生成nfx12.m
function [c d]=fcontr(x)
c=1.5+x(1)*x(2)+x(1)-x(2);
d=10-x(1)*x(2);
end
%以上代码生成fcontr.m
clear;clc;
fun = @nfx12;
x0 = [1;10];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0;0];
ub = [1;13];
nonlcon = 'fcontr';
options=optimset('Display','off');
[x,f] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
fprintf('当x1=%f,x2=%f时,f(x)取得min=%f\n',x(1),x(2),f);
%以上代码生成P100_6.m
运行结果:
当x1=0.812202,x2=12.312202时,f(x)取得min=13578.180059