实验8 优化问题求解

一、程序目的和要求

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏妹妹的第2333任男友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值