资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
#include #include #define m 10 /*数组长度m = 维数n */ float f(float x); void mjtf(int n,float x0,float h,float s,float a,float b); void mhjfgf(int n,float a,float b,float flag,float x); void zblhf(int n,float x0,float h,float flag1,float flag2,float a,float b,floatx); /*目标函数(n维)*/ /*入口参数: x :n维数组,自变量 */ /*返回值 :函数值 */ float f(float x) float result; result=60-10*(x0)-4*(x1)+(x0*x0)+(x1*x1)-(x0*x1); return result; /*多维进退法子程序*/ /*入口参数: n :优化模型维数 x0 :n维数组,初始点坐标 h :初始搜索步长 s :n维数组,搜索方向 */ /*出口参数: a :n维数组,搜索区间下限 b :n维数组,搜索区间上限*/ void mjtf(int n,float x0,float h,float s,float a,float b) int i; float x1m,x2m,x3m,f1,f2,f3; for(i=0;i=f1) /*判断搜索方向*/ /*搜索方向为反向,转身*/ h=(-1)*h; for(i=0;in;i+) x3i=x1i; f3=f1; for(i=0;in;i+) x1i=x2i; f1=f2; for(i=0;in;i+) x2i=x3i; f2=f3; /*搜索方向为正向*/ for(i=0;in;i+) /*计算第三试点*/ x3i=x2i+h*si; f3=f(x3); while(f3f2) /*判断是否未完成搜索*/ /*未完成,继续搜索*/ h=2*h; for(i=0;in;i+) x1i=x2i; f1=f2; for(i=0;in;i+) x2i=x3i; f2=f3; for(i=0;in;i+) x3i=x2i+h*si; f3=f(x3); /*已完成*/ for(i=0;i0) /if(x1ix3i) ai=x1i; bi=x3i; else ai=x3i; bi=x1i; /*多维黄金分割法子程序*/ void mhjfgf(int n,float a,float b,float flag,float x) int i; float x1m,x2m,f1,f2,sum; for(i=0;in;i+) /*计算初始两试点*/ x1i=bi-(float)0.618*(bi-ai); f1=f(x1); for(i=0;in;i+) x2i=ai+(float)0.618*(bi-ai); f2=f(x2); do if(f1=f2) /*判断消去区间*/ /*消去右*/ for(i=0;in;i+) bi=x2i; for(i=0;in;i+) x2i=x1i; f2=f1; for(i=0;in;i+) x1i=bi-(float)0.618*(bi-ai); f1=f(x1); else /*消去左*/ for(i=0;in;i+) ai=x1i; for(i=0;in;i+) x1i=x2i; f1=f2; for(i=0;in;i+) x2i=ai+(float)0.618*(bi-ai); f2=f(x2); sum=0; for(i=0;iflag); /*判断是否未达到精度要求,若未达到则返回继续缩小区间*/ for(i=0;in;i+) xi=(float)0.5*(bi+ai); /*已达到,输出极小点*/ /*坐标轮换法子程序*/ /*入口参数: n :优化模型维数 x0 :n维数组,初始点坐标 h :初始搜索步长 flag1 :黄金分割法迭代精度 flag2 :鲍威尔法迭代精度 a :n维数组,搜索区间下限 b :n维数组,搜索区间上限*/ /*出口参数: x :n维数组,极小点坐标 */ void zblhf(int n,float x0,float h,float flag1,float flag2,float a,float b,float x) int i,k; float x1m,smm,sum; for(i=0;in;i+) /*方向矩阵初始化*/ for(k=0;kn;k+) if(i=k) sik=1; else sik=0; k=1; do for(i=0;in;i+) x1i=x0i; for(i=0;in;i+) /*依次按每个方向搜索*/ mjtf(n,x1, h,si,a,b); mhjfgf(n, a, b, flag1, x1); sum=0; /*计算一轮中终点与始点的距离*/ for(i=0;in;i+) sum= sum+(x1i-x0i)*(x1i-x0i); if(sqrt(sum)=flag2) /*判断是否满足精度要求*/ break; else k=k+1; /* 进行下一轮搜索 */ for(i=0;in;i+) /* 把末点传给下一轮的起点 */ x0i=x1i; while(1); for(i=0;in;i+) /*输出极小点坐标*/ xi=x1i; /*坐标轮换法主程序*/ void main() int i,n; float h,flag1,flag2,x0m,am,bm,xm; printf(nn); printf(请输入维数:n); scanf(%d,&n); printf(请输入初始点:); for(i=0;in;i+) printf(nx0%d=,i); scanf(%f,&x0i); printf(n请输入初始步长:n); scanf(%f,&h); printf(n请输入黄金分割法迭代精度:n); scanf(%f,&flag1); printf(n请输入坐标轮换法迭代精度:n); scanf(%f,&flag2); zblhf(n,x0,h,flag1,flag2,a,b,x); printf(n极小点坐标为:n); for(i=0;in;i+) printf(x%d=%fn,i,xi); printf(n极小值为:n%fn,f(x);
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号