AnyMath 文档

希皮。jl

该页面正在翻译中。

[医锡皮]是一个成熟的Python库,提供了丰富的优化,寻根和线性规划算法系列。 优化。jl 通过统一的访问这些例程 优化。jl 界面就像任何本地Julia优化器一样。

优化。jl 依靠https://github.com/cjdoris/PythonCall.jl[脧锚脧赂`毕通卡尔`]. 包含SciPy的最小Python发行版将在首次使用时自动安装,因此不需要手动设置Python。

安装:OptimizationSciPy。jl

import Pkg
Pkg.add("OptimizationSciPy")

方法

以下是由 优化。jl 与他们的方便构造函数一起。 所有这些都接受通常的关键字参数 最大的,最大的, 最大时间, 阿布斯托尔, [医]雷托尔, 回调;回调, 进展情况 除了任何特定于SciPy的选项(通过关键字参数逐字传递到 解决方案).

本地优化器

无衍生品

* ScipyNelderMead() --Simplex Nelder—​Mead算法 * ScipyPowell() --鲍威尔搜索沿着共轭方向 * ScipyCOBYLA() --约束的线性近似(支持非线性约束)

基于梯度的

* ScipyCG() --非线性共轭梯度 * ScipyBFGS() --准牛顿BFGS * ScipyLBFGSB() --具有简单边界的有限内存BFGS * ScipyNewtonCG() --牛顿-共轭梯度(需要Hessian-矢量产品) * ScipyTNC() --具有边界的截断牛顿 * ScipySLSQP() --顺序最小二乘编程(支持约束) * ScipyTrustConstr() --非线性约束的Trust-region方法

Hessian—​基于/信任-区域

* ScipyDogleg(), ScipyTrustNCG(), ScipyTrustKrylov(), ScipyTrustExact() --可选使用或构建Hessian信息的信任区域算法

全局优化器

* ScipyDifferentialEvolution() --差分进化(需要边界) * ScipyBasinhopping() --带本地搜索的盆地跳跃 * ScipyDualAnnealing() --双重退火模拟退火 * ScipyShgo() --简单同源全局优化(支持约束) * ScipyDirect() --确定性 直接 算法(需要边界) * ScipyBrute() --蛮力网格搜索(需要边界)

线性和混合整数编程

* ScipyLinprog("高点") --来自HiGHS项目和传统内部点/单纯形方法的LP求解器 * ScipyMilp() --通过HiGHS分支和绑定的混合整数线性规划

求根&非线性最小二乘_(实验)_

支持 [医]扁桃体, [医]扁桃体[医]副标题 在幕后可用,一旦Api稳定将被记录。

例子:

无约束最小化

using Optimization, OptimizationSciPy

rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]

f = OptimizationFunction(rosenbrock, Optimization.AutoZygote())
prob = OptimizationProblem(f, x0, p)

sol = solve(prob, ScipyBFGS())
@show sol.objective   # ≈ 0 at optimum
7.717288356613562e-13

COBYLA约束优化

using Optimization, OptimizationSciPy

# Objective
obj(x, p) = (x[1] + x[2] - 1)^2

# Single non-linear constraint: x₁² + x₂² ≈ 1 (with small tolerance)
cons(res, x, p) = (res .= [x[1]^2 + x[2]^2 - 1.0])

x0 = [0.5, 0.5]
prob = OptimizationProblem(
    OptimizationFunction(obj; cons = cons),
    x0, nothing, lcons = [-1e-6], ucons = [1e-6])  # Small tolerance instead of exact equality

sol = solve(prob, ScipyCOBYLA())
@show sol.u, sol.objective
([0.9999995099640485, 1.1653740143742524e-5], 1.2462829129061485e-10)

具有自定义选项的差分进化(全局)

using Optimization, OptimizationSciPy, Random, Statistics
Random.seed!(123)

ackley(x, p) = -20exp(-0.2*sqrt(mean(x .^ 2))) - exp(mean(cos.(2π .* x))) + 20 + ℯ
x0 = zeros(2)                    # initial guess is ignored by DE
prob = OptimizationProblem(ackley, x0; lb = [-5.0, -5.0], ub = [5.0, 5.0])

sol = solve(prob, ScipyDifferentialEvolution(); popsize = 20, mutation = (0.5, 1))
@show sol.objective
4.440892098500626e-16

传递求解器特定选项

任何关键字 优化。jl 不解释直接转发给SciPy。 请参阅https://docs.scipy.org/doc/scipy/reference/optimize.html[SciPy优化API]为详尽的选项列表。

sol = solve(prob, ScipyTrustConstr(); verbose = 3, maxiter = 10_000)

故障排除

原始Python结果对象附加到 原版 领域:

sol = solve(prob, ScipyBFGS())
println(sol.original)  # SciPy OptimizeResult

如果SciPy引发错误,它将作为Julia重新抛出 ErrorException异常 携带Python消息,所以先看看那里。

捐款

欢迎在https://github.com/SciML/Optimization.jl[Optimization.jl]问题跟踪器。 高度赞赏改进Julia包装器或文档的拉取请求。