| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 343 人关注过本帖
标题:请问这个无约束 n 维单纯形的主函数怎么编
取消只看楼主 加入收藏
阳光一直都在
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-11-30
收藏
 问题点数:0 回复次数:1 
请问这个无约束 n 维单纯形的主函数怎么编
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
int simpl(d,n,lam,alf,miu,x,fx,xopt,f,eps,itmax)
double d,lam,alf,miu;
double *x,*fx,*xopt,eps;
double (*f)(double*,int);
int itmax,n;
{
int it,i,j,h,l,g;
double *xt,*xc,*xe,ft,fc,fe,fg,fh,fl,flag,tmp;
if(x==NULL||fx==NULL||xopt==NULL)
{
printf("one of is null\n");
return(-1);
}
xt=(double*)malloc(n*sizeof(double));
xc=(double*)malloc(n*sizeof(double));
xe=(double*)malloc(n*sizeof(double));
if(xt==NULL||xc==NULL||xe==NULL)
{
free(xt);free(xc);free(xe);
printf("menory alloc faile\n");
return(-1);
}
for(i=0;i<=n;i++)
for(j=0;j<n;j++)
    x[i*n+j]=xopt[j];
for(j=0;j<n;j++)
    x[(j+1)*n+j]=x[j]+d;
for(i=0;i<=n;i++)
    fx[j]=(*f)(&x[i+n],n);
flag=1.0+eps;
it=0;
while((it++<itmax)&&(flag>eps))
{
ft=fx[0];
fe=fx[0];
fg=fx[0];
h=0;l=0;g=0;
for(i=1;i<=n;i++)
{
if(fx[i]>fg)
{
if(fx[i]>fh)
{g=h;h=i;}
else
  g=i;
fg=fx[g];
fh=fx[h];}
else if(fx[i]<fl)
{
l=i;fl=fx[l];}
}
for(j=0;j<n;j++)
{xc[j]=0.0;
for(i=0;i<=n;i++)
xc[j]=xc[j]+x[i*n+j];
tmp=x[h*n+j];
xc[j]=(xc[j]-tmp)/n;
xt[j]=xc[j]+alf*(xc[j]-tmp);
}
ft=(*f)(xt,n);
if(ft<fx[l])
{for(j=0;j<n;j++)
xe[j]=xt[j]+miu*(xt[j]-xc[j]);
fe=(*f)(xe,n);
if(fe<fx[l])
{
for(j=0;j<n;j++)
x[h*n+j]=xe[j];
fx[h]=fe;}
else
{for(j=0;j<n;j++)
x[h*n+j]=xt[j];
fx[h]=ft;}}
else if(ft<=fx[g])
{for(j=0;j<n;j++)
x[h*n+j]=xt[j];
fx[h]=ft;
}
else
{if(ft<=fx[n])
{for(j=0;j<n;j++)
x[h*n+j]=xt[j];
fx[h]=ft;}
for(j=0;j<n;j++)
xe[j]=xc[j]+lam*(x[h*n+j]-xc[j]);
fe=(*f)(xe,n);
if(fe>fx[h])
{
for(i=0;i<=n;i++)
{for(j=0;j<n;j++)
{x[i*n+j]=(x[i*n+j]+x[i*l+j])*0.5;}
fx[i]=(*f)(&x[i*n],n);
}}
else
{
for(j=0;j<n;j++)
x[h*n+j]=xe[j];
fx[h]=fe;
}}
fc=0.0;
ft=0.0;
for(i=0;i<=n;i++)
{fc=fc+fx[i];
ft=ft+fx[i]*fx[i];}
fc=fc*fc/(1.0+n);
flag=(ft-fc)/n;}
for(j=0;j<n;j++)
{
xopt[j]=0.0;
for(i=0;i<=n;i++)
xopt[j]=xopt[j]+x[i*n+j];
xopt[j]=xopt[j]/(n+1.0);}
xopt[n]=(*f)(xopt,n);
free(xt);
free(xc);
free(xe);
return(it);
}
搜索更多相关主题的帖子: include double return null 
2014-11-30 11:35
阳光一直都在
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-11-30
收藏
得分:0 
求回复啊啊啊啊啊,要适用于一般情况
2014-11-30 12:56
快速回复:请问这个无约束 n 维单纯形的主函数怎么编
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024599 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved