【发布时间】:2015-03-24 20:56:41
【问题描述】:
我正在使用 optimize.fmin_l_bfgs_b 来优化用 Fortran 编写的函数。代码类似于:
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 函数中获得不同的值(这可能是它没有优化的原因)。第二个变量不存在这个问题。这是正常行为吗?有没有办法让算法使用更高的步长?
【问题讨论】:
-
输入不同的起始值有什么作用?
-
完全一样。 Fortran 函数对第一个变量的如此低的变化不是很敏感。
-
你看过优化解决方案的梯度近似值吗?
标签: python algorithm optimization scipy