簡體   English   中英

Matlab中的數字漸變-舍入問題

[英]Numerical Gradient in Matlab - Rounding Issues

我正在嘗試計算凸函數的數字子梯度。 我的測試對象是Wolfe函數 它並不需要非常精確,因此我嘗試了兩個方向的正態有限差分:(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

我知道低增量可能會導致舍入誤差,但是隨着增量的增加,這種情況並不會變得更好。

我的第二次嘗試是一維的五點模具 ,但是即使在1e-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

有人知道這是怎么回事嗎?

如果計算出該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<=0 ,梯度的第二個分量為16*sign(y) ,因此當y==0時為零,否則為+-16

順便說一句,確切的最小值似乎並不位於[-1 0] ,而是[-0.7598 0]
= [-(1/9)^(1/8) 0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM