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

合集下载

机械优化设计

机械优化设计

机械优化设计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.运行结果。

优化设计复合形法

优化设计复合形法
f (X1) 4 2 12 12 5 f (X2) 4 4 12 12 3 f (X3) 43 32 12 9
所以,坏点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程序及例题

复合形法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)最小的点。

机械优化设计-复合型法

机械优化设计-复合型法
double a[]={0,0},b[]={10,20},f,x[2],xcom[2][100];
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的优势与其他科学计算软件相比,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. 优化方法的实际应用三、实验步骤1. 黄金分割法(1)基本原理黄金分割法是一种在给定初始区间内搜索极小点的一维搜索方法。

其基本原理是:在区间内取两个点,根据函数值的比较,将区间分为三段,保留包含极小值的段,再进行相同的操作,逐步缩小搜索区间。

(2)编程实现根据黄金分割法的基本原理,编写相应的C语言程序,实现一维搜索。

```c#include <stdio.h>#include <math.h>double f(double x) {// 定义目标函数return x x - 4 x + 4;}double golden_section_search(double a, double b, double tol) {double r = 0.618;double a1 = a + r (b - a); double a2 = b - r (b - a); double fa1 = f(a1);double fa2 = f(a2);while (fabs(b - a) > tol) { if (fa1 > fa2) {a = a1;a1 = a2;a2 = b - r (b - a); fa1 = fa2;fa2 = f(a2);} else {b = a2;a2 = a1;a1 = a + r (b - a); fa2 = fa1;fa1 = f(a1);}}return (a + b) / 2;}int main() {double x_min = golden_section_search(a, b, tol);printf("Optimal solution: x = %f\n", x_min);return 0;}```(3)结果分析通过运行程序,可以得到最优解 x = 2.000000,目标函数值为 f(x) = 0。

机械优化大作业-MATLAB复合型法

机械优化大作业-MATLAB复合型法

机床主轴机构优化设计机床主轴是机床中重要的零件之一,一般多为支撑空心阶梯轴。

为了便于使用材料力学进行结构分析,常常将阶梯轴简化成以当量直径表示的等截面轴。

如图0.1所示是一个已经简化处理的专用机床双主轴的力学模型。

从机床主轴制造成本较低和加工精度较高的要求出发,需要考虑主轴的自重和外身段挠度这样两个重要因素。

对于专用机床来说,并不追求过高的加工精度。

因此选取零件自身重量轻为设计目标,将主轴的刚度作为约束条件。

一、设计变量和目标函数当主轴的材料选定之后,与主轴重量设计方案有关设计变量主轴的外径D、孔径d、两支承跨度l、和外伸段长度a,如图0.1所示。

由于机床主轴的孔径主要取决于待加工棒料的直径,不能作为设计变量处理。

因此,设计变量为机床主轴重量最轻优化设计目标函数为二、约束条件1.刚度性条件机床的加工质量在很大程度上取决于主轴的刚度,主轴刚度是一个很重要的性能指标。

因此,要求主轴悬臂端挠度不超过给定的变形量y 0 。

