机械优化设计复合形方法及源程序
机械优化设计

机械优化设计matlab优化设计程序学校:班级:学号:姓名:指导老师:一.进退法求最优点所在区间1.算例:函数:f=x(1)^3+x(2)^2-10*x(1)*x(2)+1;初始参数:x0=0,step=0.01,st=[0,0],sd=[1,1];2.编程代码:function [lb,ub]=jintuifa(x0,step0,st,sd)% lb为区间下限,up为区间上限% x0初始探测点,step0是初始探测步长,st初始搜索点,sd是初始搜索方向step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendendend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)f=x(1)^3+x(2)^2-10*x(1)*x(2)+1;end3.运行结果二.黄金分割法求最求最优值1.eg:函数:f=x^2+2*x;初始参数:a=-3,b=5,e=0.0001;2.编程代码:function [ans,sp]=golden(a,b,e)%[a,b]初始区间,e为最小区间长度要求%ans为最优解,sp为所需迭代次数a(1)=a;b(1)=b;L=e;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;m(1)=feval('f1',t(1));n(1)=feval('f1',u(1));while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endm(k+1)=feval('f1',t(k+1));n(k+1)=feval('f1',u(k+1));ans=feval('f1',t(k+1));k=k+1;endans=(a(k)+b(k))/2;sp=k-1;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function y=f1(x)y=x^2+2*x;end3.运行结果三.无约束优化方法——坐标轮换法1.eg:函数:min f(x)=4*(x(1)-5)^2+(x(2)-6)^2;初始参数:初始点x为[8,9];2.编程代码:function [x,f]=lunhuan(x0)%输入初始点x0[8,9]%输出最优解点x,与最优解值fp=1;h=0.000001;x=x0;while(p>h)%做精度比较w=x(1);q=x(2);d1=[1,0];a1=golden('objfun',x,d1);%黄金分割法求最佳步长 x=x+a1*d1;d2=[0,1];a2=golden('objfun',x,d2);x=x+a2*d2;p=sqrt((x(1)-w)^2+(x(2)-q)^2);endf=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)%函数名f=4*(x(1)-5)^2+(x(2)-6)^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd)%进退法函数x0=0;step0=0.000001;step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(f_name,st,sd)[a,b]=jintuifa(st,sd); %进退法求最佳步长区间a(1)=a;b(1)=b;L=0.1;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd;q=st+u(1)*sd;m(1)=feval(f_name,p);n(1)=feval(f_name,q);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd;z=st+u(k+1)*sd;m(k+1)=feval(f_name,w);n(k+1)=feval(f_name,z);ans=feval(f_name,w);k=k+1;endt(k)=0;u(k)=0;m(k)=0;n(k)=0;p=[a',b',t',u',m',n'];ans=(a(k)+b(k))/2;end3.运行结果四.无约束优化方法——鲍威尔法1.eg:函数:min f(x)=4*(x(1)-5)^2+(x(2)-6)^2;初始参数:初始点x为[8,9],初始搜索方向[0,1],[1,0];2.编程代码:function [x,f]=powill(x0,d1,d2)%输入x0为初始点,d1,d2为两个线性无关向量for k=1:2w=x0(1);q=x0(2);a1=golden('objfun',x0,d1);x1=x0+a1*d1;a2=golden('objfun',x1,d2);x2=x1+a2*d2;d1=d2;d2=x2-x0;a3=golden('objfun',x2,d2);x3=x2+a3*d2;x0=x3;endx=x0;f=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)f=4*(x(1)-5)^2+(x(2)-6)^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd)x0=0;step0=0.0001;step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(f_name,st,sd)[a,b]=jintuifa(st,sd);a(1)=a;b(1)=b;L=0.1;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd;q=st+u(1)*sd;m(1)=feval(f_name,p);n(1)=feval(f_name,q);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd;z=st+u(k+1)*sd;m(k+1)=feval(f_name,w);n(k+1)=feval(f_name,z);ans=feval(f_name,w);k=k+1;endend3.运行结果五.有约束优化方法——复合形法1.eg:函数:min f(x)=x1^2+x2^2-x1*x2-10*x1-4*x2+60 St:g1(x)=-x1≤0g2(x)=-x2≤0g3(x)=x1-6≤0g4(x)=x2-8≤0g5(x)=x1+x2-11≤02.编程代码:function fuhexing(n,b,h,xb1,xb2)%元素数n,初始可行点b,精度h,xb1横坐标上下界,xb2为纵坐标上下界if (rem(n,2)==0)k=n+n/2;elsek=n+(n+1)/2;end%取k值A=kexingdian(k,xb1,xb2,b');%确定可行点A=mubiao(A,n,k,h);%求出目标函数并排序比较,得出最优解End %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function A=mubiao(A,n,k,h)for i=1:kA(3,i)=objfun(A(:,i));endB=A';%根据目标函数值排序A=sortrows(B,3)';p=0;for j=1:kx=(objfun(A(:,j))-objfun(A(:,1)))^2;p=p+x;endo=sqrt(p/(k-1));%收敛条件if(o<h)%判断所求点是否为最优点disp('最优点为')xz(1)=A(1,1);xz(2)=A(2,1);disp(xz);disp('其函数值为')f=A(3,1);disp(f);elsexr=Xcpanduan(A,k,n,h,1.3);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function A=kexingdian(k,xb1,xb2,b)A=zeros(3,k);A(1,1)=b(1);A(2,1)=b(2);for i=2:kA(1,i)=xb1(1)+rand(1)*(xb1(2)-xb1(1));A(2,i)=xb2(1)+rand(1)*(xb2(2)-xb2(1));%产生j个顶点endt=0;for j=1:kif(A(1,j)+A(2,j)<=11&&A(1,j)<=6&&A(2,j)<=8)%判断是否有不可行点t=t+1;T(:,t)=A(:,j);endendif(t<k)%计算出可行点的中心位置xcxc=zhongxindian(T,t);endt=0;for j=1:k%利用中心点将原不可行点逼近为可行点while(A(1,j)+A(2,j)>11||A(1,j)>6||A(2,j)>8)A(:,j)=xc+0.5*(A(:,j)-xc);endendendx=x0;f=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function f=objfun(x)f= x1^2+x2^2-x1*x2-10*x1-4*x2+60;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xc=Xcpanduan(A,k,n,h,a)for i=1:k-1T(:,i)=A(:,i);endxc=zhongxindian(T,k-1);%计算除最坏点以外的可行点中心坐标if(xc(1)+xc(2)<=11&&xc(1)<=6&&xc(2)<=8)%判断xc是否可行xr=Xrpanduan(xc,A,a,n,k,h);A(:,k)=xr;else%不可行时,即重新确定初始可行点fuhexing(n,h,A(:,1),xr);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xc=zhongxindian(T,t)xc=[0;0;0];for i=1:txc=xc+T(:,i);endxc=xc/t;%求解中心点end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function xr=Xrpanduan(xc,A,a,n,k,h)xr=xc+a*(xc-A(:,k));while(xr(1)+xr(2)>11||xr(1)>6||xr(2)>8)%判断xr 是否可行若不可行,则持续迭代a=0.5*a;xr=xc+a*(xc-A(:,k));endxr=ercipanduan(a,xr,A(:,k),A,n,k,xc,h,xr);%可行时进入下一判断end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xr=ercipanduan(a,p,b,A,n,k,xc,h,t)if(objfun(p)>=objfun(b))%判断反射点和最坏点函数值的大小if(a<=1e-10)A(:,k)=A(:,k-1);xr=Xcpanduan(A,k,n,h,a);disp(xr);elsea=0.5*a;xr=Xrpanduan(xc,A,a,n,k,h);%返回中心点判断,持续迭代endelseA(:,k)=p;%以反射点取代最坏点进行循环mubiao(A,n,k,h);xr=t;endend3.运行结果五.有约束优化方法——混合惩罚法1.eg:函数:min f(x)=(x(4)-x(1))^2+(x(5)-x(2))^2+(x(6)-x(3))^2;St:g1=x(1)^2+x(2)^2+x(3)^2-5;g2=(x(4)-3)^2+x(5)^2-1;g3=x(6)-8;g4=4-x(6);2.编程代码function [x,f]=hunhechengfa(x0,r0,c,h1,h2)k=1;z=0;A(:,1)=x0;r(1)=r0;while (z==0)k=k+1;x=lunhuan(x0,r(k-1));A(:,k)=x;r(k)=c*r(k-1);z=shoulian(A,r,h1,h2,k);if(z==1)break;endx0=x;enddisp('最优解点x=');disp(x);disp('最优值=');f=fhanshu(x);disp(f);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function z=shoulian(A,r,h1,h2,k)%判断收敛条件U=abs(objfun(A(:,k),r(k))-objfun(A(:,k-1),r(k-1))/obj fun(A(:,k-1),r(k-1)));V=0;for i=2:kV=V+(A(1,k)-A(1,k-1))^2;endV=sqrt(V);if(U<=h1&&V<=h2)z=1;elsez=0;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function p=objfun(x,r)%φ函数g1=x(1)^2+x(2)^2+x(3)^2-5;g2=(x(4)-3)^2+x(5)^2-1;g3=x(6)-8;g4=4-x(6);j=sqrt(r);u=r*(1/g1+1/g2+1/g3+1/g4);v=(g1^2+g2^2+g3^2+g4^2)/j;p=fhanshu(x)-u+v;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function f=fhanshu(x)%目标函数f=(x(4)-x(1))^2+(x(5)-x(2))^2+(x(6)-x(3))^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function x=lunhuan(x0,r)%轮换法p=1;h=0.01;d=zeros(6,6);a=zeros(6,1);x=x0;for i=1:6for j=1:6if(i==j)d(i,j)=1;endendendwhile(p>h)t=x;v=0;for k=1:6a(k)=golden(x,d(:,k),r);c=d(:,k);x=x-a(k)*c';v=v+(x(k)-t(k))^2;endp=sqrt(v);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(st,sd,r)%黄金分割法求最佳步长 [g,h]=jintuifa(st,sd,r);a(1)=g;b(1)=h;L=0.01;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd';q=st+u(1)*sd';m(1)=objfun(p,r);n(1)=objfun(q,r);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd';z=st+u(k+1)*sd';m(k+1)=objfun(w,r);n(k+1)=objfun(z,r);k=k+1;endans=(a(k)+b(k))/2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd,r)%代入步长f=objfun(st+a.*sd',r);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd,r)%进退法求最佳步长区间x0=0;step0=0.001;step=step0;f0=jintui(x0,st,sd,r);x1=x0+step0;f1=jintui(x1,st,sd,r);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd,r);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd,r);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2; f1=f0; f0=f2;endendend3.运行结果。
优化设计复合形法

所以,坏点X H X 2 ;好点X L X 3 去掉坏点的其余各顶点的几何中心 X C
五、复合形法习题
K
2 3
X C
Xj
j 1
K 1
1 3 31
22..05( j 2)
三、复合形法的计算步骤
6. α>δ 若是,则α=0.5α ,重新计算反射点X(R) 若否,用次坏点取代最坏点进行上述寻优
过程; 7. 检查终止准则: 满足,迭代终止得到最优解, 否则以新构成的复合形,继续进行搜索;
四、复合形法的特点
1、不必保持规则的图形,比较灵活; 2、复合形法适用于仅含不等式约束的问题。 3、对目标函数和约束函数无特殊要求,适 应性强; 4、寻优过程始终在可行域内,结果可靠;
再重新构造新的复合形。
8、复合形法搜索的其他方法
(1)扩张 如果求得的反射点为可行点,且目标函数下 降较多,比如F(X(R))<F(X(L))则沿此反射方向 继续移动,可能找到更好的新点X(E),X(E)) 就 称为扩张点。
X E X R X R X C
γ为扩张系数,一般取γ=1
(1)扩张
1)映射点优于坏点 F(X(R))< F(X(H))
在此情况,用X(R)代替X(H),构成新 的复合形。
7、如何构造新的复合形?
2)映射点次于坏点 F(X(R))>F(X(H))
这种情况由于映射点过远引起的,减半映射 系数,若有F(X(R))< F(X(H)),这又转化为第一种 情况。
若经过多次的映射系数减半,直至映射系
XS
1 q
复合形法matlab程序及例题

