我想在編程語言(C/C++/fortran)中實現最速下降算法。實現最速下降算法,可變步長
與F的例如最小化(X1,X2)= X1^3 + X 2^3 - 2 * X1 * X2
估計開始設計點X0,迭代計數器K0,收斂參數耐性= 0.1 。 (1,0)
將當前點x(k)處f(x1,x2)的梯度計算爲grad(f)。我將在這裏使用數字區分。
d/DX1(F)= LIM(H-> 0)(F(X1 + H,X 2) - F(X1,X2))/ h的
這是研究所(F)=(3 * X1^2 - 2 * X 2,3 * X 2^2 - 2 * X1)
在(0,1研究所(F))是C0 =(3,-2)
因爲L2範數C0>耐性的,我們繼續進行下一步驟
方向D0 = -c0 =(-3,2)
計算步長a。最小化f(a)= f(x0 + a d0)=(1-3a,2a)=(1-3a)^ 3 +(2a)^ 3 - 2(1-3a)*(2a)。我不保持步長不變。
update:new [x1,x2] = old [x1,x2] x + a * d0。
我不明白怎麼做步驟5 我有二分法一維最小化程序,它看起來像:
program main()
...
...
define upper, lower interval
call function value
...calculations
...
...
function value (input x1in) (output xout)
...function is x^4 - 2x^2 + x + 10
xout = (xin)^4 - 2*(xin)^2 + (xin) + 10
在這種情況下,看着步驟5中,我不能通過象徵性的a。 任何想法如何在編程語言中實現算法,尤其是步驟5?請建議是否有完全不同的方式來編程。我已經看到許多具有恆定步長的程序,但是我想在每一步都進行計算。這個算法可以很容易地在MATLAB中使用符號實現,但我不想使用符號。 任何建議表示讚賞。謝謝。
你問如何計算a,如何存儲它以便在每次迭代中使用或如何將它作爲參數傳遞給函數?爲了幫助您,我們需要查看您使用的實際相關部分代碼。 –
計算1D最佳值的代碼大約有200行,其中一些包含其他文件。把它放在這裏可能不是個好主意。所以我給出了一個粗略的模板,該代碼如何工作。 – de23edced
@o_weisman基本上,我有一個函數代碼,它接受變量,插入方程並給出函數的結果。在我的梯度法算法中,有一個我不知道如何處理的符號變量'a'。 – de23edced