请问这个无约束 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);
}