我在計算凸函數的數值次梯度。我的測試主題是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
任何人有一個想法,這是怎麼一回事呢?
這可能是因爲梯度有_actually是'[-72 16]'_ –