根据材料力学可知,主轴悬臂端挠度为)()()(44231232d x E 3x x Fx 64EJ 3a l Fa y -+=+=π式中,)(44d -D 64J π=是空心主轴的惯性矩;E=2.1x105MPa 是主轴的弹性模量;F 是作用主轴外伸端的力。

整理得到主轴刚度的约束条件为0d x E 3x x Fx 64X g 442312301≥-+-=)()()(πy2.设计边界条件三个设计变量的边界约束条件为max min l l l ≤≤max min D D D ≤≤maxmin a a a ≤≤3.具体算例已知某机床主轴悬臂端受到的切削力F=15000N ,主轴内径d=30mm ,悬臂端许用挠度y 0=0.05mm 。

要求主轴两支承跨度mm lmm 650300≤≤,外径mm D mm 14060≤≤,悬臂长度mm a mm 15090≤≤。

建立优化的数学模型)30)((7854.0)(22231++=x x x X fTT a D l x x x X ],,[],,[321==0)30()(7009.91)(..44231231≥-+⨯-=x x x x X g t s01300/)(12≥-=x X g0650/1)(13≥-=x X g0160/)(24≥-=x X g0140/1)(25≥-=x X g0190/)(36≥-=x X g0150/1)(37≥-=x X g4.基于matlab 程序的复合形法实现优化(1)算法原理复合形法来源于无约束优化问题的单纯形法,通过构造复合形来求得最优解,新的复合形通过替换旧的复合形中的坏点(目标函数最大或次大的点)得到,替换方式仍是单纯性法中的反应、压缩、扩展这几个基本方法。

复合形法matlab程序及例题

复合形法matlab程序及例题

复合形法matlab程序及例题复合形法是一种数值分析方法,用于求解多元函数的最小值。

本文将介绍复合形法的基本原理及其在MATLAB中的实现,同时给出一个具体的例题进行演示。

一、复合形法基本原理复合形法(Nelder-Mead算法)是一种无导数优化方法,它的基本思想是在函数域内随机选择一些点,通过对这些点进行逐步变换、调整,最终找到极小值点。

其算法流程如下:1. 选定n+1个点作为初始点,其中n为被优化函数的自变量个数。

这些点可以随机生成,也可以通过一定的规则生成。

2. 对这些点进行排序,确定最小值点、最大值点和次大值点。

3. 通过一系列变换操作,将最大值点向中间靠拢,同时保持其他点的位置不变。

4. 根据变换后的结果,重新排序,判断是否满足终止条件。

若不满足,继续进行变换操作,直到满足终止条件为止。

终止条件可以是迭代次数、函数值的变化量或某些停止准则的满足等。

二、复合形法MATLAB程序实现复合形法的MATLAB程序可以通过fminsearch函数实现,其语法格式如下:[x,fval,exitflag,output] = fminsearch(fun,x0,options) 其中,fun为被优化的函数,x0为初始点,options为优化选项。

程序返回变量x为最小值点,fval为最小值,exitflag为程序停止状态,output为程序运行信息。

下面是一个简单的例子,用来演示如何使用MATLAB实现复合形法:1. 定义被优化的函数:f(x,y) = (x-2)^2+(y+1)^2+2function z = myfun(x)z = (x(1)-2)^2 + (x(2)+1)^2 + 2;2. 定义初始点和优化选项:x0 = [-1,1];opts = optimset('Display','iter');3. 运行fminsearch函数:[x,fval,exitflag,output] = fminsearch(@myfun,x0,opts);4. 输出结果:x = 1.9999 -0.9999fval = 2.0000exitflag = 1output =iterations: 30funcCount: 58algorithm: 'Nelder-Mead simplex direct search'message: 'Optimization terminated: relative function value decreasing below OPTIONS.TolFun.'最终输出结果表明,通过30次迭代,算法找到了函数的最小值点为x=1.9999,y=-0.9999,函数值为2.0000。

机械优化设计方案三个案例

机械优化设计方案三个案例

机械优化设计案例11.题目对一对单级圆柱齿轮减速器,以体积最小为目标进行优化设计。

2■已知条件已知数输入功p=58kw,输入转速n i=1000r/min,齿数比u=5, 齿轮的许用应力[、:]H=550Mpa,许用弯曲应力[:]F=400Mpa。

3■建立优化模型3.1问题分析及设计变量的确定由已知条件得求在满足零件刚度和强度条件下,使减速器体积最小的各项设计参数。

由于齿轮和轴的尺寸(即壳体内的零件) 是决定减速器体积的依据,故可按它们的体积之和最小的原则建立目标函数。

单机圆柱齿轮减速器的齿轮和轴的体积可近似的表示为:2 2 2 2 2 2v =0.25*0 -d z1) 0.25二b(d2 -d z2) -0.25(b -c)(D g2 -d g2)-d0c 0.25二l(d; d;2) 7二d; 8:d;22 2 2 2 2 2 2 2= 0.25叫m z b _d z初+m z u b _d z2b-0.8b(mzu—10m) +2 2 2 22.05bd Z2 -0.05b(mzu -10m -1.6d z2)+d zd + 28d z1 +32d z2】式中符号意义由结构图给出,其计算公式为d1= mz, d2= mz2D g2二u m1z10md g2=1.6d z2,d0=0.25(u m1z10m-1.6d z2)c =0.2b由上式知,齿数比给定之后,体积取决于b、Z1、m、l、d z1和d z2六个参数,则设计变量可取为x 二[X1 X2 X3 X4 X冷]丁=[b 乙m I d z1 d z2〕T3.2目标函数为2 2 2 2 2 2 f (x^ 0.785398(4.75X1X2X385X1X2X3-85X1X30.92X1X^X1X52 2 2 2 2 20.8x1x2x3x^ -1.6x1x3x6x4x5x4x628x532x6)—;min3.3约束条件的建立1)为避免发生根切,应有乙-為山=17,得g i(x) =17 _X2 乞0:? .:■■ b.■:min 二—T max m CO CD 2 )齿宽应满足 d , Fin和Fax为齿宽系数'd的最大值和最小值,一般取;:min =0.9, max=1.4,得g2(x) =0.9 -为(X2X3) _0g3(x) =x1;(X2X3) -1.4 乞03)动力传递的齿轮模数应大于2mm,得g4(x)=2-X3 乞04)为了限制大齿轮的直径不至过大,小齿轮的直径不能大于d1 max 彳得g5(x) 7x3 -3 0 005)齿轮轴直径的范围:dzmin - dz "/x得g6(x)=1 0 0X5 _0g7(x) =X5 -1 5 00g8(x) =1 3 0X6 岂0g9(x)=冷一2 0 0 06)轴的支撑距离1按结构关系,应满足条件:1 - b • 2:伽• 0.5dz2(可取比min =20),得g10 (x)二X1 0.5x6 - X4 - 40 _ 0 7)齿轮的接触应力和弯曲应力应不大于许用值,得g11(x) =1468250. (x2x3 _ % ) -550 - 0q12(x)=7098 2 Q-4 2 一400 —0 12X1X2X3 (0.169 0.6666 10 x^ 0.854 10 X2)g13(x)=70982 2 4 2 -400 空01X1X2X3 (0.2824 0.177 10 x^0.394 10 X2)8)齿轮轴的最大挠度;max 不大于许用值,得g 14(x ) =117.04x ;.(X 2X 3X 4) -0.003x 4 乞 09)齿轮轴的弯曲应力;w 不大于许用值['」w ,得 g i5(x )=厶](2.85"0 生)2 +2.4X101'-5.5 兰0X 5 V X 2X 3 | 61 J 2.85^ 10 沧\2 丄c 12g i6(x )=p 1( -------------- ) +6X10 —5.5 兰 0X 6 t X 2X 34■优化方法的选择由于该问题有6个设计变量,16个约束条件的优化设计问题, 采用传统的优化设计方法比较繁琐,比较复杂,所以选用 Matlab 优化工具箱中的fmincon 函数来求解此非线性优化问题,避免了 较为繁重的计算过程。

机械优化设计实验指导书

机械优化设计实验指导书

前 言机械优化设计是一门实践性很强的课程,必须通过实际上机操作运用各种优化方法程序来达到:1、加深对机械优化设计方法的基本理论和算法步骤的理解;2、培养独立编制计算机程序的能力;3、掌握常用优化方法程序的使用;4、培养灵活运用优化方法解决工程设计问题的能力。

因此,本课程在课堂教学过程中安排适当的时间上计算机运算。

本书作为上机实验的指导书,旨在对每次实验目的内容提出具体要求,并加以考核。

实验报告内容每次上机实验后,学生要做一份完整的实验报告,实验报告内容应包括:1、优化方法的基本原理简述;2、自编优化方法源程序。

3、考核题的优化结果及其分析;4、具体工程设计问题的数学模型、优化设计结果及其分析。

实验一 一维搜索方法(黄金分割法或二次插值法)1、 目的:加深对一维搜索方法的确定区间的进退法和缩短区间的黄金分割法或二次插值法基本原理的理解2、 内容:按所给程序框图编制上机程序,上机输入、调试并运行程序,或调试并运行已给程序,用所给考核题进行检验。

3、 考核题(α0=0,h 0=0.1, ε=0.001)(1) 36102+-=t t )t (f min(2) 60645234+-+-=t t t t )t (f min(3) 221)t )(t ()t (f min -+=(4) x e x )x (f min -+=22(5) 求函数4321322123141x x x x x x x x x x )X (f +--=自点T k ),,,(X 3210---=出发,沿方向T ),,,(4321=d 的最优步长因子α× 和在d 方向的极小点X *和极小值f(X *)。

实验二 多维无约束优化方法(鲍威尔法或拟牛顿法)1、目的:加深对所学多维无约束优化方法基本原理的理解,增强编制和调试程序的能力,懂得如何在多维无约束优化方法中调用一维搜索方法程序。

2、内容:按所给程序框图编制上机程序,上机输入、调试并运行程序,或调试并运行已给程序,用所给考核题进行检验。

优化设计复合型法程序

优化设计复合型法程序

复合形法Const N = 2Const K = 4'Const N1 = 2Const N1 = 5Const E = 0.001Const NM = 500Dim OutName As StringDim H As IntegerDim L As IntegerDim f() As DoubleFunction Fx(x() As Double) As Double'Fx = (x(1) - 2) * (x(1) - 2) + (x(2) - 1) * (x(2) - 1)Fx = x(2) ^ 3 * ((x(1) - 3) ^ 2 - 9) / (27 *Sqr(3))End FunctionFunction Strain(x() As Double) As Integer Dim i As IntegerDim fin As IntegerDim g() As DoubleReDim g(N1) As Doublefin = 1'=========所有约束条件都为大于0的格式:g(x)>0==============='g(1) = x(2) - x(1) * x(1)'g(2) = 2 - x(1) - x(2)g(1) = x(1) / Sqr(3) - x(2)g(2) = x(1) + x(2) / Sqr(3)g(3) = 6 - x(1) - Sqr(3) * x(2)g(4) = x(1)g(5) = x(2)For i = 1 To N1If g(i) < 0# Thenfin = 0Exit ForEnd IfNext iStrain = finEnd FunctionSub Startab(a() As Double, b() As Double)'a(1) = -5#: b(1) = 6#'a(2) = -5#: b(2) = 8#a(1) = -10#: b(1) = 20# a(2) = -5#: b(2) = 8#End SubFunction xfout(x() As Double, m As Integer) As DoubleDim j As IntegerDim f As Doublef = Fx(x)Print #1, "For j = 1 To N - 1Print #1, Format$(x(j), "###0.0000000"); " ";Next jPrint #1, Format$(x(N), "###0.0000000"); "]", m, Format$(f, "###0.0000000")xfout = fEnd FunctionFunction StartFhx(a() As Double, b() As Double, num As Integer) As IntegerDim i As Integer, i1 As Integer, iw As Integer, kk As IntegerDim j As Integer, j1 As Integer, m As Integer, fh1 As IntegerDim sum2() As DoubleReDim sum2(N) As DoubleDim sum3 As Double, delt1 As DoubleDim alf As Double, r As Doublekk = 0fh1 = 1delt1 = 0.01'RandomizeDoFor i = 1 To NRandomizeTpoint(1).X1(i) = a(i) + Rnd * (b(i) - a(i)) Next iiw = Strain(Tpoint(0).X1)kk = kk + 1If (kk > num) ThenDebug.Print "找不到初始可行点,可能初始区间不合适!"fh1 = 2StartFhx = fh1Exit FunctionEnd IfLoop While (iw = 0)For j = 2 To KDoFor i = 1 To NRandomizeTpoint(j).X1(i) = a(i) + Rnd * (b(i) - a(i)) Next iiw = Strain(Tpoint(j).X1)If iw = 0 Thenm = jFor i1 = 1 To Nsum2(i1) = 0Next i1For i1 = 1 To NFor j1 = 1 To msum2(i1) = sum2(i1) + Tpoint(j1).X1(i1) Next j1Next i1For j1 = 1 To NXc.X1(j1) = sum2(j1) / mNext j1alf = 0.5DoFor i = 1 To NTpoint(m).X1(i) = Xc.X1(i) + alf * (Tpoint(m).X1(i) - Xc.X1(i))Next isum3 = 0For i1 = 1 To Nsum3=sum3 + (Tpoint(m).X1(i1) -Xc.X1(i1)) * (Tpoint(m).X1(i1) - Xc.X1(i1)) Next i1sum3 = Sqr(sum3)iw = Strain(Tpoint(m).X1)Loop While (iw = 0 And sum3 > delt1)End IfLoop While (sum3 < delt1)Next jStartFhx = fh1 '返回标志fh1=1End FunctionSub Suan()Dim Max As Double, Min As DoubleDim i As IntegerFor i = 1 To K f(i) = Fx(Tpoint(i).X1)Next iMax = f(1): Min = f(1): H = 1: L = 1For i = 2 To KIf f(i) > Max ThenMax = f(i)H = iElseIf f(i) < Min ThenMin = f(i)L = iEnd IfEnd IfNext iEnd SubSub suan1()Dim Min As DoubleDim i As IntegerDim ih As IntegerMin = f(L) ih = 0For i = 1 To KIf i <> H ThenIf f(i) > Min ThenMin = f(i)ih = iEnd IfEnd IfNext iH = ihEnd SubFunction PanBie() As DoubleDim sum As DoubleDim i As Integersum = 0#For i = 1 To Ksum = sum + (f(i) - f(L)) * (f(i) - f(L))Next iPanBie = Sqr(sum / K)End FunctionFunction NewFhx(a() As Double, b() As Double) As IntegerDim i As Integer, j As Integer, fh1 As Integer, chd As IntegerDim alfa As DoubleDim sum1() As DoubleReDim sum1(N) As Doublefh1 = 1chd = 0Doalfa = 1.3For j = 1 To Nsum1(j) = 0#Next jFor i = 1 To KIf i <> H ThenFor j = 1 To Nsum1(j) = sum1(j) + Tpoint(i).X1(j) Next jEnd IfNextFor j = 1 To NXc.X1(j) = sum1(j) / (K - 1)Next jIf Strain(Xc.X1) = 0 ThenPrint #1, "Xc is wrong "fh1 = 3For i = 1 To Na(i) = Tpoint(L).X1(i)b(i) = Xc.X1(i)Next iNewFhx = fh1Exit FunctionEnd IfFor j = 1 To NXr.X1(j) = Xc.X1(j) + alfa * (Xc.X1(j) - Tpoint(H).X1(j))Next jDo While (Strain(Xr.X1) = 0) Or(Fx(Xr.X1) >= Fx(Tpoint(H).X1))alfa = alfa * 0.5For j = 1 To NXr.X1(j) = Xc.X1(j) + alfa * (Xc.X1(j) - Tpoint(H).X1(j))Next jIf alfa < E ThenIf chd = 0 ThenCall suan1alfa = 1.3 chd = 1Exit DoElseNewFhx = 4Exit FunctionEnd IfEnd IfLoopLoop While (chd = 1)For j = 1 To NTpoint(H).X1(j) = Xr.X1(j)Next jNewFhx = fh1End FunctionPrivate Sub Command1_Click()Dim i As IntegerDim val1 As IntegerDim val2 As IntegerDim dds As IntegerDim nmax As IntegerDim fv As DoubleDim a() As Double, b() As Double ReDim a(N) As Double, b(N) As Double ReDim f(K) As DoubleReDim Tpoint(K) As Coordnmax = NMH = 1: L = 1OutName = "复合形法计算结果.txt" Open OutName For Output As #1Print #1,"************复合形法计算结果****" Call Startab(a, b)Print #1, "本次优化的上下限为:" Print #1, " a=[";For i = 1 To N - 1Print #1, a(i);Next iPrint #1, a(N); "]"Print #1, " b=[";For i = 1 To N - 1Print #1, b(i);Next iPrint #1, b(N); "]"Doval2 = 1dds = 1val1 = StartFhx(a, b, nmax)If val1 = 2 ThenPrint #1, "找不到初始可行点,可能初始区间不合适!"ElsePrint #1, "初始复合形各顶点坐标及函数值:"For i = 1 To Kfv = xfout(Tpoint(i).X1, i)Next iCall SuanPrint #1, " 最好和最差顶点号:"; "L="; L, "H="; HPrint #1, " 复合形顶点值均方差:", Format$(PanBie(), "###0.0000000")Print #1,"---------------------------------------------------" Do While PanBie() > Eval2 = NewFhx(a, b)If (val2 = 3) ThenPrint #1, "该优化问题可行域为非凸集,"; Print #1, "重新给出优化的上下限为:" Print #1, "a=[";For i = 1 To N - 1Print #1, a(i);Next iPrint #1, a(N); "]"Print #1, "b=[";For i = 1 To N - 1Print #1, b(i);Next iPrint #1, b(N); "]"Exit DoEnd IfCall SuanPrint #1, "迭代轮数k="; ddsFor i = 1 To Kfv = xfout(Tpoint(i).X1, i)Next iPrint #1, "最好和最差顶点号:"; "L="; L, "H="; HPrint #1, "复合形顶点值均方差:"; Format$(PanBie(), "###0.0000000")Print #1,"---------------------------------------------------" dds = dds + 1LoopEnd IfLoop While (val2 = 3 And val1 <> 2)If val2 = 4 ThenPrint #1, "对次坏点的影射仍然无法找到下一个";Print #1, "复合形顶点,计算终止。

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

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

机械优化设计——复合形方法及源程序(一)题目:用复合形法求约束优化问题()()()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 ==*,*.(三)复合形法程序框图见下图:(四)/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/#include 〈stdio。

h>#include 〈stdlib。

h〉#include 〈time.h>#include 〈math.h>#define E0 1e—5 /*复合形法收敛控制精度*/double **apply(int,int); /*申请矩阵空间*/double f(double *);/*目标函数*/double *g(double *);/*约束函数*/bool judge(double *); /*可行点的判断*/int main(){int n,k;int i,j,k1;int l;double temporary;double restrain; /*收敛条件*/double reflect; /*反射系数*/srand((unsigned)time(NULL));printf("请输入目标函数的维数n:"); /*输入已知数据*/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(”%。

机械优化设计方法(PPT 203页)

机械优化设计方法(PPT 203页)
则函数f(x)在x * 附近的一切x均满足不等式
f xf x*
所以函数f(x)在 x * 处取得局部极小值,称x * 为
局部极小点。 而优化问题一般是要求目标函数在某一区域内 的全局极小点。 函数的局部极小点是不是一定是全局极小点呢?
图2-7 下凸的一元函数
第四节优化设计问题的基本解法
求解优化问题的方法:
解析法 数值法
数学模型复杂时不便求解
可以处理复杂函数及没有数学表达式 的优化设计问题
图1-11 寻求极值点的搜索过程
第二章 优化设计的数学基础
机械设计问题一般是非线性规划问题。
实质上是多元非线性函数的极小化问题,因 此,机械优化设计是建立在多元函数的极值 理论基础上的。
2.目前机械优化设计的应用领域
在机械设计方面的应用较晚,从国际范围来说, 是在上世纪60年代后期才得到迅速发展的。
国内近年来才开始重视,但发展迅速,在机构 综合、机械的通用零部件的设计、工艺设计方 面都得到应用。
优化设计本身存在的问题和某些发展趋势主要 有以下几方面:
1)目前优化设计多数还局限在参数最优化这种数 值量优化问题。结构型式的选择还需进一步研究 解决。
图2-5 二维问题的可行域
三、目标函数
目标函数是设计变量的函数,是设计中所 追求的目标。如:轴的质量,弹簧的体积,齿 轮的承载能力等。
在优化设计中,用目标函数的大小来衡量设 计方案的优劣,故目标函数也可称评价函数。
目标函数的一般表示式为:
f(x)f(x1,x2,...xn)
优化设计的目的就是要求所选择的设计变 量使目标函数达到最佳值,即使 f(x)Opt
通常 f(x)min
单目标设计问题
目标函数

机械优化设计_第六章约束优化方法

机械优化设计_第六章约束优化方法

X K X H XC X H
f XK f XH
则收缩成功,用收 缩点构成新的复合 形。
机械优化设计 (4)压缩
若采用上述方法均无效,可采取复合形各顶点向最 好点 X L 靠拢,即采用压缩的方法来改变复合形的形状。 压缩后的各顶点的计算公式为:
X j X L 0.5 X L X j ( j 1, 2, , k ; j L)
x, 1 , 2 f x 1G g j x 2 H hk x
j 1 k 1
m
l
新目标函数
加权因子
机械优化设计 2)间接解法的特点
①计算效率和数值计算的稳定性有较大提高; ②可以有效地处理具有约束等式约束的约束优化 问题; ③选择加权因子困难,如果选择不当,不但影响 收敛速度和计算精度,甚至会导致计算失败。
hk X hk x1, x2 , xn 0(k 1,2, l )
求解上式的方法称为约束优化方法
机械优化设计 2、求解方法 根据求解方式不同,约束优化设计问题可分为 直接解法和间接解法。 (1)直接解法:将迭代点限制在可行域内(可行 性),步步降低目标函数值(下降性),直至到达 最优点。如随机方向法、复合形法、可行方向法、 广义简约梯度法。 (2)间接解法:通过变换,将约束优化问题转化 为无约束优化问题求解。如惩罚函数法、增广乘子 法等。
g j X R 0 J 1, 2, , m f XR f XH
机械优化设计 (2)扩张
当求得的反射点为可行点,且目标函数值下降较多, 则沿反射方向继续移动,即采用扩张的方法,可能找到 更好的新点
X E X R X R XC

