2013-07-23 22 views
0

我在計算凸函數的數值次梯度。我的測試主題是Wolfe function。它不需要超精確,所以我嘗試了兩個方向上的正常有限差分:(f(x-h)-f(x + h))/ 2h。在代碼:Matlab中的數值梯度 - 舍入問題

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的次梯度。

我知道,低三角洲可能會引入舍入誤差,但它並沒有因爲我增加delta而變得更好。

我的第二次嘗試是一維five-point stencil,但即使有大約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 

任何人有一個想法,這是怎麼一回事呢?

+0

這可能是因爲梯度有_actually是'[-72 16]'_ –

回答

0

如果你的工作沃爾夫函數的梯度,你想出:

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]

+0

哦,我完全嘲弄這一點...我的思維仍然被設置爲連續函數和微分,並且說這不能:O但我不同意最小值,[-1 0]的函數值爲-8,[0.7598 0 ]具有一定的正面價值。 –

+0

哎呀,忘了負號。我不知道你如何計算你的函數,但是Wolfe(-1,0)= 0' –

+0

隨着x = -1,y = 0我在第一種情況下,x \ leq 0.因此Wolfe -1,0)= 9(-1)+ 16 | 0 | - (-1)^ 9 = -9 + 1 = -8 –