优化和求根 (scipy.optimize)#

SciPy 的 optimize 模块提供了最小化(或最大化)目标函数的功能,可能受约束。它包括非线性问题求解器(支持局部和全局优化算法)、线性规划、约束和非线性最小二乘、求根以及曲线拟合。

在不同求解器之间共享的常用函数和对象有:

show_options([solver, method, disp])

显示优化求解器附加选项的文档。

OptimizeResult

表示优化结果。

OptimizeWarning

scipy.optimize 的通用警告。

优化#

标量函数优化#

minimize_scalar(fun[, bracket, bounds, ...])

单变量标量函数的局部最小化。

minimize_scalar 函数支持以下方法:

局部(多变量)优化#

minimize(fun, x0[, args, method, jac, hess, ...])

一个或多个变量的标量函数最小化。

minimize 函数支持以下方法:

约束作为单个对象或以下类的对象列表传递给 minimize 函数:

NonlinearConstraint(fun, lb, ub[, jac, ...])

变量上的非线性约束。

LinearConstraint(A[, lb, ub, keep_feasible])

变量上的线性约束。

简单边界约束单独处理,并且有一个专门的类:

Bounds([lb, ub, keep_feasible])

变量上的边界约束。

实现 HessianUpdateStrategy 接口的拟牛顿策略可用于在 minimize 函数中近似 Hessian(仅适用于“trust-constr”方法)。实现此接口的可用拟牛顿方法有:

BFGS([exception_strategy, min_curvature, ...])

Broyden-Fletcher-Goldfarb-Shanno (BFGS) Hessian 更新策略。

SR1([min_denominator, init_scale])

对称秩 1 Hessian 更新策略。

全局优化#

basinhopping(func, x0[, niter, T, stepsize, ...])

使用盆跳算法寻找函数的全局最小值。

brute(func, ranges[, args, Ns, full_output, ...])

通过暴力法在给定范围内最小化函数。

differential_evolution(func, bounds[, args, ...])

寻找多元函数的全局最小值。

shgo(func, bounds[, args, constraints, n, ...])

使用 SHG 优化寻找函数的全局最小值。

dual_annealing(func, bounds[, args, ...])

使用双重退火算法寻找函数的全局最小值。

direct(func, bounds, *[, args, eps, maxfun, ...])

使用 DIRECT 算法寻找函数的全局最小值。

最小二乘和曲线拟合#

非线性最小二乘#

least_squares(fun, x0[, jac, bounds, ...])

求解带有变量边界的非线性最小二乘问题。

线性最小二乘#

nnls(A, b, *[, maxiter, atol])

求解 argmin_x || Ax - b ||_2,其中 x>=0

lsq_linear(A, b[, bounds, method, tol, ...])

求解带有变量边界的线性最小二乘问题。

isotonic_regression(y, *[, weights, increasing])

非参数等渗回归。

曲线拟合#

curve_fit(f, xdata, ydata[, p0, sigma, ...])

使用非线性最小二乘法将函数 f 拟合到数据。

求根#

标量函数#

root_scalar(f[, args, method, bracket, ...])

寻找标量函数的根。

brentq(f, a, b[, args, xtol, rtol, maxiter, ...])

使用 Brent 方法在括号区间内寻找函数的根。

brenth(f, a, b[, args, xtol, rtol, maxiter, ...])

使用 Brent 方法并结合双曲外推在括号区间内寻找函数的根。

ridder(f, a, b[, args, xtol, rtol, maxiter, ...])

使用 Ridder 方法在区间内寻找函数的根。

bisect(f, a, b[, args, xtol, rtol, maxiter, ...])

使用二分法在区间内寻找函数的根。

newton(func, x0[, fprime, args, tol, ...])

使用牛顿-拉夫逊(或割线或哈雷)方法寻找实函数或复函数的根。

toms748(f, a, b[, args, k, xtol, rtol, ...])

使用 TOMS 算法 748 方法寻找根。

RootResults(root, iterations, ...)

表示求根结果。

root_scalar 函数支持以下方法:

下表列出了各种情况和适当的方法,以及成功收敛到简单根(*)时每次迭代(和每次函数求值)的渐近收敛速度。二分法是所有方法中最慢的,每次函数求值增加一位精度,但保证收敛。其他括号法(最终)每次函数求值都会使精度位数增加约 50%。基于导数的方法,都建立在 newton 之上,如果初始值接近根,则可以很快收敛。它们也可以应用于定义在复平面(或其子集)上的函数。

f 的定义域

括号?

导数?

求解器

收敛性

fprime

fprime2

有保证吗?

速率(*)

R

不适用

不适用

  • bisection

  • brentq

  • brenth

  • ridder

  • toms748

  • 1 “线性”

  • >=1, <= 1.62

  • >=1, <= 1.62

  • 2.0 (1.41)

  • 2.7 (1.65)

RC

secant

1.62 (1.62)

RC

newton

2.00 (1.41)

RC

halley

3.00 (1.44)

另请参阅

scipy.optimize.cython_optimize – 求根函数的类型化 Cython 版本

不动点寻找

