基于函数下降趋势的FISTA算法
FISTA算法的使用
import optimtool.hybrid as oh
from optimtool.base import sp
x = sp.symbols("x1:3")
f = (2 - (sp.cos(x[0]) + sp.cos(x[1])) + (1 - sp.cos(x[0])) - sp.sin(x[0]))**2 + \(2 - (sp.cos(x[0]) + sp.cos(x[1])) + 2 * (1 - sp.cos(x[1])) - sp.sin(x[1]))**2
x_0 = (0.2, 0.2) # Random given
oh.fista.normal(f, x, x_0, verbose=True)
normal算法的可视化图例,
可以看到图例中有函数上升趋势的突出区域,基于函数下降趋势的FISTA算法采用如下代码段对算法做出了下降趋势的限制,
# hybrid/fista.py#L179-L180
phiu = get_value(funcs, args, u, mu, proxim)
x_0 = u if phiu <= f[-1] else x_0
代码通过获取最新的迭代函数值,对当前迭代步的迭代函数值做下降趋势的判断,得到最新的迭代点,即图例中的上升趋势受变量u的当前函数趋势控制,
oh.fista.decline(f, x, x_0, verbose=True)
同样的实例,decline算法的下降趋势相当平滑,