QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2196|回复: 1
打印 上一主题 下一主题

Unconstrained optimization C 源码

[复制链接]
字体大小: 正常 放大

10

主题

2

听众

70

积分

升级  68.42%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-8-30 10:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

#include <stdlib.h>
#define Abs(x) ( ((x)<0.)?-(x)x) )
static double fev(double *x,double *py,double *ps,
double c,double (*func)());
int optmiz(double *x,int n,double (*func)(),double de,double test,int max)
{ double fs,fp,fa,fb,fc,s,sa,sb,sc; int k,m;
double *pd,*ps,*py,*pg,*ph,*p,*q,*r;
pd=(double *)calloc(n*(n+4),sizeof(double));
ps=pd+n; py=ps+n; pg=py+n; ph=pg+n;
for(p=ph,q=ph+n*n; p<q ;p+=n+1) *p=1.;
for(p=x,q=pg,fb=(*func)(x); q<ph ;){
*p+=de; *q++ =((*func)(x)-fb)/de; *p++ -=de;}
for(m=0; m<max ;++m){
for(p=ps,r=ph; p<py ;++p){ *p=0.;
for(q=pg; q<ph ;) *p-= *r++ * *q++; }
fp=fa=fb; sa=sb=0.; sc=1.;
for(;;){ if((fc=fev(x,py,ps,sc,func))>fb) break;
fa=fb; sa=sb; fb=fc; sb=sc; sc*=2.; }
if(sc==1.){ sb=.5;
for(;;){ if((fb=fev(x,py,ps,sb,func))<fa||sb<1.e-3) break;
fc=fb; sc=sb; sb/=2.;} }
for(k=0; k<3 ;++k){ s=(fc-fa)/(sc-sa);
if((fs=(s-(fb-fa)/(sb-sa))/(sc-sb))<0.) break;
if((s=(sa+sc-s/fs)/2.)==sb) s-=(sb-sa)/5.;
fs=fev(x,py,ps,s,func);
if(fs<fb){ if(s<sb){ sc=sb; fc=fb;} else{ sa=sb; fa=fb;}
sb=s; fb=fs; }
else{ if(s<sb){ sa=s; fa=fs;} else{ sc=s; fc=fs;} }
}
for(p=x,r=ps; r<py ;){ *r*=sb; *p++ += *r++;}
if(Abs(fp-fb)<test){ free(pd); return (m+1);}
for(p=x,q=pg,r=pd; q<ph ;){
*p+=de; fa=((*func)(x)-fb)/de; *p++ -=de;
*r++ =fa- *q; *q++ =fa; }
for(p=py,r=ph; p<pg ;++p){ *p=0.;
for(q=pd; q<ps ;) *p+= *r++ * *q++; }
for(p=py,q=ps,r=pd,sa=sb=0.; p<pg ;){
sa+= *r* *p++; sb+= *q++ * *r++; }
sa=1.+sa/sb;
for(p=ps,q=py,r=ph; p<py ;++p,++q){
for(k=0; k<n ;++k)
*r++ +=(*(ps+k)* *p*sa- *(py+k)* *p- *(ps+k)* *q)/sb;
}
}
free(pd); return 0;
}
static double fev(double *x,double *py,double *ps,double c,double (*func)())
{ double *p,*q,*r;
for(p=x,q=py,r=ps; r<py ;) *q++ = *p++ +c* *r++;
return (*func)(py);
}

3 ]( u/ e) v+ u( u8 W0 q5 \& Y% X1 z7 h4 n; y# B" z7 W

说明 ,测试环镜 rh9:

+ g4 Y# }4 T2 s9 X* j f& V% \

#include "stdio.h"

) [( G f6 V# w. ~$ S4 @

#include "stdlib.h"

0 M1 P; C$ X$ P ]* L

#include "math.h"

3 {$ D& @+ y3 {

#define ND 2

7 U5 Y% i( z8 p( b# d


char nm[]="Rosenbrock";
void main(void)
{ double x[ND],de,test;
double func(double *x);
int i,n=ND,max=60;
test=1.e-12; de=1.e-9;
printf(" Test of Optimizer (%s function)\n",nm);
printf(" max iterations = %d\n",max);
printf(" convergence threshold= %8.2e\n",test);
printf(" derivative interval= %8.2e\n",de);
fprintf(stderr," input initial vector (%d components)\n",n);
for(i=0; i<n ;) scanf("%lf",x+i++);
printf(" input vector: ");
for(i=0; i<n ;) printf(" %f",x[i++]); printf("\n");
if(optmiz(x,n,func,de,test,max)) printf(" optimal solution\n");
else printf(" convergence failure\n");
printf(" x-vector: ");
for(i=0; i<n ;) printf(" %f",x[i++]); printf("\n");
printf(" minimum F(x)= %e\n",func(x));
}
/* Rosenbrock criteria function */
double func(double *x)
{ double f,y;
y=x[0]; f=1.-y; y=x[1]-y*y;
return 100.*y*y+f*f;
}

9 x1 c! d; [0 @0 r5 d 0 _% b( f* f7 O# `) j2 Q* c" R6 Y, ~

////////////////////////////////////////////////////////////////

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

10

主题

2

听众

70

积分

升级  68.42%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2024-4-28 01:13 , Processed in 0.332109 second(s), 56 queries .

回顶部