我有一个函数,实际上是调用另一个程序(一些Fortran代码)。当我调用这个函数(
注意:当这个函数(
我已经尝试了几种优化方法,来自scipy文档。但没有一种能像预期的那样工作。最小化应该能够在4个变量上有界。以下是一种尝试:
这样做可以帮助我:
run_moog
)时,我可以解析4个变量,并返回6个值。这些值应该都接近于0(为了最小化)。然而,我将它们像这样组合:np.sum(results**2)
。现在我有一个标量函数。我想要最小化这个函数,即使得np.sum(results**2)
尽可能接近零。注意:当这个函数(
run_moog
)接收4个输入参数时,它会创建一个依赖于这些参数的Fortran代码输入文件。我已经尝试了几种优化方法,来自scipy文档。但没有一种能像预期的那样工作。最小化应该能够在4个变量上有界。以下是一种尝试:
from scipy.optimize import minimize # Tried others as well from the docs
x0 = 4435, 3.54, 0.13, 2.4
bounds = [(4000, 6000), (3.00, 4.50), (-0.1, 0.1), (0.0, None)]
a = minimize(fun_mmog, x0, bounds=bounds, method='L-BFGS-B') # I've tried several different methods here
print a
这样做可以帮助我:
这会给我带来
status: 0
success: True
nfev: 5
fun: 2.3194639999999964
x: array([ 4.43500000e+03, 3.54000000e+00, 1.00000000e-01,
2.40000000e+00])
message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
jac: array([ 0., 0., -54090399.99999981, 0.])
nit: 0
第三个参数稍有变化,而其它参数则完全相同。此外,已经进行了5次函数调用(nfev
),但没有迭代(nit
)。可以在这里查看来自Scipy的输出结果。
method='L-BFGS-B'
和options={'epsilon': 1e-4}
,或者一些更大的值(默认为1e-8
),直到雅可比矩阵不再有零元素。 - rthBFGS
、L-BFGS-B
、SLSQP
)的三个解法之一。所以通过设置eps: 1e0
来运行,但是在某些时候我会超出我的约束集。从 OP 添加的唯一内容是minimize
函数中的, options={'eps': 1e+0})
。 - Daniel Thaagaard Andreasenepsilon
可以是值列表吗? - Daniel Thaagaard Andreasen