1、鲍威尔法C源程序#include #include #include #include #include #include #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);
2、for (int i=0;in1;i+) x1i=xi+a*si; return(x1);float func(float *x,float 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;
3、 a0=a1; f0=f1; else if (ia=1) return; t=t/2; ia=1; for (i=0;i+) a2=a1+t; f2=func(xk,a2,s); 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
4、,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,2)*(a0-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; b
5、reak; 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 *powell(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+) f
6、f0=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=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
7、*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();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1