AnyMath 文档

优化代码。jl

该页面正在翻译中。

*优化代码。jl*提供基于ODE的优化方法作为求解器插件https://github.com/SciML/Optimization.jl[SciML的优化。jl]。 它包装了各种ODE求解器,以使用连续时间动力学执行基于梯度的优化。

安装工程

using Pkg
Pkg.add("OptimizationODE")

使用方法

using OptimizationODE, Optimization, ADTypes, SciMLBase

function f(x, p)
    return sum(abs2, x)
end

function g!(g, x, p)
    @. g = 2 * x
end

x0 = [2.0, -3.0]
p = []

f_manual = OptimizationFunction(f, SciMLBase.NoAD(); grad = g!)
prob_manual = OptimizationProblem(f_manual, x0)

opt = ODEGradientDescent(dt=0.01)
sol = solve(prob_manual, opt; maxiters=50_000)

@show sol.u
@show sol.objective

基于局部梯度的优化器

所有提供的优化器都是*基于梯度的局部优化器*,通过将基于梯度的Ode集成到收敛来解决优化问题:

* ODEGradientDescent(dt=。..) --使用显式欧拉方法执行基本梯度下降。 这是一种简单而有效的方法,适用于小规模或条件良好的问题。 * RKChebyshevDescent() --使用ROCK2求解器,一种稳定的显式Runge-Kutta方法,适用于僵硬的问题。 它允许更大的步长,同时保持稳定性。 * RKAccelerated() --利用Tsit5方法,一个5阶Runge-Kutta求解器,通过提高积分精度,实现平滑问题的更快收敛。 * 高亮度() --应用Vern7,一种高阶(7阶)显式Runge-Kutta方法,用于更精确的集成。 这对于需要高精度的问题是有益的。

您还可以使用泛型定义自定义优化器 ODEOptimizer(solver;dt=nothing) 通过提供任何ODE求解器支持的构造函数https://docs.sciml.ai/DiffEqDocs/stable/solvers/ode_solve/[OrdinaryDiffEq.jl]。

基于DAE的优化器

基于dae的优化器仍在实验和研究项目中。 慎用。

除了基于ODE的优化器,OptimizationODE。jl为微分代数方程(dae)约束问题提供优化器:

* DAEMassMatrix() --使用Rodas5P求解器(来自OrdinaryDiffEq。jl)用于dae问题的质量基质配方。 * DAEOptimizer(IDA()) --使用IDA求解器(来自日晷。jl)对于索引变量支持的DAE问题(需要 使用日晷)

您还可以使用泛型定义自定义优化器 ODEOptimizer(求解器)DAEOptimizer(求解器) 构造函数通过提供任何ODE或dae求解器支持https://docs.sciml.ai/DiffEqDocs/stable/solvers/ode_solve/[普通Diffeq.jl]或https://github.com/SciML/Sundials.jl[日晷.jl]。

界面详情

所有优化器都需要梯度信息(通过自动微分或手动提供 研究生!). 通过积分由负梯度定义的ODE直到达到稳定状态来执行优化。