Beispiel #1
0
    def iterate(self):
        direction = linear_system_solution_llt(self._g_f(self._x), self._grad)
        self._g_f_count += 1

        def g(a: float):
            return self._f(add_vector(self._x, scale_vector(a, direction)))

        step_max = 0.
        f_step_max = g(step_max)
        self._f_count += 1
        while True:
            next_f = g(step_max + 1.)
            self._f_count += 1
            step_max += 1.0
            if f_step_max < next_f:
                break
            f_step_max = next_f
        step_min = 0.
        if (step_max - 2.) > 0.:
            step_min = step_max - 1.
        gs = GoldenRatioSearch(g, step_min, step_max, self._tol)
        while not gs.test_result():
            gs.iterate()
        res_1, res_2, f_count = gs.get_result()
        step = (res_1 + res_2) / 2

        self._f_count += f_count
        self._x = add_vector(self._x, scale_vector(step, direction))
        self._grad = scale_vector(-1., self._df(self._x))
        self._df_count += 1
Beispiel #2
0
 def iterate(self):
     direction = linear_system_solution_llt(self._g_f(self._x), self._grad)
     self._g_f_count += 1
     step = 1.0
     self._f_count += 2
     f_x_k = self._f(self._x)
     grad_inner_p = self._delta * inner_product(self._grad, direction)
     while (self._f(add_vector(self._x, scale_vector(step, direction))) - f_x_k) > \
             step * grad_inner_p:
         step *= self._mul
     self._x = add_vector(self._x, scale_vector(step, direction))
     self._grad = scale_vector(-1., self._df(self._x))
     self._df_count += 1
Beispiel #3
0
 def __init__(self, dfunc: Callable, step: float, tol: float, x0: List[float]):
     self._df = dfunc
     self._step = step
     self._tol = tol
     self._x0 = x0
     self._x = x0
     self._grad = scale_vector(-1., dfunc(x0))
     self._df_count = 1
Beispiel #4
0
 def _next_vector(self, u):
     i_k = self._n_k[index_of_positive_element([u[i] for i in self._n_k])]
     coefficient_k = self._x[i_k] / u[i_k]
     for i in self._n_k:
         if u[i] > 0:
             temp1 = self._x[i] / u[i]
             if temp1 < coefficient_k:
                 i_k = i
                 coefficient_k = temp1
     self._x = sub_vector(self._x, scale_vector(coefficient_k, u))
     return i_k
Beispiel #5
0
 def __init__(self, func: Callable, dfunc: Callable, gesse_func: Callable, tol: float, x0: List[float]):
     self._g_f = gesse_func
     self._df = dfunc
     self._f = func
     self._tol = tol
     self._x0 = x0
     self._x = x0
     self._grad = scale_vector(-1., dfunc(x0))
     self._df_count = 1
     self._f_count = 0
     self._g_f_count = 0
Beispiel #6
0
 def restart(self):
     self._x = self._x0
     self._grad = scale_vector(-1., self._df(self._x0))
     self._df_count = 1
Beispiel #7
0
 def iterate(self):
     self._x = add_vector(self._x, scale_vector(self._step, self._grad))
     self._grad = scale_vector(-1., self._df(self._x))
     self._df_count += 1
Beispiel #8
0
 def g(a: float):
     return self._f(add_vector(self._x, scale_vector(a, direction)))