Я использую optimize.fmin_l_bfgs_b для оптимизации функции, написанной в Fortran. Код нечто похожее на:Неверная конвергенция с использованием optimize.fmin_l_bfgs_b
def f(m, *args):
# Optmization values
Opt1 = m[0]
Opt2 = m[1]
# Rest of arguments:
Var1 = args[0]
Var2 = args[1]
# Fortran Function
r1, r2 = FortranFunction(Opt1, Opt2)
# Evaluation of the result
evaluation = sqrt((r1-Var1)**2 + (r2-Var2)**2)
return evaluation
initial_values = numpy.array([1.09, 0.0025])
mybounds = [(1, 1.2), (0, 0.1)]
m = optimize.fmin_l_bfgs_b(f, x0 = initial_values, args=(x, file_vars), approx_grad = True, bounds = mybounds)
Fortran функция возвращает 2 значения, которые используются для оценки функции с помощью двух желаемых результатов (var1 и var2). Проблема в том, что алгоритм не оптимизирует первую переменную. Если напечатать его в каждой итерации, это то, что я получаю:
1.09
1.09
1.09000001
1.09
1.09
1.09
1.09000001
1.09
1.09
1.09
1.09000001
1.09
1.09
1.09
1.09000001
...
Кажется, только оценка функции разности между 1,09 и 1.09000001, который является слишком низким, чтобы получить другое значение в Fortran функции (что может быть причиной того, что он не оптимизирован). Вторая переменная не представляет этой проблемы. Это нормальное поведение? Есть ли возможность сделать алгоритм более высоким шагом?
Что он делает, когда вы вводите разные стартовые значения? – senderle
Точно так же. Функция Fortran не очень чувствительна к таким низким изменениям для первой переменной. – wuampa
Вы посмотрели на приближение градиента оптимизированного решения? – cel