Я пытаюсь реализовать алгоритм наименьшего спуска в языках программирования (C/C++/fortran).Реализация алгоритма наивысшего спуска, изменяемый размер шага
К примеру минимизации F (x1, x2) = x1^3 + x2^3 - 2 * х1 * х2
Расчетный начиная расчетной точке x0, итерационный счетчик k0, параметр tolerence сходимости = 0,1 , Скажем, что эта точка зрения (1,0)
Вычислить градиент f (x1, x2) в текущей точке x (k) как grad (f). Здесь я буду использовать численное дифференцирование.
д/дх1 (е) = Пт (h-> 0) (F (x 1 + ч, х2) - F (x1, x2))/ч
Это градиента (е) = (3 * x1^2 - 2 * х2, 3 * х2^2 - 2 * x1)
град (е) в точке (0,1) с0 = (3, -2)
, поскольку норма L2 с0> tolerence, мы переходим к следующему шагу
направление d0 = с0 = (-3,2)
Вычислить размер шага a. Минимизировать f (a) = f (x0 + a d0) = (1-3a, 2a) = (1-3a)^3 + (2a)^3 - 2 (1-3a) * (2a). Я не придерживаюсь постоянного размера шага.
обновление: новый [x1, x2] = старый [x1, x2] x + a * d0.
Я не понимаю, как сделать шаг 5. У меня есть программа минимизации 1D с методом бисекций, и это выглядит следующим образом:
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 ot python sympy с использованием символики, но я не хочу использовать символику. Любые предложения оценены. Благодарю.
Вы спрашиваете, как вычислить, как сохранить его для использования на каждой итерации или как передать его в качестве параметра функции? Чтобы помочь вам, нам нужно увидеть фактическую значимую часть кода, который вы используете. –
Код для расчета 1D оптимального значения имеет около 200 строк, а несколько других - другие. Не может быть хорошей идеей дать его здесь. Поэтому я дал примерный пример того, как работает этот код. – de23edced
@o_weisman В принципе, у меня есть код функции, который принимает переменную, подключается к уравнению и выдает результат функции. В моем случае алгоритма градиента algo есть эта символическая переменная 'a', которую я не знаю, как обращаться. – de23edced