对之前的优化设计的课做一些总结,也是自己对优化算法的一些总结和感悟,这篇主要总结一下传统单变量算法,在下几篇将会对一些传统多变量以及智能优化算法进行总结。
传统的单变量主要有.进退法2.黄金分割法3.斐波那契法4.多项式近似法(牛顿法)5.多项式近似法(抛物线法)等。下面对上述方法原理简单介绍一下。
进退法又名爬山法,可以说来源于一种贪心的思想,设置初始步长以及初始值,当往更好的方向发展时,则增加步长更新位置,否则更新步长为-h/4,直至收敛。
黄金分割法既需要确定一定的区间,很明显其的劣势即必须寻找的极值需存在在事先确定的区间内,否则找不到极值。
斐波那契法与黄金分割法在原理上是类似的,只不过利用斐波那契数列的中的比值替代的黄金分割比。
牛顿法是假设函数可微,在x附近利用二次函数逼近fx,并根据极小值满足函数导数为0从而得到函数极值。
抛物线法即假定函数上的三点构造二次抛物线函数每次更新区间直至逼近极值。
下面附上自己编写的相关函数:
double Advance_retreat(double h, double x0,double accuracy,int function_number)
{
double x;
x=x0;
while(abs(h)>accuracy)//截止判断条件
{
if ((function_select(function_number,(x+h)))<(function_select(function_number,(x))))//进退法进成功的判断条件
{
x=x+h;
h=h*2;
}
else
{
h=-h/4;
x=x+h;
}
}
printf("极值点:%lf\n",x);
printf("极小值为:%lf\n",(function_select(function_number,x)));
return x;
}
double golden_section( double q,double a,double b,double accuracy,int function_number)
{
double u1,u2;//黄金分割法中间所需的试验点
while(abs(b-a)>accuracy)
{u1=b-q*(b-a);
u2=a+q*(b-a);
if((function_select(function_number,u1))<(function_select(function_number,u2)))
b=u2;
else
a=u1;
}
if((function_select(function_number,a))<(function_select(function_number,b)))
{