复合形法matlab程序及例题一、复合形法简介复合形法是一种求解非线性规划问题的方法,该方法由李连达在20世纪60年代发明,曾被广泛应用于实际生产中的工程问题。
该方法是通过构造不同大小和形状的简单多面体来搜索解决方案空间。
根据目标函数的变化趋势,复合形方法可以根据前一个顶点的坐标来确定新顶点,从而得到更好的解。
二、复合形法MATLAB程序1. 复合形法MATLAB基本编写格式:function [x,fval,exitflag,output] =fminsearch(fun,x0,options)Example:fun = @bivarfcn;[x,fval] = fminsearch(fun,[0,0])2. 复合形函数matlab代码展示:function[xmin,fval]=simplex(func,x)[n,m] = size(x);if n ~= m, error('x must be square!'); endx=[x eye(n)];y = feval(func,x(:,1));xlim = y;for j=2:n+1y = feval(func,x(:,j));if y < xlim, xlim = y; imin = j-1; endendxmax = y;for j=2:n+1y = feval(func,x(:,j));if y > xmax, xmax = y; kmax = j-1; endendfor i=1:10000xc = (sum(x(:,1:n),2)-x(:,n+1))/n;xr = 2*xc-x(:,n+1);yr = feval(func,xr);if yr < xlimxe = 3*xc-2*x(:,n+1);ye = feval(func,xe);if ye < yr, x(:,kmax+1) = xe; else x(:,kmax+1) = xr; endelseif yr < xmax x(:,kmax+1) = xr;xnew = (x(:,imin+1)+xc)/2; ynew = feval(func,xnew);if ynew < x(:,n+1) x(:,kmax+1) = xnew;else for j=1:n+1, if j ~= imin+1, x(:,j) = (x(:,j)-x(:,imin+1))/2+x(:,imin+1); end; end; endy = feval(func,x(:,1)); xlim = y; imin = 0;for j=2:n+1, y = feval(func,x(:,j)); if y < xlim, xlim = y; imin = j-1;end; end; xmax = y; for j=2:n+1, y = feval(func,x(:,j)); if y > xmax, xmax =y; kmax = j-1; end; end;endxmin = x(:,imin+1); fval = feval(func,xmina)3. 复合形法MATLAB例题:已知一个函数f(x1,x2)=-(1.4-x1^2)*(2.1-x2^2),求解f(x1,x2)的最小值以及使f(x1,x2)最小的点。
机械优化设计-复合型法

