优化设计-鲍威尔法程序(c语言)

更新时间:2023-05-16 08:42:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#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 mbwef(int n,float x0[],float h,float flag,float a[],float b[],float x[]);

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;

}

/*多维进退法子程序*/

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(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*0.1);

for(i=0;i<n;i++)

x[i]=(float)0.5*(b[i]+a[i]);

}

/*鲍威尔法子程序*/

void mbwef(int n,float x0[],float h,float flag,float a[],float b[],float x[]) {

int i,j,k,r;

float x1[m],x2[m],f0,f1,f2,fn[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;

while(1)

{

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,flag,x1);

fn[i]=f(x0)-f(x1);

}

for(i=0;i<n;i++)

x2[i]=2*x1[i]-x0[i];

for(i=1;i<n;i++)

if(fn[0]<fn[i])

{

fn[0]=fn[i];

r=i;

}

else

r=0;

f0=f(x0);

f1=f(x1);

f2=f(x2);

if(f2>=f0||(f0-2*f1+f2)*(f0-f1-fn[0])*(f0-f1-fn[0])>=0.5*fn[0]*(f0-f2)*(f0-f2)) {

sum=0;

for(i=0;i<n;i++)

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

if(f1<=f2)

for(i=1;i<n;i++)

x0[i]=x1[i];

else

for(i=1;i<n;i++)

x0[i]=x2[i];

}

else

{

for(i=r;i<n;i++)

for(j=0;j<n;j++)

s[i][j]=s[i+1][j];

for(i=0;i<n;i++)

s[n][i]=x1[i]-x0[i];

mjtf(n,x1,h,s[n],a,b);

mhjfgf(n,a,b,flag,x1);

sum=0;

for(i=0;i<n;i++)

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

for(i=0;i<n;i++)

x0[i]=x1[i];

if(sqrt(sum)<=flag) break;

else

k+=1;

}

for(i=0;i<n;i++) x[i]=x1[i];

}

/*鲍威尔法主程序*/

void main()

{

int i,n;

float h,flag,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",&flag);

mbwef(n,x0,h,flag,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)); }

本文来源:https://www.bwwdw.com/article/x2c4.html

Top