任意精度优化库?

计算科学 优化 Python 图书馆
2021-12-09 17:44:15

是否有任何著名的优化库(理想情况下使用 Python 绑定甚至在 Python 中)支持(无约束)最小化(f:RnR为了n为了n101,102) 支持任意精度输入/输出?

我有一个(数学物理)问题,我真的想最小化到非常高的精度,例如标准例程scipy.optimize无法收敛到我想要的精度。任何想法表示赞赏 - 谢谢!

2个回答

来自 Julia 的 Optim.jl 将使用您提供的数字类型,因此如果您使用 BigFloats,它就会这样做。基于局部导数,无导数,全局,并与自动微分集成。来自 Julia,它只是:

using Optim
rosenbrock(x) =  (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
result = optimize(rosenbrock, big.(zeros(2)), BFGS())

那是使用任意精度的大浮点数,那么setprecision(512)这就是您设置位大小的方式。

要从 Python 中使用它,您可以通过pyjulia使用python3 -m pip install julia它,然后进行调用:

import julia
julia.install()
from julia import Base
from julia import Optim
def rosenbrock: 
   [(1.0 - x[0])^2 + 100.0 * (x[1] - x[0]^2)^2]

result = Optim.optimize(rosenbrock, [Base.big(0),Base.big(0)], Optim.BFGS())

应该是全部吗?(我没有仔细检查运行它,但是从diffeqpy我已经使用了一点,并且稍微推断了语义)

我唯一能想到的另一件事可能是 Boost 中的某些东西,因为大多数 Boost 都是模板化的。

Chris 代码在我的机器上不起作用,所以这是我的解决方案。

import julia
#julia.install() #<- this is probably needed for the first time
from julia.api import Julia
jl = Julia(compiled_modules=False)
#from julia import Base
from julia import Optim
pyrosen="((x,y),)->(1.0 - x)^2 + 100.0 * (y - x^2)^2; "
jl.eval("setprecision(512)")
result = jl.eval(
    "rosenbrock="+pyrosen
    +"res=Optim.optimize(rosenbrock, [Base.big(0.0),Base.big(0.0)],"
    +"Optim.BFGS(),Optim.Options(g_tol=1e-150))")
args = jl.eval("Optim.minimizer(res)")

备注 1:您需要设置 和 的精度BigFloat才能Optim.optimize获得精确的结果。

备注2:起始向量应该有BigFloats,而不是BigInts,所以重要的是使用big(0.0),而不是big(0)