comple(2,3,3,0.00001,x,a,b,xcom,&f);
printf(" \n\n\n输出最优解及目标函数值:\n");
printf("\n x1=%.5f x2=%.5f f(x1,x2)=%.5f\n\n ",x[0],x[1],f);
(一)题目:用复合形法求约束优化问题
; ; 的最优解。
基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
{
xs=0;
for(l=0;l<ll;l++)
{
if(l!=lΒιβλιοθήκη )xs=xs+xcom[i][l];
}
if(lh>-1)
x0[i]=xs/(ll-1);
else
x0[i]=xs/ll;
}
}
void fxse(int n,int k,double x[],double xcom[][100],double fxk[])
iw=gau(x,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
xcom[i][0]=x[i];
for(l=1;l<k;l++)
for(i=0;i<n;i++)
机械优化设计MATLAB程序-无删减范文

机械优化设计MATLAB程序机械优化设计MATLAB程序引言机械优化设计是现代工程领域中的重要课题,通过采用数值方法和优化算法,可以实现对机械产品设计的自动化和优化。
MATLAB 作为一种功能强大的科学计算软件,为机械优化设计提供了丰富的工具和函数。
本文将介绍如何使用MATLAB编写机械优化设计程序,并讨论如何应用MATLAB进行机械优化设计。
MATLAB的优势与其他科学计算软件相比,MATLAB具有许多优势:1. 丰富的工具箱:MATLAB包含了各种各样的工具箱,涵盖了数值计算、优化、曲线拟合、数据可视化等领域,这些工具箱为机械优化设计提供了强大的支持。
2. 简单易用的编程语言:MATLAB使用的编程语言是一种高级语言,语法简单易懂,对于初学者而言非常友好。
即使没有编程经验,用户也能够快速上手。
3. 丰富的函数库:MATLAB拥有丰富的函数库,用户可以直接调用这些函数来完成各种任务,无需从零开始编写代码。
4. 广泛的应用领域:MATLAB在工程、科学、金融等领域得到了广泛的应用,拥有一个庞大的用户社区。
用户可以通过查看官方文档、参与用户社区等途径获取帮助和支持。
机械优化设计的步骤机械优化设计一般包括以下几个步骤:1. 建立数学模型:首先需要建立机械系统的数学模型,该模型可以基于物理原理或实验数据。
通过建立数学模型,可以将机械系统的性能指标与设计变量进行数学描述。
2. 确定优化目标:根据机械系统的需求和限制条件,确定优化目标。
优化目标可以是多个,如最小化能量损失、最小化材料使用量等。
3. 选择优化算法:基于问题的性质选择合适的优化算法。
常用的优化算法包括遗传算法、粒子群算法、梯度下降算法等。
4. 编写MATLAB代码:根据以上步骤,编写MATLAB代码实现机械优化设计。
MATLAB提供了丰富的工具箱和函数来辅助编写优化算法的代码。
编写机械优化设计MATLAB程序的步骤以下是编写机械优化设计MATLAB程序的一般步骤:1. 导入必要的工具箱和函数库:```% 导入优化工具箱import optim.% 导入其他必要的函数库import matlab.```2. 建立数学模型:根据机械系统的特点和要求,建立相应的数学模型。
复合形法

太原理工大学机械学院机测系课程上机实验报告课程名称:机械优化设计班级日期成绩评定姓名实验室老师签名实验名称用复合形法程序解题所用软件C++ DEV实验目的及内容实验目的:1.掌握并能够建立最优化基本类型问题的数学模型。
2.掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。
3.能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础实验内容:理解复合形法并编写相关程序求其最优解。
1)2221)1()2()(min-+-=xxXF)(..2121≥-=xxXgt s2)(212≥--=xxXg取:321104]85[]65[-==-∈-∈εkxx实验原理:实验原理步骤、实验步骤:1,画流程图,编写程序;2,将目标函数代入;3,编译运行,将结果保存实验结果及分析**********复合形法计算结果**********本次优化的上下限为:a=[ -5.000, 6.000]b=[ -5.000, 8.000]初始复合形各顶点坐标及函数值:x( 0)=[ -5.0000000, 6.8509781], f( 0)= 83.2339449x( 1)=[ -5.0000000, 6.9139073], f( 1)= 83.9742994x( 2)=[ -5.0000000, 6.9560839], f( 2)= 84.4749350x( 3)=[ -5.0000000, 6.9535330], f( 3)= 84.4445555最低和最高顶点号:L= 0, H= 2复合形顶点值均方差:0.942570812迭代轮数k= 1x( 0)=[ -5.0000000, 6.8509781], f( 0)= 83.2339449x( 1)=[ -5.0000000, 6.9139073], f( 1)= 83.9742994x( 2)=[ -5.0000000, 6.8412118], f( 2)= 83.1197550x( 3)=[ -5.0000000, 6.9535330], f( 3)= 84.4445555最低和最高顶点号:L= 2, H= 3复合形顶点值均方差:0.790313540迭代轮数k= 2x( 0)=[ -5.0000000, 6.8509781], f( 0)= 83.2339449x( 1)=[ -5.0000000, 6.9139073], f( 1)= 83.9742994x( 2)=[ -5.0000000, 6.8412118], f( 2)= 83.1197550x( 3)=[ -5.0000000, 6.7584149], f( 3)= 82.1593422最低和最高顶点号:L= 3, H= 1复合形顶点值均方差: 1.158796098迭代轮数k= 3x( 0)=[ -5.0000000, 6.8509781], f( 0)= 83.2339449x( 1)=[ -5.0000000, 6.6907175],f( 1)= 81.3842661x( 2)=[ -5.0000000, 6.8412118], f( 2)= 83.1197550x( 3)=[ -5.0000000, 6.7584149], f( 3)= 82.1593422最低和最高顶点号:L= 1, H= 0复合形顶点值均方差: 1.326082257迭代轮数k= 4x( 0)=[ -5.0000000, 6.6496590], f( 0)= 80.9186469x( 1)=[ -5.0000000, 6.6907175], f( 1)= 81.3842661x( 2)=[ -5.0000000, 6.8412118], f( 2)= 83.1197550x( 3)=[ -5.0000000, 6.7584149], f( 3)= 82.1593422最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 1.284620848迭代轮数k= 5x( 0)=[ -5.0000000, 6.6496590], f( 0)= 80.9186469x( 1)=[ -5.0000000, 6.6907175], f( 1)= 81.3842661x( 2)=[ -5.0000000, 6.5154981], f( 2)= 79.4207197x( 3)=[ -5.0000000, 6.7584149], f( 3)= 82.1593422最低和最高顶点号:L= 2, H= 3复合形顶点值均方差: 1.843865066迭代轮数k= 6x( 0)=[ -5.0000000, 6.6496590], f( 0)= 80.9186469x( 1)=[ -5.0000000, 6.6907175], f( 1)= 81.3842661x( 2)=[ -5.0000000, 6.5154981], f( 2)= 79.4207197x( 3)=[ -5.0000000, 6.4368979], f( 3)= 78.5598586最低和最高顶点号:L= 3, H= 1复合形顶点值均方差: 1.889592676迭代轮数k= 7x( 0)=[ -5.0000000, 6.6496590], f( 0)= 80.9186469x( 1)=[ -5.0000000, 6.3303094], f( 1)= 77.4121981x( 2)=[ -5.0000000, 6.5154981], f( 2)= 79.4207197x( 3)=[ -5.0000000, 6.4368979], f( 3)= 78.5598586最低和最高顶点号:L= 1, H= 0复合形顶点值均方差: 2.100384836迭代轮数k= 8x( 0)=[ -5.0000000, 6.1388508], f( 0)= 75.4077872x( 1)=[ -5.0000000, 6.3303094], f( 1)= 77.4121981x( 2)=[ -5.0000000, 6.5154981], f( 2)= 79.4207197x( 3)=[ -5.0000000, 6.4368979], f( 3)= 78.5598586最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 2.741206122迭代轮数k= 9x( 0)=[ -5.0000000, 6.1388508], f( 0)= 75.4077872x( 1)=[ -5.0000000, 6.3303094], f( 1)= 77.4121981x( 2)=[ -5.0000000, 6.0244969], f( 2)= 74.2455693x( 3)=[ -5.0000000, 6.4368979], f( 3)= 78.5598586最低和最高顶点号:L= 2, H= 3复合形顶点值均方差: 2.738219360迭代轮数k= 10x( 0)=[ -5.0000000, 6.1388508], f( 0)= 75.4077872x( 1)=[ -5.0000000, 6.3303094], f( 1)= 77.4121981x( 2)=[ -5.0000000, 6.0244969], f( 2)= 74.2455693x( 3)=[ -5.0000000, 5.8105032], f( 3)= 72.1409408最低和最高顶点号:L= 3, H= 1复合形顶点值均方差: 3.274442715迭代轮数k= 11x( 0)=[ -5.0000000, 6.1388508], f( 0)= 75.4077872x( 1)=[ -5.0000000, 5.5505501], f( 1)= 69.7075064x( 2)=[ -5.0000000, 6.0244969], f( 2)= 74.2455693x( 3)=[ -5.0000000, 5.8105032], f( 3)= 72.1409408最低和最高顶点号:L= 1, H= 0复合形顶点值均方差: 3.840859862迭代轮数k= 12x( 0)=[ -5.0000000, 5.3484158], f( 0)= 67.9087203x( 1)=[ -5.0000000, 5.5505501], f( 1)= 69.7075064x( 2)=[ -5.0000000, 6.0244969], f( 2)= 74.2455693x( 3)=[ -5.0000000, 5.8105032], f( 3)= 72.1409408最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 3.914810890迭代轮数k= 13x( 0)=[ -5.0000000, 5.3484158], f( 0)= 67.9087203x( 1)=[ -5.0000000, 5.5505501], f( 1)= 69.7075064x( 2)=[ -5.0000000, 4.9787470], f( 2)= 64.8304278x( 3)=[ -5.0000000, 5.8105032], f( 3)= 72.1409408最低和最高顶点号:L= 2, H= 3复合形顶点值均方差: 4.655786221迭代轮数k= 14x( 0)=[ -5.0000000, 5.3484158], f( 0)= 67.9087203x( 1)=[ -5.0000000, 5.5505501], f( 1)= 69.7075064x( 2)=[ -5.0000000, 4.9787470], f( 2)= 64.8304278x( 3)=[ -5.0000000, 4.6192591], f( 3)= 62.0990368最低和最高顶点号:L= 3, H= 1复合形顶点值均方差: 4.977492567迭代轮数k= 15x( 0)=[ -5.0000000, 5.3484158], f( 0)= 67.9087203x( 1)=[ -5.0000000, 4.2432084], f( 1)= 59.5184005x( 2)=[ -5.0000000, 4.9787470], f( 2)= 64.8304278x( 3)=[ -5.0000000, 4.6192591], f( 3)= 62.0990368最低和最高顶点号:L= 1, H= 0复合形顶点值均方差: 5.130175009迭代轮数k= 16x( 0)=[ -5.0000000, 3.6586572], f( 0)= 56.0684582x( 1)=[ -5.0000000, 4.2432084], f( 1)= 59.5184005x( 2)=[ -5.0000000, 4.9787470], f( 2)= 64.8304278x( 3)=[ -5.0000000, 4.6192591], f( 3)= 62.0990368最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 5.591111034迭代轮数k= 17x( 0)=[ -5.0000000, 3.6586572], f( 0)= 56.0684582x( 1)=[ -5.0000000, 4.2432084], f( 1)= 59.5184005x( 2)=[ -5.0000000, 3.1271579], f( 2)= 53.5248005x( 3)=[ -5.0000000, 4.6192591], f( 3)= 62.0990368最低和最高顶点号:L= 2, H= 3复合形顶点值均方差: 5.383097686迭代轮数k= 18x( 0)=[ -5.0000000, 3.6586572], f( 0)= 56.0684582x( 1)=[ -5.0000000, 4.2432084],f( 1)= 59.5184005x( 2)=[ -5.0000000, 3.1271579], f( 2)= 53.5248005x( 3)=[ -5.0000000, 2.4505477], f( 3)= 51.1040888最低和最高顶点号:L= 3, H= 1复合形顶点值均方差: 5.032530479迭代轮数k= 19x( 0)=[ -5.0000000, 3.6586572], f( 0)= 56.0684582x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 3.1271579], f( 2)= 53.5248005x( 3)=[ -5.0000000, 2.4505477], f( 3)= 51.1040888最低和最高顶点号:L= 1, H= 0复合形顶点值均方差: 4.075033247迭代轮数k= 20x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 3.1271579], f( 2)= 53.5248005x( 3)=[ -5.0000000, 2.4505477], f( 3)= 51.1040888最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 2.445955398迭代轮数k= 21x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, -0.4348017], f( 2)= 51.0586558x( 3)=[ -5.0000000, 2.4505477], f( 3)= 51.1040888最低和最高顶点号:L= 0, H= 3复合形顶点值均方差: 1.421455082迭代轮数k= 22x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, -0.4348017], f( 2)= 51.0586558x( 3)=[ -5.0000000, 0.0206951], f( 3)= 49.9590382最低和最高顶点号:L= 0, H= 2复合形顶点值均方差: 1.090233677迭代轮数k= 23x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 2.3328587], f( 2)= 50.7765122x( 3)=[ -5.0000000, 0.0206951], f( 3)= 49.9590382最低和最高顶点号:L= 0, H= 2复合形顶点值均方差:0.963931643迭代轮数k= 24x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, -0.2482854], f( 2)= 50.5582165x( 3)=[ -5.0000000, 0.0206951], f( 3)= 49.9590382最低和最高顶点号:L= 0, H= 2复合形顶点值均方差:0.869333822迭代轮数k= 25x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 2.0903875], f( 2)= 50.1889450x( 3)=[ -5.0000000, 0.0206951], f( 3)= 49.9590382最低和最高顶点号:L= 0, H= 2复合形顶点值均方差:0.718762840迭代轮数k= 26x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 0.3389249], f( 2)= 49.4370204x( 3)=[ -5.0000000, 0.0206951], f( 3)= 49.9590382最低和最高顶点号:L= 0, H= 3复合形顶点值均方差:0.490383508迭代轮数k= 27x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 0.3389249], f( 2)= 49.4370204x( 3)=[ -5.0000000, 1.4296473], f( 3)= 49.1845968最低和最高顶点号:L= 0, H= 2复合形顶点值均方差:0.222366457迭代轮数k= 28x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 1.5650406], f( 1)= 49.3192709x( 2)=[ -5.0000000, 1.5304375], f( 2)= 49.2813639x( 3)=[ -5.0000000, 1.4296473], f( 3)= 49.1845968最低和最高顶点号:L= 0, H= 1复合形顶点值均方差:0.166131819迭代轮数k= 29x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 0.7867313], f( 1)= 49.0454835x( 2)=[ -5.0000000, 1.5304375], f( 2)= 49.2813639x( 3)=[ -5.0000000, 1.4296473], f( 3)= 49.1845968最低和最高顶点号:L= 1, H= 2复合形顶点值均方差:0.137913956迭代轮数k= 30x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 0.7867313], f( 1)= 49.0454835x( 2)=[ -5.0000000, 0.6201420], f( 2)= 49.1442921x( 3)=[ -5.0000000, 1.4296473], f( 3)= 49.1845968最低和最高顶点号:L= 1, H= 3复合形顶点值均方差:0.086897399迭代轮数k= 31x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 0.7867313], f( 1)= 49.0454835x( 2)=[ -5.0000000, 0.6201420], f( 2)= 49.1442921x( 3)=[ -5.0000000, 0.5917880], f( 3)= 49.1666371最低和最高顶点号:L= 1, H= 3复合形顶点值均方差:0.079891031迭代轮数k= 32x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 0.7867313], f( 1)= 49.0454835x( 2)=[ -5.0000000, 0.6201420], f( 2)= 49.1442921x( 3)=[ -5.0000000, 0.8611643], f( 3)= 49.0192754最低和最高顶点号:L= 3, H= 2复合形顶点值均方差:0.070394704迭代轮数k= 33x( 0)=[ -5.0000000, 0.7198510], f( 0)= 49.0784834x( 1)=[ -5.0000000, 0.7867313],f( 1)= 49.0454835x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.8611643], f( 3)= 49.0192754最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.046304162迭代轮数k= 34x( 0)=[ -5.0000000, 1.1012143], f( 0)= 49.0102443x( 1)=[ -5.0000000, 0.7867313], f( 1)= 49.0454835x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.8611643], f( 3)= 49.0192754最低和最高顶点号:L= 2, H= 1复合形顶点值均方差:0.025163811迭代轮数k= 35x( 0)=[ -5.0000000, 1.1012143], f( 0)= 49.0102443x( 1)=[ -5.0000000, 1.1229312], f( 1)= 49.0151121x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.8611643], f( 3)= 49.0192754最低和最高顶点号:L= 2, H= 3复合形顶点值均方差:0.013205196迭代轮数k= 36x( 0)=[ -5.0000000, 1.1012143], f( 0)= 49.0102443x( 1)=[ -5.0000000, 1.1229312], f( 1)= 49.0151121x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 1.1129387], f( 3)= 49.0127552最低和最高顶点号:L= 2, H= 1复合形顶点值均方差:0.011065035迭代轮数k= 37x( 0)=[ -5.0000000, 1.1012143], f( 0)= 49.0102443x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 1.1129387], f( 3)= 49.0127552最低和最高顶点号:L= 2, H= 3复合形顶点值均方差:0.008121836迭代轮数k= 38x( 0)=[ -5.0000000, 1.1012143], f( 0)= 49.0102443x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.005268438迭代轮数k= 39x( 0)=[ -5.0000000, 0.9159881], f( 0)= 49.0070580x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.003755703迭代轮数k= 40x( 0)=[ -5.0000000, 1.0838142], f( 0)= 49.0070248x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.003740303迭代轮数k= 41x( 0)=[ -5.0000000, 0.9272981], f( 0)= 49.0052856x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.002951093迭代轮数k= 42x( 0)=[ -5.0000000, 1.0691112], f( 0)= 49.0047764x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.002729299迭代轮数k= 43x( 0)=[ -5.0000000, 0.9368551], f( 0)= 49.0039873x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.002398513迭代轮数k= 44x( 0)=[ -5.0000000, 1.0566871], f( 0)= 49.0032134x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.002095651迭代轮数k= 45x( 0)=[ -5.0000000, 0.9449307], f( 0)= 49.0030326x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.002029012迭代轮数k= 46x( 0)=[ -5.0000000, 1.0461888], f( 0)= 49.0021334x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9464393], f( 3)= 49.0028688最低和最高顶点号:L= 2, H= 3复合形顶点值均方差:0.001729933迭代轮数k= 47x( 0)=[ -5.0000000, 1.0461888], f( 0)= 49.0021334x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 1.0468300], f( 3)= 49.0021930最低和最高顶点号:L= 2, H= 3复合形顶点值均方差:0.001471563迭代轮数k= 48x( 0)=[ -5.0000000, 1.0461888], f( 0)= 49.0021334x( 1)=[ -5.0000000, 1.0113408],f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9901944], f( 3)= 49.0000961最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.001025689迭代轮数k= 49x( 0)=[ -5.0000000, 0.9758200], f( 0)= 49.0005847x( 1)=[ -5.0000000, 1.0113408], f( 1)= 49.0001286x( 2)=[ -5.0000000, 1.0090879], f( 2)= 49.0000826x( 3)=[ -5.0000000, 0.9901944], f( 3)= 49.0000961最低和最高顶点号:L= 2, H= 0复合形顶点值均方差:0.000252186*********************复合形法优化最优点及目标函数值为:x( *)=[ -5.0000000, 1.0090879], f( *)= 49.0000826迭代精度:0.000252186本次优化最终迭代次数为:49算法程序实现//*复合形法求仅有不等式的非线性最优化问题**/#include <math.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 2 /*给出优化问题的维数N*/#define K 4 /*给出复合形法顶点数K*/#define N1 5 /*给出约束方程个数K*/#define E 0.0000001 /*复合形法迭代精度*/#define NM 500 /*寻找初始复合形的最大次数*/FILE *fp;char outname[50]="复合形法计算结果.txt"; /*输出文件名*/int H=0,L=0; /*H,L--复合形顶点最大和最小值顶点号*/ double f[K]; /*本程序顶点值从f[0]开始*/struct{double x1[N]; /* double x2; 改为数组方式*/}Tpoint[K],xc,xr; /*Tpoint存放K个点的坐标,xc,xr分别为中心点和影射点坐标*//*目标函数子程序*/double function(double x[]){double zhi;zhi=(x[0]-2)(x[0]-2)+(x[1]-1)*(x[1]-1);return(zhi);}/*约束条件子程序*/int strain(double x[]){int i,fin=1;double g[N1];g[0]=x[1]-x[0]*x[0];g[1]=2-x[0]-x[1];for(i=0;i<N1;i++)if(g[i]≥0.){fin=0;break;}return(fin);}/*初始可行点产生区间*/void startab(double a[],double b[]){a[0]=-5.0;b[0]=6.0;a[1]=-5.0;b[1]=8.0;return;}/***********以上为修改部分***********//*输出当前迭代点坐标及目标函数值*/double xfout(double x[],int m){int j;double f;f=function(x);fprintf(fp," x(%3d)=[",m);for(j=0;j<N-1;j++)fprintf(fp,"%15.7lf,",x[j]);fprintf(fp,"%15.7lf], f(%3d)=%15.7lf\n",x[N-1],m,f);return f;}/**初始复合形****/int startfhx(double a[],double b[],int num){int i,i1,iw,kk=0;int j,j1,m,fh1=1;double sum2[N],sum3,delt1=0.01;double alf,r;srand( (unsigned)time( NULL ) ); /*种子函数*/do /*自动产生第一个可行点*/{for(i=0;i<N;i++){r=rand()/32767.; /*直接调用函数产生随机数*/Tpoint[0].x1[i]=a[i]+r*(b[i]-a[i]);}iw=strain(Tpoint[0].x1);kk=kk+1;if(kk>num){printf("找不到初始可行点,可能初始区间不合适!\n");fh1=2;return(fh1);}}while(iw==0);for(j=1;j<K;j++) /*产生其余个可行点*/{do{sum3=1.;for(i=0;i<N;i++){r=rand()/32767.; /*直接调用函数产生随机数*/Tpoint[j].x1[i]=a[i]+r*(b[i]-a[i]);}iw=strain(Tpoint[j].x1);if(iw==0){m=j;for(i1=0;i1<N;i1++)sum2[i1]=0.;for(i1=0;i1<N;i1++) /*求前j-1个顶点中心*/for(j1=0;j1<m;j1++)sum2[i1]+=Tpoint[j1].x1[i1];for(j1=0;j1<N;j1++)xc.x1[j1]=sum2[j1]/m;alf=0.5;do /*求中心的映射点*/{for(i=0;i<N;i++)Tpoint[m].x1[i]=xc.x1[i]+alf*(Tpoint[m].x1[i]-xc.x1[i]);sum3=0.;for(i1=0;i1<N;i1++)sum3+=(Tpoint[m].x1[i1]-xc.x1[i1])*(Tpoint[m].x1[i1]-xc.x1[i1]);sum3=sqrt(sum3);iw=strain(Tpoint[m].x1);}while(iw==0&&sum3>delt1);}}while(sum3<delt1);}return(fh1);}void suan() /*计算值并找出最好点和最差点*/{double max,min;int i;for(i=0;i<K;i++)f[i]=function(Tpoint[i].x1);max=f[0];min=f[0];H=0;L=0;for(i=1;i<K;i++){if(f[i]>max){max=f[i];H=i;}elseif(f[i]<min){min=f[i];L=i;}}return;}void suan1() /*找出次坏点*/{double min;int i,ih;min=f[L];ih=0;for(i=0;i<K;i++){if(i==H) continue;if(f[i]>min){min=f[i];ih=i;}}H=ih;return;}double panbie() /*检验迭代终止条件*/{double sum=0.0,temp;int i;for(i=0;i<K;i++)sum+=(f[i]-f[L])*(f[i]-f[L]);temp=sqrt(sum/K);return(temp);}int newfhx(double a[],double b[]){int i,j,fh1=1,chd=0;double sum1[N];double alfa; /**映射系数**/do{alfa=1.3;for(j=0;j<N;j++)sum1[j]=0.0;for(i=0;i<K;i++){if(i==H)continue;else{for(j=0;j<N;j++)sum1[j]+=Tpoint[i].x1[j];}}for(j=0;j<N;j++)xc.x1[j]=sum1[j]/(K-1);if(!(strain(xc.x1))){printf("xc is wrong非凸集\n");fh1=3;for(i=0;i<N;i++){a[i]=Tpoint[L].x1[i];b[i]=xc.x1[i];}return(fh1);}for(j=0;j<N;j++)xr.x1[j]=xc.x1[j]+alfa*(xc.x1[j]-Tpoint[H].x1[j]);while(!(strain(xr.x1))||(function(xr.x1)>=function(Tpoint[H].x1))){alfa=alfa*0.5;for(j=0;j<N;j++)xr.x1[j]=xc.x1[j]+alfa*(xc.x1[j]-Tpoint[H].x1[j]);if(alfa<E){if(chd==0){suan1(); /*寻找次坏点*/alfa=1.3;chd=1;break;}elsereturn(4);}}}while(chd==1);for(j=0;j<N;j++)Tpoint[H].x1[j]=xr.x1[j]; /**/return(fh1);}void main(){int i,val1,val2,dds,nmax;double a[N],b[N],fv;nmax=NM;fp=fopen(outname,"w");fprintf(fp,"**********复合形法计算结果**********\n\n");startab(a,b);fprintf(fp,"本次优化的上下限为:\n");fprintf(fp," a=[");for(i=0;i<N-1;i++)fprintf(fp,"%8.3f,",a[i]);fprintf(fp,"%8.3f]\n",a[N-1]);fprintf(fp," b=[");for(i=0;i<N-1;i++)fprintf(fp,"%8.3f,",b[i]);fprintf(fp,"%8.3f]\n",b[N-1]);do{val2=1;dds=1;val1=startfhx(a,b,nmax);if(val1==2)fprintf(fp,"找不到初始可行点,可能初始区间不合适!\n");else{fprintf(fp,"初始复合形各顶点坐标及函数值:\n");for(i=0;i<K;i++)fv=xfout(Tpoint[i].x1,i);suan();fprintf(fp," 最低和最高顶点号:L=%2d, H=%2d\n",L,H);fprintf(fp,"复合形顶点值均方差:%15.9lf\n\n",panbie());while(panbie()>E){val2=newfhx(a,b);if(val2==3){fprintf(fp,"该优化问题可行域为非凸集,");fprintf(fp,"重新给出优化的上下限为:\n");fprintf(fp,"a=[");for(i=0;i<N-1;i++)fprintf(fp,"%8.3f,",a[i]);fprintf(fp,"%8.3f]\n",a[N-1]);fprintf(fp,"b=[");for(i=0;i<N-1;i++)fprintf(fp,"%8.3f,",b[i]);fprintf(fp,"%8.3f]\n",b[N-1]);break;}suan();fprintf(fp,"迭代轮数k=%3d \n",dds);for(i=0;i<K;i++)fv=xfout(Tpoint[i].x1,i);fprintf(fp," 最低和最高顶点号:L=%2d, H=%2d\n",L,H);fprintf(fp,"复合形顶点值均方差:%15.9lf\n\n",panbie());dds++;}}}while(val2==3&&val1!=2);if(val2==4){fprintf(fp,"对次坏点的影射仍然无法找到下一个");fprintf(fp,"复合形顶点,计算终止。
机械优化复合形法 程序设计

