我是Octave的新手。现在我试图在Octave中实现最速下降算法。
例如f(x1,x2) = x1^3 + x2^3 - 2*x1*x2
估算起始设计点x0
,迭代计数器k0
,收敛参数容差= 0.1。
说这个凝视点是(1,0)
将f(x1,x2)
的当前点x(k)
的渐变计算为grad(f)
。我将在这里使用数值微分。
d/dx1 (f) = lim (h->0) (f(x1+h,x2) - f(x1,x2) )/h
这是grad(f)=(3*x1^2 - 2*x2, 3*x2^2 - 2*x1)
grad(f)
为c0
=(3,-2) 因为c0
的L2范数>宽容,我们继续下一步
方向d0
= -c0
=( - 3,2)
计算步长a
。 Minimize f(a) = f(x0 + a*d0) = (1-3a,2a) = (1-3a)^3 + (2a)^3 - 2*(1-3a)*(2a)
。我没有保持不变的步长。
更新:new[x1,x2] = old[x1,x2]x + a*d0
。
在第5步之前一切都很好。我不知道如何实现方程,或直接在Octave中得到方程的最小值。怎么做?
修改
我们如何利用这个凸函数使用最速下降:f(x, y) = 4x^2 − 4xy + 2y^2
答案 0 :(得分:0)
简短的回答是"你不能"。至少不是一般的。第5行中的优化问题本身很难。尽管它是一维的,但您正在优化高度非凸函数。因此,你可以做的是运行一个对数刻度线searcch(只是采样越来越大的步骤,选择一个最小值)或运行另一个"嵌套"优化器,就像在步骤5中对问题具有固定步长的常规SD一样,或者您可以使用更简单的东西(如2阶多项式)近似此函数,并直接进入近似的最优值。无论你选择哪种方式 - 它都是近似值。没有办法达到实际最低要求。直接求解它的唯一能力是仍然在符号级别上工作,如果函数足够简单(如小程度的多项式),你可以通过分析找到它的极值。
作为旁注 - 你的整个优化问题定义不明确,除非你有一些约束,你不是在谈论。它的最小值是(-infty,-infty)(它无穷无尽地减少)。