%fminsearch 是多变量函数寻优的单纯形法指令,用法和fminunc是类似的。
hold off disp(' ')
disp('Strike any key for menu') pause end
end 】
banplot6_4.m
【function out = banplot6_4(x)
plot(x(1),x(2),'O','Erasemode','none')
drawnow; % Draws current graph now out = []; 】
6.3.2其它的优化算法指令
1.多变量约束优化指令fmincon 2. 线性规划linprog指令
【 f = [-5; -4; -6]; A = [1 -1 1;3 2 4;3 2 0];b = [20; 42; 30];
lb = zeros(3,1); x0=[1,1,0];
options=optimset('Diagnostics','on', 'largescale','off'); %查看诊断信息并采用单纯形算法
[x,fval,exitflag,output,lambda]= ?linprog(f,A,b,[],[],lb,[],x0,options)
%没有等式约束且变量无上界,故需置Aeq=[ ];Aeb=[ ];ub=[ ]; 】
36
3. 二次规划quadprog指令 4. 一元函数寻优fminbnd指令
5.非线性最小二乘指令lsqnonlin和非线性数据拟合指令lsqcurvefit
程序如下(zxy6_5.m) 【
clf;x=1:10;
y=2+2*x; %选直线上的10个点。
a0=[0.1,0.4]; y1=exp(x*a0(1))+exp(x*a0(2)); %计算一条曲线。 [a,resnorm,residual] = lsqnonlin('zxy6_5f',a0); % 求最优解初始点a0。 disp('a='), disp(a);
disp('resnorm='), disp(resnorm) y2=exp(x*a(1))+exp(x*a(1));
plot( -x,y,x,y1,'r:',x,y2,'o-',x,residual,'.-'),grid on legend('
直
线
','
猜
测
的
曲
线
','
解
曲
线
','
残
差
') 】 函数子程序为(zxy6_5f.m) 【 function F = zxy6_5f(a)
x = 1:10;
F = 2 + 2*x-exp(a(1)*x)-exp(a(2)*x); 】 { Optimization terminated successfully:
Norm of the current step is less than OPTIONS.TolX a= 0.2578 0.2578
6.4 应用、思考与练习
6.4.1 .计算最佳水槽断面面积
zxy6_6S.m
【 function s=zxy6_6S(x)
l=24;a(1)=x(3);a(2)=x(4); xs0=(0.5*l-x(1)-x(2)); xs1=xs0+x(1)*cos(a(1)); xs2=xs1+x(2)*cos(a(2));
37
h1=x(1)*cos(a(1)); h2=x(2)*cos(a(2));
s=(xs0+xs1)*h1+(xs1+xs2)*h2;s=-s; 】 zxy6_6.m
【 clf,A=[1,1,0,0;-1,-1,0.0,0.0];b=[12,0]';
lb=[0,0,0,0]';ub=[100,100,pi/2,pi/2]';x0=[4,4,pi/3,pi/3]';
[s,fval] = fmincon('zxy6_6S',x0,A,b,[],[],lb,ub) %最优化计算
%以下是绘制最优断面的图形,首先计算坐标点。将底边放在x轴上,并让断面关于
%y轴对称。逆时针计算坐标点,使之成为一个封闭的图形)
x(1)=(24-2*s(1)-2*s(2))/2; y(1)=0;
x(2)=x(1)+s(1)*cos(s(3)); y(2)=s(1)*sin(s(3));
x(3)=x(2)+s(2)*cos(s(4)); y(3)=y(2)+s(2)*sin(s(4));
x(4)=-x(3); y(4)=y(3);x(5)=-x(2); y(5)=y(2);x(6)=-x(1); y(6)=y(1); x(7)=x(1);y(7)=y(1); %首尾相接。
%plot(x,y),axis equal %用这命令可画出封闭图形。
patch(x,y,'y'); axis equal, %用patch命令画块对象并填充颜色。 】 { s = 4.8000 4.8000 0.6283 1.2566
fval =
-88.6373 }
6.4.2 对约束优化的讨论 6.4.3.工程优化问题的计算
1. 啤酒配方问题: 线性规划 2. 储能飞轮的设计 3. 齿轮减速器设计
实验7.隐函数、方程求根、不动点和迭代
7.1知识要点与背景
38
7.1.1 隐函数存在定理与四连杆机构的运动 7.1.2 不动点和函数迭代
7.2实验 与观察
7.2.1 隐函数的存在定理的可视化
1. 隐函数为什么存在?
【 clf,plot(Y(:,40),z1(:,40),'.-');hold on,xlabel('x'),ylabel('y'),
plot([-5,5],[0,0],'r-'),legend('z=F(x0,y)','z=0'); 】
观察程序zxy7_1.m 【 clear,clf
a=-5;b=5;c=-5;d=5;n=60;u=[15 25 40];
x=linspace(a,b,n);y=linspace(c,d,n);[X,Y]=meshgrid(x,y); z1=Y.^3./(2+0.2*sin(X.*Y))+X.^2-4*X; z2=zeros(size(X)); surf(X,Y,z1),shading flat,hold on, mesh(X,Y,z2),hidden off,
xlabel('x','fontsize',16);ylabel('y','fontsize',16);zlabel('z','fontsize',16); r0=(abs(z1-z2)<=0.7); %处理交线 zz=r0.*z1; yy=r0.*Y; xx=r0.*X;
plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'r.','markersize',12); plot3(X(:,u),Y(:,u),z1(:,u),'b.-','markersize',10); 】
2. 如何决定隐函数-非线性方程的求根
zxy7-2.m
【 global p %说明全局变量p,P用于本程序中和函数子程序
zxy7_2f.m间传递参数
39
m=100;x=linspace(-5,5,m); %确定隐函数自变量的范围
y0=-4.6; %第一个方程的初值 y=[];f=[]; for k=1:m
%开始循环
p=x(k);
%第k个方程的自变量x(k)通过全
局变量p传递到zxy7_2f.m中
[y1,fval,exitflag,output] = fzero('zxy7_2f',y0); %求第k个方程 y0=y1;
值
%将第k方程的解作为下一个方程的初
y=[y,y1];f=[f,fval]; end
%保存计算结果
%循环结束
plot(x(1:m),y(1:m),'r.-'), %绘制隐函数图形
axis([-5 5 -5 3]),grid on 】 zxy7_2f.m
【 function z=zxy7_2f(y)
global p %在这里也要对应说明全局变量p,使得可以获得外界传递
来的P值
x=p;
z=y.^3/(2+0.2*sin(x*y))+x^2-4*x; %计算函数 】
7.2.2.用蛛网图观察不动点迭代
观察程序: 下面的程序可以绘制这三个函数迭代的蛛网图。 zxy7_3f.m
【%计算问题3中的三个函数,s=1、2、3时分别对应函数f1,f2,f3
function y=zxy7_3f(x,s) if s==1 y=(4-x.*x); elseif s==2 y=4./(1+x); elseif s==3
y=x-(x.^2+x-4)./(2*x+1); end 】
40