机械优化设计实验c语言程序

机械优化设计实验c语言程序

二次插值法#include "stdio.h"#include "math.h"#include "conio.h"void main(){float *area(float a1,float p,float a[3]);float f(float x);float ar,fr;float a2,a3;float f1,f2,f3;float a1=10,p=0.01,e=0.00001;float pa[3];area(a1,p,pa);a1=pa[0];a2=pa[1];a3=pa[2];f1=f(a1);f2=f(a2);f3=f(a3);do{ar=((a3*a3-a2*a2)*f1+(a1*a1-a3*a3)*f2+(a2*a2-a1*a1)*f3); ar=ar/2/((a3-a2)*f1+(a1-a3)*f2+(a2-a1)*f3);fr=f(ar);if(ar>a2){if(fr>f2){a3=ar;f3=fr;}else if(fr<f2){a1=a2;f1=f2;a2=ar;f2=fr;}else{a3=ar;a1=a2;a2=(a1+a3)/2;f1=f2;f3=fr;f2=f(a2);}}else if(ar<a2){if(fr>f2){a1=ar;f1=fr;}else if(fr<f2){a3=a2;f3=f2;a2=ar;f2=fr;}else{a1=ar;a3=a2;a2=(a1+a3)/2;f1=fr;f3=f2;f2=f(a2);}}if(fabs(a1-a3)<=e) break;}while(1);if(f2<fr){ar=a2;fr=f2;}printf("\nx*=%f\nf(x*)=%f",ar,fr);}float *area(float a1,float p,float a[3]){float f(float x);float a2,f2,a3,f3,temp;float acc=0.01;float f1=f(a1);float p;while(1){a2=a1+p;f2=f(a2);if(f2>=f1){if(fabs(f2-f1)<acc)p=p/2;elsep=-p;}else break;}while(1){a3=a2+p;f3=f(a3);if(f2<=f3) break;p=2*p;a1=a2;f1=f2;a2=a3;f2=f3;}if(a1>a3){temp=a1;a1=a3;a3=temp;}a[0]=a1;a[1]=a2;a[2]=a3;return a;}float f(float x){float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;return y;}变尺度法计算f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2 的无约束极值,初始点x0=[1,1]。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}(五)运行结果如下:。

相关文档
最新文档