机械优化设计坐标轮换发c语言

2019-01-07 15:39

#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[],float x[]);

/*目标函数(n维)*/ /*入口参数:

x :n维数组,自变量 */ /*返回值 :函数值 */ float f(float x[]) {

float result;

result=60-10*(x[0])-4*(x[1])+(x[0]*x[0])+(x[1]*x[1])-(x[0]*x[1]); 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 x1[m],x2[m],x3[m],f1,f2,f3; for(i=0;i

x1[i]=x0[i];

x2[i]=x0[i]+h*s[i]; }

f1=f(x1); f2=f(x2);

if(f2>=f1) /*判断搜索方向*/ { /*搜索方向为反向,转身*/ h=(-1)*h;

for(i=0;i

for(i=0;i

for(i=0;i

} /*搜索方向为正向*/

for(i=0;i

while(f3

for(i=0;i

for(i=0;i

for(i=0;i

for(i=0;i

if(h>0) //if(x1[i]

a[i]=x1[i]; b[i]=x3[i]; } else {

a[i]=x3[i]; b[i]=x1[i]; } } }

/*多维黄金分割法子程序*/

void mhjfgf(int n,float a[],float b[],float flag,float x[]) {

int i;

float x1[m],x2[m],f1,f2,sum;

for(i=0;i

for(i=0;i

x2[i]=a[i]+(float)0.618*(b[i]-a[i]); f2=f(x2); do {

if(f1=f2) /*判断消去区间*/ { /*消去右*/ for(i=0;i

for(i=0;i

for(i=0;i

x1[i]=b[i]-(float)0.618*(b[i]-a[i]); f1=f(x1); } else

{ /*消去左*/ for(i=0;i

for(i=0;i

for(i=0;i

x2[i]=a[i]+(float)0.618*(b[i]-a[i]); f2=f(x2); }

sum=0;

for(i=0;i

sum+=(b[i]-a[i])*(b[i]-a[i]);

}while(sqrt(sum)>flag); /*判断是否未达到精度要求,若未达到则返回继续缩小区间*/ for(i=0;i

x[i]=(float)0.5*(b[i]+a[i]); /*已达到,输出极小点*/ }

/*坐标轮换法子程序*/ /*入口参数: n :优化模型维数

x0 :n维数组,初始点坐标 h :初始搜索步长

flag1 :黄金分割法迭代精度 flag2 :鲍威尔法迭代精度 a :n维数组,搜索区间下限 b :n维数组,搜索区间上限*/ /*出口参数:

x :n维数组,极小点坐标 */

void zblhf(int n,float x0[],float h,float flag1,float b[],float x[]) {

int i,k;

float x1[m],s[m][m],sum;

for(i=0;i

s[i][k]=0; } k=1; do {

for(i=0;i

for(i=0;i

mjtf(n,x1, h,s[i],a,b); mhjfgf(n, a, b, flag1, x1); }

sum=0; /*计算一轮中终点与始点的距离*/ for(i=0;i

sum= sum+(x1[i]-x0[i])*(x1[i]-x0[i]);

if(sqrt(sum) = flag2) /*判断是否满足精度要求*/ break; else {

k=k+1; /* 进行下一轮搜索 */

for(i=0;i

flag2,float a[],float }

while(1);

for(i=0;i

/*坐标轮换法主程序*/ void main() {

int i,n;

float h,flag1,flag2,x0[m],a[m],b[m],x[m]; printf(\坐标轮换法>\\n\ printf(\请输入维数:\\n\ scanf(\

printf(\请输入初始点:\ for(i=0;i

printf(\ scanf(\ }

printf(\请输入初始步长:\\n\ scanf(\

printf(\请输入黄金分割法迭代精度:\\n\ scanf(\

printf(\请输入坐标轮换法迭代精度:\\n\ scanf(\

zblhf(n,x0,h,flag1,flag2,a,b,x); printf(\极小点坐标为:\\n\ for(i=0;i

printf(\

printf(\极小值为:\\n%f\\n\}

?????????????

坐标轮换法的C++语言实现

----------------------基于成都理工大学最优化教材

#include #include \#include #define MAX_M 2048 #include

#define beta (sqrt(5)-1)/2 #define eclipse 0.01


机械优化设计坐标轮换发c语言.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:政府和社会资本合作(PPP)-采煤沉陷区治理公路工程项目可行性研究

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: