一维寻优法也称为黄金分割法(Golden Section)或0.618法,是用于计算函数极小值或极大值的一种迭代算法。以下是程序设计算法步骤:
Step 1: 定义问题
定义需要寻找极值的函数f(x),以及寻找极值的范围[a, b]。
Step 2: 计算中点
计算出黄金分割点c和d作为下一步计算的区间端点:
c = a + 0.382 * (b - a)
d = a + 0.618 * (b - a)
Step 3: 计算函数值
计算函数在c和d处的值:
fc = f(c)
fd = f(d)
Step 4: 更新区间
根据fc和fd比较大小,更新区间[a, b]:
如果fc fd,则取[c, b]作为新的区间
如果fc = fd,则取[c, d]任意一个作为新的区间
Step 5: 判断终止条件
重复以上步骤,直到满足终止条件:
当区间长度小于一个预设的容错值时,或者经过预设的最大迭代次数时,终止迭代。
Step 6: 返回极小值或极大值
当满足终止条件时,返回当前区间的端点中的任意一个作为函数的极小值或极大值。
上述算法可以优化计算效率,例如在迭代过程中可以保留先前的函数值,以便下一次迭代时重复利用,或者使用多个并行的迭代过程以加速计算速度,等等。

 

最速下降法(Steepest Descent Method)是求解函数极小值或极大值的一种常用方法。以下是最速下降法的程序设计算法步骤:
Step 1: 定义问题
定义需要寻找极值的函数f(x),以及起始点的初始值x。
Step 2: 计算梯度
计算函数在当前点x处的梯度g:
g = ∇f(x)
Step 3: 计算步长
计算从当前点x出发,沿着梯度方向的步长α:
α = argmin f(x - α*g)
Step 4: 更新x值
更新当前点x的值:
x = x - α*g
Step 5: 判断终止条件
重复以上步骤,直到满足终止条件:
当函数值的变化量小于一个预设的容错值时,或者经过预设的最大迭代次数时,终止迭代。
Step 6: 返回极小值或极大值
当满足终止条件时,返回当前点x的值作为函数的极小值或极大值。
最速下降法通常具有较快的收敛速度,但也容易陷入局部最小值。为了避免这种情况,可以使用其他方法进行优化,例如梯度下降法的变种,如坐标下降法、共轭梯度法等。

 

Newton法是求解函数极小值或极大值的一种常用方法,其利用二阶泰勒展开式求导数零点,找到函数的最小值或最大值。以下是Newton法的程序设计算法步骤:
Step 1: 定义问题
定义需要寻找极值的函数f(x),以及起始点的初始值x。
Step 2: 计算梯度和海森矩阵
计算函数在当前点x处的梯度g和海森矩阵H:
g = ∇f(x)
H = ∇²f(x)
Step 3: 计算步长
计算从当前点x出发,沿着负梯度方向的步长α:
α = -H⁻¹ * g
Step 4: 更新x值
更新当前点x的值:
x = x + α
Step 5: 判断终止条件
重复以上步骤,直到满足终止条件:
当函数值的变化量小于一个预设的容错值时,或者经过预设的最大迭代次数时,终止迭代。
Step 6: 返回极小值或极大值
当满足终止条件时,返回当前点x的值作为函数的极小值或极大值。
需要注意的是,在Newton法中的海森矩阵需要是正定矩阵以保证算法的收敛性。如果海森矩阵不满足正定性,则可以使用其他方法,如拟牛顿法等。此外,为了防止算法在局部最小值处陷入循环,也需要考虑添加算法的学习速率等超参数来进行优化。

 

共轭梯度法(Conjugate Gradient Method)是求解函数极小值或极大值的一种常用方法,其在计算梯度方向时利用了历史上已经计算过的梯度信息,使得算法的收敛速度更快。以下是共轭梯度法的程序设计算法步骤:
Step 1: 定义问题
定义需要寻找极值的函数f(x),以及起始点的初始值x。
Step 2: 计算梯度和方向
计算函数在当前点x处的梯度g和方向d:
g = ∇f(x)
d = -g
Step 3: 计算步长
计算从当前点x出发,沿着方向d的步长α:
α = argmin f(x + α*d)
Step 4: 更新x值和梯度
更新当前点x和梯度g的值:
x = x + α*d
g_new = ∇f(x)
Step 5: 计算共轭方向
计算共轭方向β:
β = (gnew' * gnew) / (g' * g)
其中,g'和gnew'分别表示梯度g和gnew的转置。
Step 6: 更新方向
更新方向d的值:
d = -g_new + β*d
Step 7: 判断终止条件
重复以上步骤,直到满足终止条件:
当函数值的变化量小于一个预设的容错值时,或者经过预设的最大迭代次数时,终止迭代。
Step 8: 返回极小值或极大值
当满足终止条件时,返回当前点x的值作为函数的极小值或极大值。
共轭梯度法通常具有良好的收敛速度和稳定性,但也存在着一些局限性,例如需要保证函数是二次函数,或者需要使用其他方法进行预处理等。

 

 

通过实验,我深刻体会到了各种优化算法的优点和局限性。
在一维寻优法(0.618法)中,我们不需要求导,只需要在一个区间内不断缩小搜索空间,更容易找到全局最优解。但是,这种方法可能比较费时间,因为每一步只能减少一半的搜索空间。
在最速下降法中,我们能够根据导数的信息,沿着梯度的负方向找到局部最优解。但是,在优化迭代次数较少的情况下,容易陷入局部最小值,而且在函数的梯度向量和海森矩阵方向有较大偏离时,收敛速度会比较慢。
在Newton法中,我们不仅利用导数信息,还利用了海森矩阵的信息来行进迭代。相比于最速下降法,这种方法更快地收敛到全局最优解。但是,需要注意的是海森矩阵需要是正定矩阵,否则算法可能会收敛到错误的最优解。
在共轭梯度法中,我们利用历史上已经计算过的梯度信息,使得算法的收敛速度更快,而且更不容易陷入局部最小值。与其他方法相比,这种方法的收敛速度更快,这也是它被广泛使用的原因。但是,需要保证函数是二次函数。
在MATLAB最优化工具箱中,我们可以方便地使用各种优化算法和工具,如fminunc()、fmincon()、fsolve()等函数,更快速地找到最优解。但是,这种方法需要我们熟练掌握这些优化函数的参数设置和使用方法。
总的来说,不同的优化算法适用于不同的问题,我们需要在实际应用中根据问题性质和需求选择其中的一种或几种方法进行优化,才能更好地完成任务。

posted on 2023-05-18 21:33  夜的第七章i  阅读(17)  评论(0编辑  收藏  举报