优化与寻根 (scipy.optimize )

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

在不同解算器之间共享的常用函数和对象包括:

show_options \([solver, method, disp] )

显示优化解算器的其他选项的文档。

OptimizeResult 

表示优化结果。

OptimizeWarning 

优化

标量函数优化

minimize_scalar \(好玩[, bracket, bounds, ...] )

一元标量函数的最小化。

这个 minimize_scalar 函数支持以下方法:

局部(多变量)优化

minimize \(乐趣,X0[, args, method, jac, hess, ...] )

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

这个 minimize 函数支持以下方法:

将约束传递给 minimize 用作单个对象或以下类中的对象列表:

NonlinearConstraint \(乐趣,lb,ub[, jac, ...] )

变量的非线性约束。

LinearConstraint \(a,lb,ub[, keep_feasible] )

变量的线性约束。

简单绑定约束是单独处理的,并且有一个特殊的类用于它们:

Bounds \(lb,ub[, keep_feasible] )

变量的边界约束。

拟牛顿策略的实现 HessianUpdateStrategy 接口可以用来近似Hessian中的 minimize 函数(仅适用于“Trust-Constr”方法)。实现此接口的可用的拟牛顿方法包括:

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

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

SR1 \([min_denominator, init_scale] )

对称秩1黑森更新策略。

全局优化

basinhopping \(函数,X0[, niter, T, stepsize, ...] )

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

brute \(函数,范围[, args, Ns, full_output, ...] )

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

differential_evolution \(函数,边界[, args, ...] )

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

shgo \(函数,边界[, args, constraints, n, ...] )

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

dual_annealing \(函数,边界[, args, ...] )

用对偶退火求函数的全局最小值。

最小二乘与曲线拟合

非线性最小二乘法

least_squares \(乐趣,X0[, jac, bounds, ...] )

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

线性最小二乘法

nnls \(a,b[, maxiter] )

求解 argmin_x || Ax - b ||_2x>=0

lsq_linear \(a,b[, bounds, method, tol, ...] )

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

曲线拟合

curve_fit \(F,扩展数据,ydata[, p0, sigma, ...] )

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

寻根

标量函数

root_scalar \(F[, args, method, bracket, ...] )

查找标量函数的根。

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

用布伦特方法在括号区间内求函数的根。

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

用双曲外推的布伦特方法求函数在括号区间内的根。

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

用Ridder方法在区间内求函数的根。

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

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

newton \(函数,X0[, fprime, args, tol, ...] )

使用牛顿-拉夫森(或割线或哈雷法)求实函数或复函数的零点。

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

用TOMS算法748方法求零。

RootResults \(根目录,迭代次数,.)

表示根查找结果。

这个 root_scalar 函数支持以下方法:

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

f的域

托架?

衍生品?

解算器

收敛

fprime

fprime2

有保证吗?

费率(*)

R

不适用

不适用

  • 一分为二

  • 布伦特克

  • 布伦特

  • 骑手

  • Toms748

  • 1“线性”

  • >=1,<=1.62

  • >=1,<=1.62

  • 2.0(1.41)

  • 2.7(1.65)

R or C

不是的

不是的

不是的

割线

不是的

1.62(1.62)

R or C

不是的

不是的

牛顿

不是的

2.00(1.41)

R or C

不是的

哈雷

不是的

3.00(1.44)

参见

scipy.optimize.cython_optimize --零函数的Cython类型化版本

定点查找:

fixed_point \(函数,X0[, args, xtol, maxiter, ...] )

找出函数的固定点。

多维

root \(乐趣,X0[, args, method, jac, tol, ...] )

求向量函数的根。

这个 root 函数支持以下方法:

线性规划

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

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

这个 linprog 函数支持以下方法:

单纯形、内点和修改后的单纯形方法支持回调函数,例如:

linprog_verbose_callback \(资源)

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

指派问题

linear_sum_assignment \(成本_矩阵[, maximize] )

解决线性和分配问题。

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

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

这个 quadratic_assignment 函数支持以下方法:

公用事业

有限差分近似

approx_fprime \(xk,f[, epsilon] )

标量函数梯度的有限差分逼近。

check_grad \(函数,梯度,X0,*参数[, epsilon, ...] )

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

Hessian近似

LbfgsInvHessProduct \(*args, * *kwargs)

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

HessianUpdateStrategy \()

用于实施黑森更新策略的接口。

基准问题

rosen \(X)

罗森布罗克函数。

rosen_der \(X)

导数(即

rosen_hess \(X)

Rosenbrock函数的黑森矩阵。

rosen_hess_prod \(X,p)

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

遗留函数

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

优化

通用多变量方法:

fmin \(函数,X0[, args, xtol, ftol, maxiter, ...] )

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

fmin_powell \(函数,X0[, args, xtol, ftol, ...] )

使用改进的鲍威尔方法最小化函数。

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 \(函数,X0[, fprime, args, ...] )

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

fmin_tnc \(函数,X0[, fprime, args, ...] )

使用截断牛顿算法中的梯度信息,最小化变量受限的函数。

fmin_cobyla \(函数,X0,条件[, args, ...] )

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

fmin_slsqp \(函数,X0[, eqcons, f_eqcons, ...] )

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

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

fminbound \(函数,x1,x2[, args, xtol, ...] )

标量函数的有界最小化。

brent \(函数[, args, brack, tol, full_output, ...] )

给定一个包含一个变量和可能的方括号的函数,将该函数的局部最小值返回到小数精度tol。

golden \(函数[, args, brack, tol, ...] )

使用黄金分割法返回一个变量的函数的最小值。

最小二乘法

leastsq \(函数,X0[, args, Dfun, full_output, ...] )

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

寻根

一般非线性解算器:

fsolve \(函数,X0[, args, fprime, ...] )

查找函数的根。

broyden1 \(F,Xin[, iter, alpha, ...] )

使用Broyden的第一雅可比近似求函数的根。

broyden2 \(F,Xin[, iter, alpha, ...] )

使用Broyden的二次雅可比近似求函数的根。

大型非线性解算器:

newton_krylov \(F,Xin[, iter, rdiff, method, ...] )

求函数的根,对逆雅可比矩阵使用Krylov近似。

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

使用(扩展的)安德森混合求函数的根。

简单迭代解算器:

excitingmixing \(F,Xin[, iter, alpha, ...] )

使用调谐的对角雅可比近似求函数的根。

linearmixing \(F,Xin[, iter, alpha, verbose, ...] )

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

diagbroyden \(F,Xin[, iter, alpha, verbose, ...] )

使用对角Broyden Jacobian近似求函数的根。

Additional information on the nonlinear solvers