《鲍威尔法C++源程序》由会员分享,可在线阅读,更多相关《鲍威尔法C++源程序(11页珍藏版)》请在金锄头文库上搜索。
1、#define n1 2 #define tt#define ad/ 定义常量/tt初始迭代步长/ad收敛精度float ia;float fny(float *x)float f;目标函数f=10*pow(x0+x1-5),2)+pow(x0-x1),2); / return(f);float *iterate(float *x,float a, float *s)float *x1;x1=(float *)malloc(n1 * sizeof(float);for (int i=0;in1;i+)x1i=xi+a*si;return(x1);float func(float *x,floa
2、t a,float *s)float *x1;x1=iterate(x,a,s);float f=fny(x1);return(f);void finding(float a3,float f3,float *xk,float *s)float t=tt;float a1,f1;a0=0; f0=func(xk,a0,s);for (int i=0;i+)a1=a0+t; f1=func(xk,a1,s);if (f1=ad)t=-t;a0=a1; f0=f1;if (ia=1) return;t=t/2; ia=1;for (i=0;i+)a2=a1+t; f2=func(xk,a2,s);
3、if (f2f1)break;t=2*t;a0=a1; f0=f1;a1=a2; f1=f2;if (a0a2)a1=a0; f1=f0;a0=a2; f0=f2;a2=a1; f2=f1;return;/second insertfloat lagrange(float *xk,float *ft,float *s)float a3,f3;float b,c,d,aa;finding (a,f,xk,s);for (int i=0;i+)if (ia=1)aa=a1; *ft=f1;break;d=(pow(a0,2)-pow(a2,2)*(a0-a1)-(pow(a0,2)-pow(a1,
4、2)*(a 0-a2);if(fabs(d)=0)break;c=(f0-f2)*(a0-a1)-(f0-f1)*(a0-a2)/d;if(fabs(c)=0)break;b=(f0-f1)-c*(pow(a0,2)-pow(a1,2)/(a0-a1);aa=-b/(2*c);*ft=func(xk,aa,s);if (fabs(aa-a1)f1) aa=a1;break;if (aaa1)if (*ftf1)a2=aa; f2=*ft;else if (*ftf1)a0=aa; f0=*ft;else if (*ftf1)aa=a1; *ft=f1;return (aa);float *po
5、well(float *xk)float hn1n1,sn1=0,0,ffn1+1=0,0,0;float f1,f3,aa;float dkn1,*x0,xk1n1;int m=0,i,j;for (i=0;in1;i+)for(j=0;jn1;j+)hij=0;if (j=i)hij=1;for (int k=0;k+)ff0=fny(xk);x0=xk;for (i=0;in1;i+)for (j=0;jn1;j+)sj=hij;float aa=lagrange(xk,&ffi+1,s);xk=iterate(xk,aa,s);for (i=0;in1;i+)float a,b;dki
6、=xki-x0i;xk1i=2*xki-x0i;float max=fabs(ff1-ff0);for (i=1;imax)max=fabs(ffi+1-ffi);m=i;f3=fny(xk1);if(f3ff0)&(ff0+f3-2*ff2)*pow(ff0-ffn1-max),2)*max*pow(ff0-f3),2)aa=lagrange(xk,&f1,dk);xk=iterate(xk,aa,dk);for (i=m;in1-1;i+)for (j=0;jn1;j+)hij=hi+1j;for (j=0;j=f3) xk=xk1;float xq=0;for (i=0;in1;i+)xq+=pow(xki-x0i),2);if (xq=ad)break;return(xk);void main()float xkn1=0,0;/ 取初始点float *xx;xx=(float *)malloc(n1 *sizeof(float);xx=powell(xk);float ff=fny(xx);cout 优化的结果为: endl;printf(nnThe Optimal Design Result Is:n);for (int i=0;in1;i+)printf(nt x%d *=%f,i+1,xxi);printf(nt f*=%f,ff);getch();