0

我正在尝试计算凸函数的数值次梯度。我的测试对象是沃尔夫函数。它不需要非常精确,所以我尝试了两个方向的正常有限微分:(f(xh)-f(x+h))/2h。在代码中:

delta = 1e-10;

subgradient = zeros(length(xToEvaluate),1);

for i = 1 : length(xToEvaluate)
     deltaX = xToEvaluate;                     

     deltaX(i) = xToEvaluate(i) + delta;
     f1 = funct( deltaX );

     deltaX(i) = xToEvaluate(i) - delta;
     f2 = funct( deltaX );      

    subgradient(i,1) = (f1 - f2) / (2 * delta);  
end

在函数的确切最小值处,在 (-1 ,0) 处,我得到了一些幅度为 的东西1e-7,非常好。当我移动到 (-1, 0.1) 或 (-1, 1e-6) 之类的东西时,我得到一个次梯度,第二个分量约为16

我知道低增量可能会引入舍入误差,但随着我增加增量,它并没有变得更好。

我的第二次尝试是一个一维五点模板,但即使有 deltas of around1e-3奇怪的16不断弹出......

delta = 1e-3;

subgradient = zeros(length(xToEvaluate),1);

for i = 1 : length(xToEvaluate)

     xPlusTwo = xToEvaluate;
     xPlusOne = xToEvaluate;
     xMinusTwo = xToEvaluate;
     xMinusOne = xToEvaluate;

     xPlusTwo(i) = xToEvaluate(i) + 2*delta;
     xPlusOne(i) = xToEvaluate(i) + delta;
     xMinusTwo(i) = xToEvaluate(i) - 2*delta;
     xMinusOne(i) = xToEvaluate(i) - delta;

     subgradient(i,1) = (-funct(xPlusTwo) + 8*funct(xPlusOne) - 8*funct(xMinusOne) + funct(xMinusTwo))  / (12*delta);  
end

有人知道这是怎么回事吗?

4

1 回答 1

0

如果你计算出 Wolfe 函数的梯度,你会得出:

if x<=0;
    dfx = 9 - 81*x.^8;
    dfy = 16*sign(y);
elseif x>=abs(y);
    dfx = 5*0.5./sqrt(9*x.^2 + 16*y.^2)*9*2.*x;
    dfy  = 5*0.5./sqrt(9*x.^2 + 16*y.^2)*16*2.*y;
else
    dfx = 9;
    dfy  = 16*sign(y);
end

如您所见,梯度的第二个分量x<=016*sign(y),因此当 时为零y==0+-16否则。

顺便说一句,看起来确切的最小值不在[-1 0],而是在[-0.7598 0]
= [-(1/9)^(1/8) 0]

于 2013-07-23T21:44:25.750 回答