(R语言)不依赖求导的寻根方法:Nelder-Mead方法
牛顿法需要一阶和二阶导数,如果导函数不可用,则可以通过伪牛顿(Quasi-Newton)方法近似它们。如果导函数直接不存在怎么办?函数中存在不连续则可能发生这种情况。
Nelder-Mead Method
在Nelder-Mead算法下即使函数不连续,Nelder-Mead算法也是十分稳健的,该算法是基于评估n维单纯形的顶点处的函数,其中n是函数中输入变量的数量(在这里我只写计算二维问题的算法)。对于二维问题,n维单纯形只是一个三角形,每个角的一个顶点,通常有n+1个顶点。
下面是算法的具体步骤:
Step1: 下面为三个初始值点X(1)=(x1,x2)X(1) = (x_1,x_2)X(1)=(x1,x2) X(2)=(x3,x4)X(2) = (x_3,x_4)X(2)=(x3,x4) X(3)=(x5,x6)X(3) = (x_5,x_6)X(3)=(x5,x6)
将上述三个初始值点代入函数f(x)f(x)f(x)中,即f(X1)f(X_1)f(X1)、f(X2)f(X_2)f(X2)、f(X3)f(X_3)f(X3),再对它们进行排序,假设三个初始值代入的大小排序为:f(X1)≤f(X2)≤f(X3)f(X_1)\leq f(X_2)\leq f(X_3)f(X1)≤f(X2)≤f(X3)
Step2: 计算这三个点的中心点 X(0)=∑i=1nXinX(0) = \frac {\sum_{i=1}^n X_i} {n}X(0)=n∑i=1nXi
Step3: 计算对称点 X(r)=X(0)+α(X(0)−X(3))X(r) = X(0) + \alpha(X(0)-X(3))X(r)=X(0)+α(X(0)−X(3))
通常情况下α\alphaα取1
Case1: f(X1)≤f(Xr)≤f(X3)f(X_1)\leq f(X_r) \leq f(X_3)f(X1)≤f(Xr)≤f(X3)此时XrX_rXr不是最优点也不是最差点,用XrX_rXr取代X3X_3X3,新的三个构造点变为X1X_1X1