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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <stdio.h>
#include <math.h>
#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*(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<n;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<n;i++)
x3[i]=x1[i];
f3=f1;
for(i=0;i<n;i++)
x1[i]=x2[i];
f1=f2;
for(i=0;i<n;i++)
x2[i]=x3[i];
f2=f3;
} /*搜索方向为正向*/
for(i=0;i<n;i++) /*计算第三试点*/
x3[i]=x2[i]+h*s[i];
f3=f(x3);
while(f3<f2) /*判断是否未完成搜索*/ { /*未完成,继续搜索*/
h=2*h;
for(i=0;i<n;i++)
x1[i]=x2[i];
f1=f2;
for(i=0;i<n;i++)
x2[i]=x3[i];
f2=f3;
for(i=0;i<n;i++)
x3[i]=x2[i]+h*s[i];
f3=f(x3);
} /*已完成*/
for(i=0;i<n;i++) /*输出初始搜索区间*/ {
if(h>0)
//if(x1[i]<x3[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<n;i++) /*计算初始两试点*/
x1[i]=b[i]-(float)0.618*(b[i]-a[i]);
f1=f(x1);
for(i=0;i<n;i++)
x2[i]=a[i]+(float)0.618*(b[i]-a[i]);
f2=f(x2);
do
{
if(f1=f2) /*判断消去区间*/
{ /*消去右*/
for(i=0;i<n;i++)
b[i]=x2[i];
for(i=0;i<n;i++)
x2[i]=x1[i];
f2=f1;
for(i=0;i<n;i++)
x1[i]=b[i]-(float)0.618*(b[i]-a[i]);
f1=f(x1);
}
else
{ /*消去左*/
for(i=0;i<n;i++)
a[i]=x1[i];
for(i=0;i<n;i++)
x1[i]=x2[i];
f1=f2;
for(i=0;i<n;i++)
x2[i]=a[i]+(float)0.618*(b[i]-a[i]);
f2=f(x2);
}
sum=0;
for(i=0;i<n;i++)
sum+=(b[i]-a[i])*(b[i]-a[i]);
}while(sqrt(sum)>flag); /*判断是否未达到精度要求,若未达到则返回继续缩小区间*/ for(i=0;i<n;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 flag2,float a[],float b[],float x[])
{
int i,k;
float x1[m],s[m][m],sum;
for(i=0;i<n;i++) /*方向矩阵初始化*/
{ for(k=0;k<n;k++)
if(i==k)
s[i][k]=1;
else
s[i][k]=0;
}
k=1;
do
{
for(i=0;i<n;i++)
x1[i]=x0[i];
for(i=0;i<n;i++) /*依次按每个方向搜索*/
{
mjtf(n,x1, h,s[i],a,b);
mhjfgf(n, a, b, flag1, x1);
}
sum=0; /*计算一轮中终点与始点的距离*/
for(i=0;i<n;i++)
sum= sum+(x1[i]-x0[i])*(x1[i]-x0[i]);
if(sqrt(sum)=flag2) /*判断是否满足精度要求*/
break;
else
{
k=k+1; /* 进行下一轮搜索 */
for(i=0;i<n;i++) /* 把末点传给下一轮的起点 */
x0[i]=x1[i];
}
}while(1);
for(i=0;i<n;i++) /*输出极小点坐标*/
x[i]=x1[i];
}
/*坐标轮换法主程序*/
void main()
{
int i,n;
float h,flag1,flag2,x0[m],a[m],b[m],x[m]; printf("\n<坐标轮换法>\n");
printf("请输入维数:\n");
scanf("%d",&n);
printf("请输入初始点:");
for(i=0;i<n;i++)
{
printf("\nx0[%d]=",i);
scanf("%f",&x0[i]);
}
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;i<n;i++)
printf("x[%d]=%f\n",i,x[i]);
printf("\n极小值为:\n%f\n",f(x));
}。

相关文档
最新文档