本文作者:过冷水
优化算法的讲解姗姗来迟,过冷水在此感到十分的抱歉。本节将会讲到在数值优化中经常用到的两个知识点:迭代法和终止条件。
迭代法
迭代法的基本思想是:在给出f(x)的目标值附近的一个初始估计点x(0)后,计算一系列的点列x(k)(k=1,2,…),希望点列{x(k)}的极限x*就是f(x)对应的目标值。点列有下式给出:
式中:d(k)为一个向量;λk为一个实数(称为步长)。当d(k)与λk确定之后,由x(k)就可以唯一的地确定x(k+1),依次下去就可以求出点列x(k)。如下图即为用迭代法使得f(x),趋向某个变化如图所示。
现给出迭代法的基本代码
clear all
fx='function';
x=x0;f0=eval(fx);
while %循环的具体判断条件
x=x0;f0=eval(fx);
xa=x0+a*lamda;x=xa;fa=eval(fx);
x0=xa;
end
迭代法可以代替手算通过赋值自动计算在数值优化的作用不言而喻,在后面的优化算法会经常看见迭代法的身影,平常解决一些计算问题也可以用迭代法自动计算。
终止准则
一个问题不可能让其永远迭代下去,要有一个终止准则,迭代法的目的是通过迭代运算的方法使得我们函数值接近目标值。在计算中常用的终止标准中过冷水能想到的有以下几种:
变化趋势为终止条件
当函数的变化趋势不断减小,甚至不变时,继续迭代下去就没有必要了,因此终止。
如例:
代码
clear all
fx='exp(x)';
ezplot(fx,[-5 10]);
x0=10;eps=1;
i=0;
while eps>0.01
i=1+i;
x=x0;f0=eval(fx);
xa=x0-0.2*1;x=xa;fa=eval(fx);
eps=abs(fa-f0);
Fa(i)=fa;
Xa(i)=xa;
x0=xa;
end
hold on
plot(Xa,Fa,'*');
legend('原函数','迭代法');
接近具体值为终止条件
当我们知道函数的具体值,需要求其自变量的值,于是就可以通过迭代法确定自变量的范围。
clear all
fx='x^5-x^3-x^2-500';
ezplot(fx,[-10 10])
x0=6;eps=120;
i=0;
while eps>0.01;
i=1+i;
x=x0;f0=eval(fx);
xa=x0-0.0001*1;x=xa;fa=eval(fx);
eps=abs(0-fa);
Fa(i)=fa;
Xa(i)=xa;
x0=xa;
end
hold on
ezplot('0',[-10 10]);
plot(Xa,Fa,'*');
legend('原函数','y=0','迭代值');
变化趋势转折点为终止条件
该方法在求极值的时候可以应用。
clear all
fx='sin(x^2)';
fig = figure;
ezplot(fx,[1.4 2.8])
xa=2.6;x=xa;fa=eval(fx);
xb=xa-0.0001*1;x=xb;fb=eval(fx);
i=0
while fb<fa
i=1+i
x=xa;fa=eval(fx);
xb=xa-0.0001*1;x=xb;fb=eval(fx);
fb-fa
xa=xb;
Fa(i)=fa;
Xa(i)=xa;
end
hold on
plot(Xa,Fa,'*');
legend('原函数','迭代值')
可以设为终止条件的标准有很多,在此只是简单的举例几种,在遇到具体问题时,终止条件的选择一般依据自己的问题而设定,一般在过冷水自己接触到了有:最小均方差、最大相关性,变化趋势这三种作为终止条件。
确定了迭代方法和终止条件,就可以进行简单的数值训练了。现在给出
MATLAB算法の二分法案列。二分法是优化算法中原始的一种方法了。二分法有助于学习其它算法。
本期给出的案例都比较简单,实际求解方法不需要用到迭代法,只是为了让读者容易理解选的案例比较简单,实际二狗遇到的问题因为方程过于复杂,用MATLAB自带函数是无法求导、求零点,直接求极值,这个时候用迭代法就十分有效寻求答案,甚至牛顿法或其它算法都不一定能求解,简单、粗暴、实用。
本期过冷水的讲解就到此为,特此说明前段时间因为公众号被举报的原因,过冷水的情绪有受影响,但还不至于自暴自弃的想放弃,只过不恰好上半年结尾,手头有事要做连载一直没有更新,也因为始终欠大家一个连载,所以也督促我赶快更新。于是终于赶出来了,坚持不容易,读者的支持才是过冷水前进的动力。