可爱的馒头
本程序是用C++编写的,从编写的算例来看,应该是没有问题的。所采用的原理和步骤是参考华南理工大学出版社蒋金山等编写的最优化计算方法第8章第三节可变单纯形法。欢迎各位批评指正。
#include<> #include<> #include<> int i,j;
double d[3][100]={{0,1,0,0},{0,0,1,0},{0,0,0,1}},f[100];//d[][]为单纯形的顶点,本算例中未知数个数为3,则顶点个数为4
double g,h,l,q,s=1,t=2,u=,v=,y=0;//s为反射系数,t为扩展系数,u为压缩系数,v为允许误差 int o,F,r,D,e,lj=0,N=4;//N为顶点的个数,o为最大值点的位置,F为最小值点的位置,r为次大值点的位置
void function1(int e)//求解函数f[e] {
f[e]=(d[0][e]-3)*(d[0][e]-3)+2*(d[1][e]+2)*(d[1][e]+2)+(d[2][e]-4)*(d[2][e]-4);//函数为f=(x1-3)^2+2(x2+2)^2+(x3-4)^2,求其最小值 }
void function2() {
while((++lj)<100)//最大迭代次数
{ for(i=0,g=f[i];i g=f[i+1];o=i+1; } else if(i==0) o=i; } for(i=0,h=f[i];i h=f[i+1];F=i+1; } else if(i==0) F=i; } for(i=0,l=f[i];i l=f[i+1]; r=i+1; continue; } if(l 2 } else if(i==0) r=i; } for(i=0;i d[i][N]=d[i][N]+d[i][j]; } } d[i][N]=d[i][N]/(N-1);//平均值 } function1(N); for(i=0;i function1(N+1); if(f[N+1] d[i][N+2]=d[i][N]+(d[i][N+1]-d[i][N])*t;//扩展 } function1(N+2); if(f[N+2] f[o]=f[N+2]; y=0; for(i=0;i y=sqrt(y/(N*); if(y printf(\"f[%d]=%f\ break; } 4 else { function2(); break; } } else { for(i=0;i f[o]=f[N+1]; y=0; for(i=0;i y=sqrt(y/(N*); if(y 5 printf(\"f[%d]=%f\ break; } else { function2(); break; } } } if(f[N+1]>=f[F]&&f[N+1]<=f[r]) { for(i=0;i f[o]=f[N+1]; y=0; for(i=0;i y=sqrt(y/(N*); if(y printf(\"d[%d][%d]=%f\ printf(\"\\n\"); } printf(\"f[%d]=%f\ break; } else { function2(); break; } } if(f[N+1]>f[r]) { if(f[N+1]>f[o])//压缩 { D=o; } else { D=N+1; } for(i=0;i function1(N+3); 7 if(f[N+3]<=f[D]) { for(i=0;i f[o]=f[N+3]; y=0; for(i=0;i y=sqrt(y/(N*); if(y printf(\"f[%d]=%f\ break; } else { function2(); break; 8 } } else { for(i=0;i for(i=0;i for(i=0;i y=sqrt(y/(N*); if(y 9 } printf(\"f[%d]=%f\ break; } else { function2(); break; } } } } } void main() { for(i=0;i function2(); } 10 因篇幅问题不能全部显示,请点此查看更多更全内容