优化代码。jl
|
该页面正在翻译中。 |
*优化代码。jl*提供基于ODE的优化方法作为求解器插件https://github.com/SciML/Optimization.jl[SciML的优化。jl]。 它包装了各种ODE求解器,以使用连续时间动力学执行基于梯度的优化。
使用方法
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]。