fixed_point(func, x0[, args, xtol, maxiter, ...])

寻找函数的不动点。

多维#

root(fun, x0[, args, method, jac, tol, ...])

寻找向量函数的根。

root 函数支持以下方法:

逐元素最小化和求根#

线性规划 / MILP#

milp(c, *[, integrality, bounds, ...])

混合整数线性规划

linprog(c[, A_ub, b_ub, A_eq, b_eq, bounds, ...])

线性规划:最小化线性目标函数,受线性等式和不等式约束。

linprog 函数支持以下方法:

单纯形法、内点法和修正单纯形法支持回调函数,例如:

linprog_verbose_callback(res)

一个演示 linprog 回调接口的示例回调函数。

分配问题#

linear_sum_assignment

求解线性分配问题。

quadratic_assignment(A, B[, method, options])

近似求解二次分配问题和图匹配问题。

quadratic_assignment 函数支持以下方法:

实用工具#

有限差分近似#

approx_fprime(xk, f[, epsilon])

标量或向量值函数导数的有限差分近似。

check_grad(func, grad, x0, *args[, epsilon, ...])

通过将梯度函数与梯度的(前向)有限差分近似进行比较,检查梯度函数的正确性。

Hessian 近似#

LbfgsInvHessProduct(*args, **kwargs)

L-BFGS 近似逆 Hessian 的线性算子。

HessianUpdateStrategy()

实现 Hessian 更新策略的接口。

基准问题#

rosen(x)

Rosenbrock 函数。

rosen_der(x)

Rosenbrock 函数的导数(即梯度)。

rosen_hess(x)

Rosenbrock 函数的 Hessian 矩阵。

rosen_hess_prod(x, p)

Rosenbrock 函数的 Hessian 矩阵与向量的乘积。

遗留函数#

以下函数不建议在新脚本中使用;所有这些方法都可以通过上述更新、更一致的接口访问。

优化#

通用多变量方法

fmin(func, x0[, args, xtol, ftol, maxiter, ...])

使用下坡单纯形算法最小化函数。

fmin_powell(func, x0[, args, xtol, ftol, ...])

使用修正的 Powell 方法最小化函数。

fmin_cg(f, x0[, fprime, args, gtol, norm, ...])

使用非线性共轭梯度算法最小化函数。

fmin_bfgs(f, x0[, fprime, args, gtol, norm, ...])

使用 BFGS 算法最小化函数。

fmin_ncg(f, x0, fprime[, fhess_p, fhess, ...])

使用牛顿-CG 方法对函数进行无约束最小化。

约束多变量方法

fmin_l_bfgs_b(func, x0[, fprime, args, ...])

使用 L-BFGS-B 算法最小化函数 func。

fmin_tnc(func, x0[, fprime, args, ...])

使用截断牛顿算法,在变量受边界约束的情况下最小化函数,并利用梯度信息。

fmin_cobyla(func, x0, cons[, args, ...])

使用线性近似约束优化 (COBYLA) 方法最小化函数。

fmin_slsqp(func, x0[, eqcons, f_eqcons, ...])

使用序列最小二乘规划最小化函数

单变量(标量)最小化方法

fminbound(func, x1, x2[, args, xtol, ...])

标量函数的有界最小化。

brent(func[, args, brack, tol, full_output, ...])

给定一个单变量函数和一个可能的括号,返回函数的局部最小化器,精度为 tol。

golden(func[, args, brack, tol, ...])

使用黄金分割法返回单变量函数的最小化器。

最小二乘#

leastsq(func, x0[, args, Dfun, full_output, ...])

最小化一组方程的平方和。

求根#

通用非线性求解器

fsolve(func, x0[, args, fprime, ...])

寻找函数的根。

broyden1(F, xin[, iter, alpha, ...])

使用 Broyden 的第一种雅可比近似方法寻找函数的根。

broyden2(F, xin[, iter, alpha, ...])

使用 Broyden 的第二种雅可比近似方法寻找函数的根。

NoConvergence

当非线性求解器未在指定 maxiter 内收敛时引发的异常。

大规模非线性求解器

newton_krylov(F, xin[, iter, rdiff, method, ...])

使用 Krylov 近似逆雅可比矩阵寻找函数的根。

anderson(F, xin[, iter, alpha, w0, M, ...])

使用(扩展)Anderson 混合方法寻找函数的根。

BroydenFirst([alpha, reduction_method, max_rank])

使用 Broyden 的第一种雅可比近似方法寻找函数的根。

InverseJacobian(jacobian)

一个简单的包装器,使用 solve 方法反转雅可比矩阵。

KrylovJacobian([rdiff, method, ...])

使用 Krylov 近似逆雅可比矩阵寻找函数的根。

简单迭代求解器

excitingmixing(F, xin[, iter, alpha, ...])

使用调优的对角雅可比近似寻找函数的根。

linearmixing(F, xin[, iter, alpha, verbose, ...])

使用标量雅可比近似寻找函数的根。

diagbroyden(F, xin[, iter, alpha, verbose, ...])

使用对角 Broyden 雅可比近似寻找函数的根。