1、以f(x)=*x+2*x为例黄金分割#include #define e 0.001/收敛精度main()float a,b,x1,x2,y1,y2;float minx,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(y1y2) a=x1; else b=x2; while(b-a)e);/两个数值小于收敛精度e时终结minx=(x1+x2)/2;/取两数值平均值miny=minx*minx+2*minx;prin
2、tf(The minx is %f and the miny is %f.n,minx,miny);/极小值二次插值法#include#includeint main(void) double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j3; int i,h=1; /取正向搜索(h值为负则为反向搜索)。 void finding(double a3);/一维搜索拟定区间。 finding(j);/返回所得旳区间值a1,a2,a3。 a1=j0; /以数组j3为过渡,衔接搜索区间旳值并赋值给主函数旳a1,a2,a3。 a2=j1; /事实上是不会这样用旳,此
3、处是以便衔接一维搜索函数与主函数,后来可类似。 a3=j2; m=0.001; /*输入m值,以拟定精确度*。 double f(double x); /方程函数阐明。 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)0) if(y2=yp) a1=a2;y1=y2; a2=ap;y2=yp; else a3=ap;y3=yp; else
4、 if(y2=yp) a3=a2;y3=y2; a2=ap;y2=yp; elsea1=ap;y1=yp; double x,y; /用x,y储存所得极值点。 if(y2y0) /将逆方向寻找变向。 h=-h; a2=a0;y2=y0; do a0=a1;a1=a2; y0=y1;y1=y2; a2=a1+h;y2=f(a2); h=2*h; while(y2=1;i+) a2=a1+h;y2=f(a2); if(y2=y1) break; /寻找成功,打印输出。 h=2*h; a0=a1;y0=y1; a1=a2;y1=y2; return;外推法#includefloat f(float t) float z; z=t*t+2*t; return z;void main()float h0=1,h=h0,a1=0,a2=h,y1,y2,a3,y3; y1=f(a1); y2=f(a2); if(y2y1) h=-h;a3=a1;y3=y1; a1=a2;y1=y2;a2=a3;y2=y3; a3=a2+h;y3=f(a3);while(y3y2) h=2*h; a1=a2;y1=y2;a2=a3;y2=y3; a3=a2+h;y3=f(a3);printf(f(%f)=%fnf(%f)=%fnf(%f)=%f,a1,y1,a2,y2,a3,y3);