课程设计(实验)材料(3)机械优化设计课程设计(实验)报告专业班级:设计题目:复合形程序设计学生姓名:学生学号:任课教师:2013年月日一、设计要求:根据已知条件,用复合形法完成一次迭代,只用反射变换复合形即可。
已知条件:1、目标函数:f(x)=25/(x1*x2*x2*x2)2、约束条件:g(x) 30/(x1*x2*x2*x2)-50<=0G(x) 0.0004*x1*x2-0.001<=0X1>=2 x1<=4 x2<=1 x2>=0.53、初始复合形顶点:X1=[2.2,0.55] X2=[2.4,0.6] X3=[2.6,0.65] X4=[2.8,0,7]二、方法原理:复合形法的基本思路是在n维空间的可行域中选取K个设计点(通常取n+1<=K<=2*n)作为初始复合形的顶点。
然后比较复合形各顶点目标函数的大小,其中目标函数值最大的点作为坏点,以坏点之外其余各点的中心为映射中心,寻找坏点的映射点,一般说来此映射点的目标函数值总是小于坏点的,也就是说映射点优于坏点。
这时,以映射点替换坏点与原复合形除坏点之外其余各点构成K个顶点的新的复合形。
如此反复迭代计算,在可行域中不断以目标函数值低的新点代替目标函数值最大的坏点从而构成新复合形,使复合形不断向最优点移动和收缩,直至收缩到复合形的各顶点与其形心非常接近、满足迭代精度要求时为止。
最后输出复合形各顶点中的目标函数值最小的顶点作为近似最优点。
三、程序清单:# include <stdio.h># include <math.h># define p 1.3# define k 4float fr,fh;float xr[2][1],xc[2][1];int xb_h,xb_xh;float f(float x[2][1]);float x1[2][1] = {{2.2},{0.55}};float x2[2][1] = {{2.4},{0.63}};float x3[2][1] = {{2.6},{0.65}};float x4[2][1] = {{2.8},{0.7 }};float Max_value,Min_value,Max_h_value; float shuzu[4];void hanshu_Maxvalue(void);void hanshu_Max_h_value(void);void zhshuzu(void);void hanshu_Minvalue(void);void chu_h(void);int ke_xr(void);int main(void){ int kexing_flag = 0;zhshuzu();hanshu_Minvalue();hanshu_Maxvalue();hanshu_Max_h_value();chu_h();while(ke_xr()){kexing_flag = 1;switch(xb_xh){case 1: fr = f(xr);fh = f(x1);if(fr < fh){ x1[0][0] = xr[0][0];x1[1][0] = xr[1][0]; }break;case 2: fr = f(xr);fh = f(x2);if(fr < fh){ x2[0][0] = xr[0][0];x2[1][0] = xr[1][0]; }break;case 3: fr = f(xr);fh = f(x3);if(fr < fh){ x3[0][0] = xr[0][0];x3[1][0] = xr[1][0]; } break;case 4: fr = f(xr);fh = f(x4);if(fr < fh){ x4[0][0] = xr[0][0];x4[1][0] = xr[1][0]; }break;} if(kexing_flag == 1)break;} printf("替换后结果为");printf("x1=");printf("[%.1f,%.2f]\n",x1[0][0],x1[1][0]);printf("输出\n");printf("x2=");printf("[%.1f,%.2f]\n",x2[0][0],x2[1][0]);printf("x3=");printf("[%.1f,%.2f]\n",x3[0][0],x3[1][0]);printf("x4=");printf("[%.1f,%.2f]\n",x4[0][0],x4[1][0]);return 0;}float f(float x[2][1]){float hanshuvalue;hanshuvalue = (25 * 1.0) / (x[0][0] * pow(x[1][0],3));return hanshuvalue;}void zhshuzu(void){shuzu[0] = f(x1);shuzu[1] = f(x2);shuzu[2] = f(x3);shuzu[3] = f(x4);}void hanshu_Minvalue(void){int i;Min_value = shuzu[0] ;for(i = 0; i < 4; i++)if(shuzu[i] <= Min_value )Min_value = shuzu[i] ;}void hanshu_Max_h_value(void){int i;Max_h_value = shuzu[0] ;for(i = 0; i<4; i++){if( xb_h == i)continue;elseif(shuzu[i] >= Max_h_value)Max_h_value = shuzu[i];} }void hanshu_Maxvalue(void){int i;Max_value = shuzu[0] ;for(i = 0; i < 4; i++)if(shuzu[i] >= Max_value ){Max_value = shuzu[i] ;xb_h = i;}}void chu_h(void){switch( xb_h){case 0: xc[0][0] = 1.0*(x2[0][0] + x3[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x2[1][0] + x3[1][0] + x4[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x1[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x1[1][0]); xb_xh = 1;break;case 1: xc[0][0] = 1.0*(x1[0][0] + x3[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x3[1][0] + x4[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x2[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x2[1][0]); xb_xh = 2;break;case 2: xc[0][0] = 1.0*(x1[0][0] + x2[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x2[1][0] + x4[1][0]) /(k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x3[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x3[1][0]); xb_xh = 3;break;case 3: xc[0][0] = 1.0*(x1[0][0] + x2[0][0] + x3[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x2[1][0] + x3[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x3[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x3[1][0]); xb_xh = 4;break;}}int ke_xr(void){if((30*1.0 / (xr[0][0]*pow(xr[1][0],3)) - 50) <= 0){ if((0.0004*xr[0][0]*xr[1][0] -0.001) <= 0)if(2 <= xr[0][0] && xr[0][0] <= 4 )if(0.5 <= xr[1][0] && xr[1][0] <= 1)return 1;} else return 0;}四、实验结果(要求附上程序运行结果截图)五、手算过程计算初始复合形各顶点的值f(X1)=68.3 f (X2)=48.2f (X3)=35.0 f (X4)=26.0坏点X(H)=X1 好点X(L)=X4去掉坏点后各点的几何中心X(C) X(C)=[2.6,0.65] 取映射α=1.3映射X(R)=X(C)+α(X(C)-X(H))=[2.82,0.78] 将映射点代入约束条件验证0.0004*2.82*0.78-0.001=-0.0001202<0 满足约束条件X(R)=[2.82,0.78] 是新的复合形顶点最优点为X(R)=[3.12,0.78]。
机械优化设计实验报告

