逆光奔跑 发表于 2019-8-13 15:00:05

数值优化方法—迭代法&终止条件


迭代法
迭代法的基本思想是:在给出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,)
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('原函数','迭代值')

可以设为终止条件的标准有很多,在此只是简单的举例几种,在遇到具体问题时,终止条件的选择一般依据自己的问题而设定,一般接触到的有:最小均方差、最大相关性,变化趋势这三种作为终止条件。
页: [1]
查看完整版本: 数值优化方法—迭代法&终止条件