欢迎来到天天文库
浏览记录
ID:38716362
大小:37.00 KB
页数:4页
时间:2019-06-18
《机械优化设计 一维搜索方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、以f(x)=*x+2*x为例黄金分割#include#definee0.001//收敛精度main(){floata,b,x1,x2,y1,y2;floatminx,miny;x1=-3;x2=5;//x1,x2初始化a=x1;b=x2;//a1,a2初始化do{x1=a+0.382*(b-a);x2=a+0.618*(b-a);y1=x1*x1+2*x1;y2=x2*x2+2*x2;if(y1>y2)a=x1;elseb=x2;}while((b-a)>e);//两个数值小于收敛精度e时终止minx=(x1+x2)/2;//取两数值平均值miny=minx
2、*minx+2*minx;printf("Theminxis%fandtheminyis%f.",minx,miny);//极小值}二次插值法#include#includeintmain(void){doublea1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m;doublej[3];inti,h=1;//取正向搜索(h值为负则为反向搜索)。voidfinding(doublea[3]);//一维搜索确定区间。finding(j);//返回所得的区间值a1,a2,a3。a1=j[0];//以数组j[3]为过渡,衔接搜索区间的
3、值并赋值给主函数的a1,a2,a3。a2=j[1];//实际上是不会这么用的,此处是方便衔接一维搜索函数与主函数,以后可类似。a3=j[2];m=0.001;//**输入m值,以确定精确度**。doublef(doublex);//方程函数说明。y1=f(a1);//初始化。y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);ap=0.5*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)4、ap-a2)*h>0){if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}elseif(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;}}doublex,y;//用x,y储存所得极值点。if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f",x);printf("y*=%f",y);return0;}//定义方程函数。doublef(doublex){doubley;y=x*x-2*x;//**输入方程**5、。returny;}//确定区间的外推法(取步长h=1)。voidfinding(doublea[3]){inth,i;doubley[3];a[0]=0;//**0周围开始搜索**h=1;//**输入h值,以确定步长**。a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]);//初始化。if(y[1]>y[0])//将逆方向寻找变向。{h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]);h=2*h;}while(y[2]6、);}else{//正方向寻找。for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;//寻找成功,打印输出。h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}外推法#includefloatf(floatt){floatz;z=t*t+2*t;returnz;}voidmain(){floath0=1,h=h0,a1=0,a2=h,y1,y2,a3,y3;y1=f(a1);y2=f(a2);if(y2>y1){h=-h;a37、=a1;y3=y1;a1=a2;y1=y2;a2=a3;y2=y3;}a3=a2+h;y3=f(a3);while(y3
4、ap-a2)*h>0){if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}elseif(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;}}doublex,y;//用x,y储存所得极值点。if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f",x);printf("y*=%f",y);return0;}//定义方程函数。doublef(doublex){doubley;y=x*x-2*x;//**输入方程**
5、。returny;}//确定区间的外推法(取步长h=1)。voidfinding(doublea[3]){inth,i;doubley[3];a[0]=0;//**0周围开始搜索**h=1;//**输入h值,以确定步长**。a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]);//初始化。if(y[1]>y[0])//将逆方向寻找变向。{h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]);h=2*h;}while(y[2]6、);}else{//正方向寻找。for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;//寻找成功,打印输出。h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}外推法#includefloatf(floatt){floatz;z=t*t+2*t;returnz;}voidmain(){floath0=1,h=h0,a1=0,a2=h,y1,y2,a3,y3;y1=f(a1);y2=f(a2);if(y2>y1){h=-h;a37、=a1;y3=y1;a1=a2;y1=y2;a2=a3;y2=y3;}a3=a2+h;y3=f(a3);while(y3
6、);}else{//正方向寻找。for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;//寻找成功,打印输出。h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}外推法#includefloatf(floatt){floatz;z=t*t+2*t;returnz;}voidmain(){floath0=1,h=h0,a1=0,a2=h,y1,y2,a3,y3;y1=f(a1);y2=f(a2);if(y2>y1){h=-h;a3
7、=a1;y3=y1;a1=a2;y1=y2;a2=a3;y2=y3;}a3=a2+h;y3=f(a3);while(y3
此文档下载收益归作者所有