《机械优化设计》实验报告目录1.进退法确定初始区间.................................................................................... 错误!未指定书签。
1.1 进退法基本思路................................................................................ 错误!未指定书签。
1.2 进退法程序框图................................................................................ 错误!未指定书签。
1.3 题目.................................................................................................... 错误!未指定书签。
1.4 源程序代码及运行结果.................................................................... 错误!未指定书签。
2.黄金分割法.................................................................................................... 错误!未指定书签。
2.2黄金分割法流程图............................................................................. 错误!未指定书签。
2.3 题目.................................................................................................... 错误!未指定书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机械优化设计——复合形方法及源程序(一) 题目:用复合形法求约束优化问题()()()2221645min -+-=x x x f ;06422211≤--=x x g ;01013≤-=x g 的最优解。
基本思路:在可行域中构造一个具有K 个顶点的初始复合形。
对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
(二) 复合形法的计算步骤1)选择复合形的顶点数k ,一般取n k n 21≤≤+,在可行域内构成具有k 个顶点的初始复合形。
2)计算复合形个顶点的目标函数值,比较其大小,找出最好点x L 、最坏点x H 、及此坏点x G..3)计算除去最坏点x H 以外的(k-1)个顶点的中心x C 。
判别x C 是否可行,若x C 为可行点,则转步骤4);若x C 为非可行点,则重新确定设计变量的下限和上限值,即令C L x b x a ==,,然后转步骤1),重新构造初始复合形。
4)按式()H C C R x x x x -+=α计算反射点x R,必要时改变反射系数α的值,直至反射成功,即满足式()()()()H R R j x f x f m j x g <⋯⋯=≤;,2,1,0,。
然后x R以取代x H,构成新的复合形。
5)若收敛条件()()[]ε≤⎪⎭⎪⎬⎫⎩⎨⎧--∑=211211k j L j x f x f k 得到满足,计算终止。
约束最优解为:()()L L x f x f x x ==*,*。
(三) 复合形法程序框图见下图:{scanf("%d",&n);printf("请输入复合形的顶点数k:");scanf("%d",&k);double **x=apply(k,n); /*存放复合形顶点*/double *y=(double *)calloc(k,sizeof(double)); /*存放目标函数值*/ double *p=(double *)calloc(3,sizeof(double)); /*存放约束函数值*/ double *a=(double *)calloc(n,sizeof(double)); /*存放设计变量的下限*/double *b=(double *)calloc(n,sizeof(double)); /*存放设计变量的上限*/double *x_c=(double *)calloc(n,sizeof(double)); /*存放可行点中心*/ double *x_r=(double *)calloc(n,sizeof(double)); /*存放最坏点的反射点*/printf("本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错\n");printf("请输入选定的第一个可行点x1(包含%d个数):",n);for(i=0;i<n;i++)scanf("%lf",*x+i);printf("请输入初选变量的下限a(包含%d个数):",n);for(i=0;i<n;i++)scanf("%lf",a+i);printf("请输入初选变量的上限b(包含%d个数):",n);for(i=0;i<n;i++)scanf("%lf",b+i);printf("输出输入结果为:\nn=%d,k=%d,x1=(",n,k); /*输出已知数据*/ for(i=0;i<n-1;i++)printf("%.5lf ",*(*x+i));printf("%.5lf)\na=(",*(*x+n-1));for(i=0;i<n-1;i++)printf("%f ",*(a+i));printf("%.5lf),b=(",*(a+n-1));for(i=0;i<n-1;i++)printf("%f ",*(b+i));printf("%.5lf)\n",*(b+n-1));L1: for(i=1;i<k;i++) /*随机得到其余(k-1)个可行点*/for(j=0;j<n;j++)*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j));l=1;for(i=1;i<k;i++) /*找出可行点的个数l,并把可行点放在前l个位置上*/if(judge(*(x+i))){for(j=1;j<k;j++)if(!judge(*(x+j))){for(k1=0;k1<n;k1++){temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;}break;}l++;}for(i=0;i<l-1;i++) /*把前l个可行点按目标函数值从大到小排序*/ for(j=i+1;j<l;j++)if(f(*(x+i))<f(*(x+j)))for(k1=0;k1<n;k1++){temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;}for(i=0;i<n;i++) /*求可行点中心*/*(x_c+i)=0;for(i=0;i<l;i++)for(j=0;j<n;j++)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i++)*(x_c+i)/=l;if(!judge(x_c)) /*判断可行点中心是否可行*/{for(i=0;i<n;i++){*(a+i)=*(*(x+l-1)+i);*(b+i)=*(x_c+i);}goto L1;}else{for(i=l;i<k;i++) /*将不可行点可行化*/do{for(j=0;j<n;j++)*(*(x+i)+j)=*(x_c+j)+*(*(*(x+i)+j)-*(x_c+j));}while(!judge(*(x+i)));L2: for(i=0;i<k-1;i++) /*将可行点按目标函数值从大到小排序*/ for(j=i+1;j<k;j++)if(f(*(x+i))<f(*(x+j)))for(k1=0;k1<n;k1++){temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;}restrain=0; /*求收敛条件*/for(i=0;i<k;i++)restrain+=(f(*(x+i))-f(*(x+k-1)))*(f(*(x+i))-f(*(x+k-1)));restrain=sqrt(k-1)*restrain);if(restrain<E0) /*判断收敛条件*/{printf("\n求得约束最优点为:( ");for(i=0;i<n;i++)printf("%.5f ",*(*(x+k-1)+i));printf(")\n目标函数的最优解为:%.5f\n",f(*(x+k-1)));return 0;}else{L3: for(i=0;i<n;i++) /*计算除去最坏点*x外的(k-1)个顶点的中心*/*(x_c+i)=0;for(i=1;i<k;i++)for(j=0;j<n;j++)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i++)*(x_c+i)/=k-1;reflect=;L4: for(i=0;i<n;i++) /*求反射点*/*(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i));if(!judge(x_r)){reflect*=;goto L4;}else if(f(x_r)<f(*x)){for(i=0;i<n;i++)*(*x+i)=*(x_r+i);goto L2;}else if(reflect<=1e-10){for(i=0;i<n;i++)*(*x+i)=*(*(x+1)+i);goto L3;}else{reflect*=;goto L4;}}}}double **apply(int row,int col) /*申请矩阵空间*/ {int i;double *x=(double*)calloc(row*col,sizeof(double));double **y=(double **)calloc(row,sizeof(double *));if(!x || !y){printf("内存分配失败!");exit(1);}for(i=0;i<row;i++)*(y+i)=x+i*col;return y;}double f(double *x) /*目标函数*/{return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6); }double *g(double *x) /*约束函数*/{double *p=(double *)calloc(3,sizeof(double));if(!p){printf("内存分配失败!");exit(1);}*p=64-(*x)*(*x)-(*(x+1))*(*(x+1));*(p+1)=*(x+1)-*x-10;*(p+2)=*x-10;return p;}bool judge(double *x) /*可行点的判断*/{int i;double *p=(double *)calloc(3,sizeof(double));p=g(x);for(i=0;i<3;i++)if(*(p+i)>0)break;if(i==3)return true;elsereturn false;}(五)运行结果如下:。