sprine 发表于 2006-5-17 16:34

[原创]单纯形法完全c语言程序,能运行

单纯形法完全c语言程序,每步都有说明,不足之处希望指出。
#include "math.h"
#include "stdio.h"
#define N 2

void paixu(p,n)
int n;
double p[];
{ int m,k,j,i;
double d;
k=0; m=n-1;
while (k<m)
{ j=m-1; m=0;
for (i=k; i<=j; i++)
if (p>p)
{ d=p; p=p; p=d; m=i;}
j=k+1; k=0;
for (i=m; i>=j; i--)
if (p>p)
{ d=p; p=p; p=d; k=i;}
}
return;
}
double mubiao(double *x)
{ double y;
y=x-x*x; y=100.0*y*y;
y=y+(1.0-x)*(1.0-x);
return(y);
}

main()
{ int i,j,k,l,m=0;
double c,xx,f0,f,x0={1.2,1},x1,s=0.0;
double a,b;
double xa,xb,xc,xe,xw,xr,xo;
double fr,fe,fw,fc,fo;
double aef=1.0,r=1.0,eps1=1.0e-30,eps2=1.0e-30,bt=0.5,rou=0.5;
c=1.0;
b=(c/(N*sqrt(2)))*(sqrt(N+1)-1);
a=b+c/sqrt(2);
//printf("a=%13.7e b=%13.7e ",a,b);
//printf("\n");
//给xx赋值,每一行构成单纯形的一个定点
//***********************
for(i=0;i<N;i++)
xx=x0;
for(i=1;i<N+1;i++)
for(j=0;j<N;j++)
{if(j==i-1)
xx=x0+a;
else
xx=x0+b;
}
for (i=0;i<N+1;i++)
{for (j=0;j<N;j++)
printf("xx[%d][%d]%13.7e ",i,j,xx);
printf("\n");
}
loop1:
//求单纯形的每个定点的函数值f0,f和x1是过渡数组
printf("\n");
printf("\n");
for(i=0;i<N+1;i++)
{for(j=0;j<N;j++)
x1=xx;
f0=mubiao(x1);
f=mubiao(x1);
printf("f0[%d]=%13.7e f[%d]=%13.7e\n",i,f0,i,f);
}
printf("\n");
//比较f的大小,f是最小值,f是最大值
paixu(f,N+1);
for(i=N;i>=0;i--)
printf("f[%d]=%13.7e \n",i,f);
//找最好点和最坏点分别是哪一个点,即xx[][]的行数
for(i=0;i<N+1;i++)
{if(f0==f)
k=i;
if(f0==f)
l=i;
}
printf("最好点k=%d\n",k);
printf("最坏点l=%d\n",l);
//终止判断条件
printf("f-f=%13.7e \n",f-f);
if((f-f)<eps1+eps2*fabs(f))
{printf("迭代次数m=%d\n",m);
for(j=0;j<N;j++)
printf("optx[%d]=%13.7e\n",j,xx);
printf("fmin=%13.7e\n",f);
}
else
{
m=m+1;
//把xx[][]中最好点移到第一行,最坏点移到最后一行
for(j=0;j<N;j++)
{xb=xx;
xx=xx;
xx=xb;
//
xw=xx;
xx=xx;
xx=xw;
}
for (i=0;i<N+1;i++)
{for (j=0;j<N;j++)
printf("xx[%d][%d]=%13.7e ",i,j,xx);
printf("\n");
}
//求除最坏点f外其余点的中点xc[]
for(i=0;i<N;i++)
xa=0;
for(j=0;j<N;j++)
{{for(i=0;i<N;i++)

xa=xa+xx;}
xa=xa/N;
}
for(i=0;i<N;i++)
printf("xa[%d]=%13.7e xb[%d]=%13.7e xw[%d]=%13.7e \n",i,xa,i,xb,i,xw);
//求xw的反射点xr;
for(i=0;i<N;i++)
{xr=xa+aef*(xa-xw);
printf("xr[%d]=%13.7e ",i,xr);
}
printf("\n");
//求xr的函数值fr
fr=mubiao(xr);
printf("fr=%13.7e \n",fr);
//判断xr与xb的好坏
if(fr<=f)
{for(i=0;i<N;i++)
{xe=xr+r*(xr-xa);
//printf("xe[%d]=%13.7e ",i,xe);
}
printf("\n");
fe=mubiao(xe);
if(fe<=f)
for(j=0;j<N;j++)
xx=xe;
else
for(j=0;j<N;j++)
xx=xr;
goto loop1;
}
else
{
fw=f;
if(fr>=fw)
{for(i=0;i<N;i++)
xc=xa-bt*(xa-xw);
fc=mubiao(xc);
if(fc>=fw)
{for(i=1;i<N+1;i++)
for(j=0;j<N;j++)
xx=xx-rou*(xx-xx);
goto loop1;
}
else
{for(j=0;j<N;j++)
xx=xc;
goto loop1;
}
}
else
{if(fr>=fe)
{
for(i=0;i<N;i++)
xo=xa+bt*(xa-xw);
fo=mubiao(xo);
if(fo>=fr)
{for(i=1;i<N+1;i++)
for(j=0;j<N;j++)
xx=xx-rou*(xx-xx);
goto loop1;
}
else
{for(j=0;j<N;j++)
xx=xo;
goto loop1;
}
}
else
{for(j=0;j<N;j++)
xx=xr;
goto loop1;
}
}
}
}
}

[ 本帖最后由 风花雪月 于 2006-10-18 08:23 编辑 ]

miaoyu0807 发表于 2006-7-5 15:17

变量如何定义?

你的程序中的各个变量都代表什么意思?
谢谢!!!

zhuwy16 发表于 2006-7-5 18:10

好像不能够运行啊

sprine 发表于 2006-7-31 23:19

原帖由 zhuwy16 于 2006-7-5 18:10 发表
好像不能够运行啊
我是在VC6.0中编译通过的,再试试吧!!

winter33123152 发表于 2006-10-7 14:47

我以前也编过一个,不过收敛性不怎么好.有时间试试楼主的怎么样.
页: [1]
查看完整版本: [原创]单纯形法完全c语言程序,能运行