确定极值点所在区间的进退法子程序
附录:主要程序
附录Ⅰ 确定极值点所在区间的进退法子程序
int JT double x[3],double h /*返回计算目标函数值的次数 */
/*x[0]为初始点,返回左端点,x[1]返回中间点,x[2]返回右端点,h为初始探测步长*/
double y[3],dum; /*y为与x相应的目标函数值,dum为中间变量*/
y[0] func x[0] ; /*初始点函数值*/
x[1] x[0]+h;
y[1] func x[1] ;
if y[0] y[1] /*如果上坡,则反向,调头*/ h -h; dum x[0];x[0] x[1];x[1] dum; dum y[0];y[0] y[1];y[1] dum; for ;; /*计算循环*/
h 2*h; /*步长加速*/
x[2] x[1]+h;
y[2] func x[2] ; /*第三点及其目标函数值*/
if y[1] y[2] /*第3点比第2点高,则得到“高-低-高”特征的区间,返回*/ if x[0] x[2] /*如果是退的,则调整*/ dum x[0];x[0] x[2];x[2] dum; return K ; /*返回计算目标函数值的次数*/ else /*否则,弃去第一点,重新找*/ x[0] x[1];x[1] x[2]; y[0] y[1];y[1] y[2]; /*end for ;; */
/*结束确定极值点所在区间的进退法子程序*/
int main /*主程序*/
int i,j,k 0;
double x[3];
x[0] -1; /*初始点*/
h0 0.1; /*初始步长*/
h h0;
k JT x,h ; /*一维进退法,返回调用目标函数的次数*/
printf "\n极值点所在区间:[%12.5e %12.5e]\n",x[0],x[2] ; double func x /*目标函数*/
double x;
double y;
y x*x;
K K+1; /*调用目标函数次数,定义为全局变量,并初始化为0*/
return y ;