|
迭代法
迭代法的基本思想是:在给出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('原函数','迭代值')
复制代码
可以设为终止条件的标准有很多,在此只是简单的举例几种,在遇到具体问题时,终止条件的选择一般依据自己的问题而设定,一般接触到的有:最小均方差、最大相关性,变化趋势这三种作为终止条件。
|
|