SciPy-1-12-中文文档-十一-

SciPy 1.12 中文文档(十一)

原文:docs.scipy.org/doc/scipy-1.12.0/index.html

scipy.optimize.linprog_verbose_callback

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.linprog_verbose_callback.html#scipy.optimize.linprog_verbose_callback

scipy.optimize.linprog_verbose_callback(res)

A sample callback function demonstrating the linprog callback interface. This callback produces detailed output to sys.stdout before each iteration and after the final iteration of the simplex algorithm.

参数:

res一个包含以下字段的scipy.optimize.OptimizeResult

x1-D array

优化线性规划问题的独立变量向量。

funfloat

目标函数的值。

successbool

如果算法成功找到最优解,则为 True。

slack1-D array

松弛变量的值。每个松弛变量对应一个不等式约束。如果松弛为零,则相应约束活跃。

con1-D array

等式约束的残差(通常为零),即 b - A_eq @ x

phaseint

正在执行的优化阶段。在第 1 阶段,寻找基本可行解,并且 T 有一行额外表示备用目标函数。

statusint

优化的退出状态的整数表示:

0 : Optimization terminated successfully
1 : Iteration limit reached
2 : Problem appears to be infeasible
3 : Problem appears to be unbounded
4 : Serious numerical difficulties encountered 

nitint

执行的迭代次数。

messagestr

优化退出状态的字符串描述。

scipy.optimize.linear_sum_assignment

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.linear_sum_assignment.html#scipy.optimize.linear_sum_assignment

scipy.optimize.linear_sum_assignment()

解决线性和分配问题。

参数:

cost_matrix数组

二分图的成本矩阵。

maximize布尔值(默认为 False)

计算最大权重匹配是否为真。

返回:

row_ind, col_ind数组

一个包含行索引和相应列索引的数组,给出最优分配。可以计算分配的成本为cost_matrix[row_ind, col_ind].sum()。行索引将被排序;在方形成本矩阵的情况下,它们将等于numpy.arange(cost_matrix.shape[0])

另见

scipy.sparse.csgraph.min_weight_full_bipartite_matching

用于稀疏输入

注意

线性和分配问题[1]也称为双分图中的最小权重匹配。问题实例由矩阵 C 描述,其中每个 C[i,j]是第一部分集合的顶点 i(一个“工作者”)和第二部分集合的顶点 j(一个“工作”)匹配的成本。目标是找到最小成本的工作者与工作的完全分配。

形式上,设 X 是一个布尔矩阵,其中(X[i,j] = 1)当且仅当第 i 行分配给第 j 列。然后,最优分配的成本为

[\min \sum_i \sum_j C_{i,j} X_{i,j}]

在矩阵 X 是方形的情况下,每行被分配给恰好一个列,每列被分配给恰好一个行。

此函数还可以解决经典分配问题的一般化,其中成本矩阵是矩形的。如果它的行数多于列数,则不需要将每行都分配给列,反之亦然。

此实现是一个修改的 Jonker-Volgenant 算法,没有初始化,描述在参考文献中。[2]

0.17.0 版中的新功能。

参考

[1]

en.wikipedia.org/wiki/Assignment_problem

[2]

DF Crouse. On implementing 2D rectangular assignment algorithms. IEEE Transactions on Aerospace and Electronic Systems, 52(4):1679-1696, August 2016, DOI:10.1109/TAES.2016.140952

示例

>>> import numpy as np
>>> cost = np.array([[4, 1, 3], [2, 0, 5], [3, 2, 2]])
>>> from scipy.optimize import linear_sum_assignment
>>> row_ind, col_ind = linear_sum_assignment(cost)
>>> col_ind
array([1, 0, 2])
>>> cost[row_ind, col_ind].sum()
5 

scipy.optimize.quadratic_assignment

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.quadratic_assignment.html#scipy.optimize.quadratic_assignment

scipy.optimize.quadratic_assignment(A, B, method='faq', options=None)

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

二次分配解决以下形式的问题:

[\begin{split}\min_P & \ {\ \text{trace}(A^T P B P^T)}\ \mbox{s.t. } & {P \ \epsilon \ \mathcal{P}}\\end{split}]

其中(\mathcal{P})是所有排列矩阵的集合,(A)和(B)是方阵。

图匹配试图最大化相同的目标函数。此算法可以看作是找到两个图的节点对齐,使得诱导边不一致的数量最小,或者在加权图的情况下,边权重差的平方和最小。

注意,二次分配问题是 NP-难的。这里给出的结果是近似值,并不保证最优。

参数:

A2-D 数组,方阵

目标函数中的方阵(A)。

B2-D 数组,方阵

目标函数中的方阵(B)。

methodstr in {‘faq’, ‘2opt’}(默认:‘faq’)

解决问题的算法。‘faq’(默认)和‘2opt’可用。

optionsdict,可选

求解器选项的字典。所有求解器都支持以下内容:

maximizebool(默认:False)

如果为True,则最大化目标函数。

partial_match2-D 整数数组,可选(默认:None)

修复匹配的部分,也称为“种子”[2]

partial_match的每一行指定了匹配节点对:A 的节点partial_match[i, 0]B的节点partial_match[i, 1]匹配。数组的形状为(m, 2),其中m不大于节点数\(n\)

rng{None, int, numpy.random.Generator,

numpy.random.RandomState,可选

如果seed为 None(或np.random),则使用numpy.random.RandomState单例。如果seed为整数,则使用一个带有seed种子的新RandomState实例。如果seed已经是GeneratorRandomState实例,则使用该实例。

有关特定方法的选项,请参阅show_options('quadratic_assignment')

返回:

resOptimizeResult

OptimizeResult 包含以下字段。

col_ind1-D 数组

对应于B节点的最佳排列的列索引。

funfloat

解决方案的目标值。

nitint

在优化过程中执行的迭代次数。

注释

默认方法‘faq’ 使用快速近似 QAP 算法 [1]; 它通常提供了速度和精度的最佳组合。方法‘2opt’ 可能计算成本高,但可能是一个有用的替代方案,或者用来优化另一种方法返回的解。

参考文献

[1]

J.T. Vogelstein, J.M. Conroy, V. Lyzinski, L.J. Podrazik, S.G. Kratzer, E.T. Harley, D.E. Fishkind, R.J. Vogelstein, 和 C.E. Priebe,“用于图匹配的快速近似二次规划”,PLOS one,vol. 10, no. 4, p. e0121002, 2015, DOI:10.1371/journal.pone.0121002

[2]

D. Fishkind, S. Adali, H. Patsolic, L. Meng, D. Singh, V. Lyzinski, C. Priebe,“种子图匹配”,Pattern Recognit. 87 (2019): 203-215, DOI:10.1016/j.patcog.2018.09.014

[3]

“2-opt”,维基百科。en.wikipedia.org/wiki/2-opt

示例

>>> import numpy as np
>>> from scipy.optimize import quadratic_assignment
>>> A = np.array([[0, 80, 150, 170], [80, 0, 130, 100],
...               [150, 130, 0, 120], [170, 100, 120, 0]])
>>> B = np.array([[0, 5, 2, 7], [0, 0, 3, 8],
...               [0, 0, 0, 3], [0, 0, 0, 0]])
>>> res = quadratic_assignment(A, B)
>>> print(res)
 fun: 3260
 col_ind: [0 3 2 1]
 nit: 9 

查看col_indfun 之间的关系,使用col_ind 形成找到的最佳排列矩阵,然后评估目标函数 (f(P) = trace(A^T P B P^T )).

>>> perm = res['col_ind']
>>> P = np.eye(len(A), dtype=int)[perm]
>>> fun = np.trace(A.T @ P @ B @ P.T)
>>> print(fun)
3260 

或者,为了避免显式构造排列矩阵,直接对距离矩阵的行和列进行排列。

>>> fun = np.trace(A.T @ B[perm][:, perm])
>>> print(fun)
3260 

尽管一般情况下不能保证,quadratic_assignment 恰好找到了全局最优解。

>>> from itertools import permutations
>>> perm_opt, fun_opt = None, np.inf
>>> for perm in permutations([0, 1, 2, 3]):
...     perm = np.array(perm)
...     fun = np.trace(A.T @ B[perm][:, perm])
...     if fun < fun_opt:
...         fun_opt, perm_opt = fun, perm
>>> print(np.array_equal(perm_opt, res['col_ind']))
True 

这是一个例子,其中默认方法‘faq’ 找不到全局最优解。

>>> A = np.array([[0, 5, 8, 6], [5, 0, 5, 1],
...               [8, 5, 0, 2], [6, 1, 2, 0]])
>>> B = np.array([[0, 1, 8, 4], [1, 0, 5, 2],
...               [8, 5, 0, 5], [4, 2, 5, 0]])
>>> res = quadratic_assignment(A, B)
>>> print(res)
 fun: 178
 col_ind: [1 0 3 2]
 nit: 13 

如果精度很重要,请考虑使用‘2opt’ 来优化解决方案。

>>> guess = np.array([np.arange(len(A)), res.col_ind]).T
>>> res = quadratic_assignment(A, B, method="2opt",
...                            options = {'partial_guess': guess})
>>> print(res)
 fun: 176
 col_ind: [1 2 3 0]
 nit: 17 

scipy.optimize.approx_fprime

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.approx_fprime.html#scipy.optimize.approx_fprime

scipy.optimize.approx_fprime(xk, f, epsilon=1.4901161193847656e-08, *args)

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

如果函数从(Rn)映射到(Rm),其导数形成一个称为雅可比矩阵的 m-by-n 矩阵,其中元素((i, j))是f[i]xk[j]的偏导数。

参数:

xkarray_like

要确定f的梯度的坐标向量。

fcallable

要估计其导数的函数。具有签名f(xk, *args)的函数,其中xk是形状为 1-D 数组的参数,args是一个元组,包含完全指定函数所需的任何其他固定参数。传递给该函数的参数xk是形状为(n,)的 ndarray(即使 n=1 也不是标量)。它必须返回形状为(m,)的类似 1-D 数组或标量。

从版本 1.9.0 开始更改:f现在能够返回类似 1-D 数组的值,其中估计了((m, n))雅可比矩阵。

epsilon,可选

用于确定函数梯度的xk的增量。如果是标量,则对所有偏导数使用相同的有限差分增量。如果是数组,则应该包含xk的每个元素的一个值。默认为sqrt(np.finfo(float).eps),大约是 1.49e-08。

*argsargs,可选

传递给f的其他参数。

返回:

jacndarray

fxk的偏导数。

另请参见

check_grad

检查梯度函数相对于 approx_fprime 的正确性。

注意

函数梯度由前向有限差分公式确定:

 f(xk[i] + epsilon[i]) - f(xk[i])
f'[i] = ---------------------------------
                    epsilon[i] 

示例

>>> import numpy as np
>>> from scipy import optimize
>>> def func(x, c0, c1):
...     "Coordinate vector `x` should be an array of size two."
...     return c0 * x[0]**2 + c1*x[1]**2 
>>> x = np.ones(2)
>>> c0, c1 = (1, 200)
>>> eps = np.sqrt(np.finfo(float).eps)
>>> optimize.approx_fprime(x, func, [eps, np.sqrt(200) * eps], c0, c1)
array([   2\.        ,  400.00004198]) 

scipy.optimize.check_grad

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.check_grad.html#scipy.optimize.check_grad

scipy.optimize.check_grad(func, grad, x0, *args, epsilon=1.4901161193847656e-08, direction='all', seed=None)

通过将其与梯度的(前向)有限差逼近比较来检查梯度函数的正确性。

参数:

funccallable func(x0, *args)

要检查其导数的函数。

gradcallable grad(x0, *args)

func的雅可比矩阵。

x0ndarray

检查 grad 是否与使用 func 的前向差分逼近的梯度一致的点。

args*args, optional

传递给 funcgrad 的额外参数。

epsilonfloat, optional

用于有限差逼近的步长大小。默认为 sqrt(np.finfo(float).eps),约为 1.49e-08。

directionstr, optional

如果设为 'random',则使用沿随机向量的梯度来检查 grad 是否与使用 func 的前向差分逼近一致。默认情况下为 'all',此时考虑所有的单热方向向量以检查 grad。如果 func 是矢量值函数,则只能使用 'all'

seed{None, int, numpy.random.Generator, numpy.random.RandomState}, optional

如果 seed 为 None(或 np.random),则使用numpy.random.RandomState 单例。如果 seed 是整数,则使用新的 RandomState 实例,并以 seed 为种子。如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。指定 seed 可以重现此函数的返回值。使用此种子生成的随机数影响计算梯度的随机向量。注意当 direction 参数设置为 ‘random’ 时才使用 seed

返回:

errfloat

两个向量之间差的平方和的平方根(即 2-范数),即 grad(x0, *args) 和在点 x0 使用 func 的有限差逼近 grad 的差异。

另请参见

approx_fprime

示例

>>> import numpy as np
>>> def func(x):
...     return x[0]**2 - 0.5 * x[1]**3
>>> def grad(x):
...     return [2 * x[0], -1.5 * x[1]**2]
>>> from scipy.optimize import check_grad
>>> check_grad(func, grad, [1.5, -1.5])
2.9802322387695312e-08  # may vary
>>> rng = np.random.default_rng()
>>> check_grad(func, grad, [1.5, -1.5],
...             direction='random', seed=rng)
2.9802322387695312e-08 

scipy.optimize.bracket

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.bracket.html#scipy.optimize.bracket

scipy.optimize.bracket(func, xa=0.0, xb=1.0, args=(), grow_limit=110.0, maxiter=1000)

确定函数的最小值。

给定一个函数和不同的初始点,沿着向下的方向(由初始点定义)搜索并返回三个括号内的函数最小值点。

参数:

funccallable f(x,*args)

要最小化的目标函数。

xa, xbfloat, optional

初始点。默认xa为 0.0,xb为 1.0。局部最小值不一定包含在此区间内。

argstuple, optional

附加参数(如果存在),传递给func

grow_limitfloat, optional

最大生长限制。默认为 110.0

maxiterint, optional

要执行的最大迭代次数。默认为 1000。

返回:

xa, xb, xcfloat

括号的最终点。

fa, fb, fcfloat

目标函数在括号点处的值。

funcallsint

执行的函数评估数量。

引发:

BracketError

如果在算法终止前未找到有效的括号。请参阅有效括号的条件说明。

注释

算法尝试找到三个严格排序的点(即 (x_a < x_b < x_c) 或 (x_c < x_b < x_a)),满足 (f(x_b) ≤ f(x_a)) 和 (f(x_b) ≤ f(x_c)) 的条件之一必须严格满足,所有 (x_i) 必须是有限的。

示例

此函数可以找到函数的向下凸区域:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.optimize import bracket
>>> def f(x):
...     return 10*x**2 + 3*x + 5
>>> x = np.linspace(-2, 2)
>>> y = f(x)
>>> init_xa, init_xb = 0.1, 1
>>> xa, xb, xc, fa, fb, fc, funcalls = bracket(f, xa=init_xa, xb=init_xb)
>>> plt.axvline(x=init_xa, color="k", linestyle="--")
>>> plt.axvline(x=init_xb, color="k", linestyle="--")
>>> plt.plot(x, y, "-k")
>>> plt.plot(xa, fa, "bx")
>>> plt.plot(xb, fb, "rx")
>>> plt.plot(xc, fc, "bx")
>>> plt.show() 

../../_images/scipy-optimize-bracket-1_00_00.png

请注意,初始点都在最小值的右侧,并且第三个点是在“向下”的方向找到的:函数看起来在减少的方向(向左)。最终点是严格排序的,中间点的函数值小于端点的函数值;因此,最小值必须位于括号内。

scipy.optimize.line_search

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.line_search.html#scipy.optimize.line_search

scipy.optimize.line_search(f, myfprime, xk, pk, gfk=None, old_fval=None, old_old_fval=None, args=(), c1=0.0001, c2=0.9, amax=None, extra_condition=None, maxiter=10)

找到满足强 Wolfe 条件的 alpha。

参数:

fcallable f(x,*args)

目标函数。

myfprimecallable f’(x,*args)

目标函数梯度。

xkndarray

起始点。

pkndarray

搜索方向。搜索方向必须是算法收敛的下降方向。

gfkndarray,可选

x=xk 处的梯度值(xk 为当前参数估计)。如果省略,则将重新计算。

old_fvalfloat,可选

x=xk 处的函数值。如果省略,则将重新计算。

old_old_fvalfloat,可选

x=xk 之前点的函数值。

argstuple,可选

传递给目标函数的额外参数。

c1float,可选

Armijo 条件规则的参数。

c2float,可选

曲率条件规则的参数。

amaxfloat,可选

最大步长

extra_conditioncallable,可选

形如 extra_condition(alpha, x, f, g) 的可调用对象,返回布尔值。参数是建议的步长 alpha 及其相应的 xfg 值。只有在满足强 Wolfe 条件的迭代中才接受 alpha 的值。如果步长的可调用对象返回假,则算法将继续进行新的迭代。只有在满足强 Wolfe 条件的迭代中才会调用该可调用对象。

maxiterint,可选

执行的最大迭代次数。

返回:

alphafloat 或 None

Alpha 使得 x_new = x0 + alpha * pk,如果线搜索算法未收敛,则为 None。

fcint

执行的函数评估次数。

gcint

执行的梯度评估次数。

new_fvalfloat 或 None

新函数值 f(x_new)=f(x0+alpha*pk),如果线搜索算法未收敛,则为 None。

old_fvalfloat

旧函数值 f(x0)

new_slopefloat 或 None

在新值处沿搜索方向的局部斜率 <myfprime(x_new), pk>,如果线搜索算法未收敛,则为 None。

注意事项

使用线搜索算法来强制实施强 Wolfe 条件。参见 Wright 和 Nocedal,《Numerical Optimization》,1999 年,第 59-61 页。

搜索方向 pk 必须是下降方向(例如 -myfprime(xk))以找到满足强 Wolfe 条件的步长。如果搜索方向不是下降方向(例如 myfprime(xk)),则 alphanew_fvalnew_slope 将为 None。

示例

>>> import numpy as np
>>> from scipy.optimize import line_search 

定义了一个目标函数及其梯度。

>>> def obj_func(x):
...     return (x[0])**2+(x[1])**2
>>> def obj_grad(x):
...     return [2*x[0], 2*x[1]] 

我们可以找到满足强 Wolfe 条件的 alpha。

>>> start_point = np.array([1.8, 1.7])
>>> search_gradient = np.array([-1.0, -1.0])
>>> line_search(obj_func, obj_grad, start_point, search_gradient)
(1.0, 2, 1, 1.1300000000000001, 6.13, [1.6, 1.4]) 

scipy.optimize.LbfgsInvHessProduct

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.LbfgsInvHessProduct.html#scipy.optimize.LbfgsInvHessProduct

class scipy.optimize.LbfgsInvHessProduct(*args, **kwargs)

L-BFGS 近似逆海森线性操作器。

该操作器使用 L-BFGS 有限存储逆海森近似,在优化过程中累积的目标函数海森逆的向量与向量的乘积。

本类对象实现了scipy.sparse.linalg.LinearOperator接口。

参数:

skarray_like, shape=(n_corr, n)

n_corr最近的解向量更新数组(见[1])。

ykarray_like, shape=(n_corr, n)

n_corr最近的梯度更新数组(见[1])。

参考文献

[1]

Nocedal, Jorge. “使用有限存储更新拟牛顿矩阵。” 计算数学 35.151 (1980): 773-782.

属性:

H

共轭转置。

T

转置此线性操作器。

方法:

__call__(x) 作为函数调用自身。
adjoint() 共轭转置。
dot(x) 矩阵-矩阵或矩阵-向量乘法。
matmat(X) 矩阵-矩阵乘法。
matvec(x) 矩阵-向量乘法。
rmatmat(X) 共轭矩阵-矩阵乘法。
rmatvec(x) 共轭矩阵-向量乘法。
todense() 返回此操作器的密集数组表示。
transpose() 转置这个线性操作符。
mul

scipy.optimize.HessianUpdateStrategy

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.HessianUpdateStrategy.html#scipy.optimize.HessianUpdateStrategy

class scipy.optimize.HessianUpdateStrategy

实现 Hessian 更新策略的接口。

许多优化方法使用 Hessian(或逆 Hessian)的近似值,如拟牛顿方法 BFGS、SR1、L-BFGS。然而,其中一些近似方法实际上不需要存储整个矩阵,或者可以以非常高效的方式计算内部矩阵与给定向量的乘积。这个类作为优化算法和拟牛顿更新策略之间的抽象接口,允许以尽可能高效的方式存储和更新内部矩阵的实现自由。不同的初始化和更新过程选择会导致不同的拟牛顿策略。

派生类应实现四种方法:initializeupdatedotget_matrix

注意事项

实现此接口的任何类的实例,都可以被方法 minimize 接受,并由兼容的求解器使用,以近似优化算法使用的 Hessian(或逆 Hessian)。

方法

dot(p) 计算内部矩阵与给定向量的乘积。
get_matrix() 返回当前内部矩阵。
initialize(n, approx_type) 初始化内部矩阵。
update(delta_x, delta_grad) 更新内部矩阵。

scipy.optimize.rosen

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.rosen.html#scipy.optimize.rosen

scipy.optimize.rosen(x)

Rosenbrock 函数。

计算的函数是:

sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0) 

参数:

xarray_like

要计算 Rosenbrock 函数的点的 1-D 数组。

返回:

ffloat

Rosenbrock 函数的值。

另请参见

rosen_der, rosen_hess, rosen_hess_prod

示例

>>> import numpy as np
>>> from scipy.optimize import rosen
>>> X = 0.1 * np.arange(10)
>>> rosen(X)
76.56 

对于高维输入,rosen 进行了广播。在下面的示例中,我们使用这一点来绘制二维景观。请注意,rosen_hess 不会以这种方式进行广播。

>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.mplot3d import Axes3D
>>> x = np.linspace(-1, 1, 50)
>>> X, Y = np.meshgrid(x, x)
>>> ax = plt.subplot(111, projection='3d')
>>> ax.plot_surface(X, Y, rosen([X, Y]))
>>> plt.show() 

../../_images/scipy-optimize-rosen-1.png

scipy.optimize.rosen_der

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.rosen_der.html#scipy.optimize.rosen_der

scipy.optimize.rosen_der(x)

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

参数:

xarray_like

1-D 数组,用于计算导数的点。

返回值:

rosen_der(N,) ndarray

Rosenbrock 函数在 x 处的梯度。

另请参见:

rosen, rosen_hess, rosen_hess_prod

示例:

>>> import numpy as np
>>> from scipy.optimize import rosen_der
>>> X = 0.1 * np.arange(9)
>>> rosen_der(X)
array([ -2\. ,  10.6,  15.6,  13.4,   6.4,  -3\. , -12.4, -19.4,  62\. ]) 

scipy.optimize.rosen_hess

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.rosen_hess.html#scipy.optimize.rosen_hess

scipy.optimize.rosen_hess(x)

Rosenbrock 函数的黑塞矩阵。

参数:

xarray_like

要计算黑塞矩阵的点的一维数组。

返回值:

rosen_hessndarray

Rosenbrock 函数在 x 处的黑塞矩阵。

参见

rosen, rosen_der, rosen_hess_prod

示例

>>> import numpy as np
>>> from scipy.optimize import rosen_hess
>>> X = 0.1 * np.arange(4)
>>> rosen_hess(X)
array([[-38.,   0.,   0.,   0.],
 [  0., 134., -40.,   0.],
 [  0., -40., 130., -80.],
 [  0.,   0., -80., 200.]]) 

scipy.optimize.rosen_hess_prod

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.rosen_hess_prod.html#scipy.optimize.rosen_hess_prod

scipy.optimize.rosen_hess_prod(x, p)

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

参数:

x 数组样式

1-D 点数组,其中将计算 Hessian 矩阵。

p 数组样式

1-D 数组,将与 Hessian 矩阵相乘的向量。

返回:

rosen_hess_prod ndarray

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

另请参阅

rosen, rosen_der, rosen_hess

示例

>>> import numpy as np
>>> from scipy.optimize import rosen_hess_prod
>>> X = 0.1 * np.arange(9)
>>> p = 0.5 * np.arange(9)
>>> rosen_hess_prod(X, p)
array([  -0.,   27.,  -10.,  -95., -192., -265., -278., -195., -180.]) 

scipy.optimize.fmin

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin

scipy.optimize.fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, initial_simplex=None)

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

该算法仅使用函数值,不使用导数或二阶导数。

参数:

funccallable func(x,*args)

要最小化的目标函数。

x0ndarray

初始猜测。

argstuple,可选

传递给 func 的额外参数,即f(x,*args)

xtolfloat,可选

在迭代之间可接受的 xopt 中的绝对误差,以收敛为目标。

ftolnumber,可选

在迭代之间 func(xopt)的绝对误差,以收敛为目标。

maxiterint,可选

执行的最大迭代次数。

maxfunnumber,可选

最大函数评估次数。

full_outputbool,可选

如果需要 fopt 和 warnflag 输出,则设置为 True。

dispbool,可选

设置为 True 以打印收敛消息。

retallbool, 可选

设置为 True 以返回每次迭代的解列表。

callbackcallable,可选

在每次迭代后调用,作为 callback(xk),其中 xk 为当前的参数向量。

initial_simplexarray_like,形状为(N + 1, N),可选

初始单纯形。如果提供,则覆盖x0initial_simplex[j,:]应包含单纯形中第 j 个顶点的 N+1 个顶点的坐标,其中 N 是维度。

返回:

xoptndarray

最小化函数的参数。

foptfloat

函数在最小值处的值:fopt = func(xopt)

iterint

执行的迭代次数。

funcallsint

执行的函数调用次数。

warnflagint

1:执行的最大函数评估次数。2:达到的最大迭代次数。

allvecslist

每次迭代的解。

另见

minimize

多元函数最小化算法接口。特别参见‘Nelder-Mead’ 方法

注意

使用 Nelder-Mead 单纯形算法寻找一个或多个变量函数的最小值。

该算法在应用中有着悠久的成功历史。但通常比使用一阶或二阶导数信息的算法慢。在实践中,它在高维问题中表现不佳,并且不适用于最小化复杂函数。此外,目前没有完整的理论描述算法何时会成功收敛到最小值,或者如果成功收敛,收敛速度如何。必须同时满足 ftol 和 xtol 标准以实现收敛。

参考文献

[1]

Nelder, J.A. 和 Mead, R. (1965), “A simplex method for function minimization”, The Computer Journal, 7, pp. 308-313

[2]

Wright, M.H. (1996), “Direct Search Methods: Once Scorned, Now Respectable”, in Numerical Analysis 1995, Proceedings of the 1995 Dundee Biennial Conference in Numerical Analysis, D.F. Griffiths and G.A. Watson (Eds.), Addison Wesley Longman, Harlow, UK, pp. 191-208.

示例

>>> def f(x):
...     return x**2 
>>> from scipy import optimize 
>>> minimum = optimize.fmin(f, 1)
Optimization terminated successfully.
 Current function value: 0.000000
 Iterations: 17
 Function evaluations: 34
>>> minimum[0]
-8.8817841970012523e-16 

scipy.optimize.fmin_powell

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_powell.html#scipy.optimize.fmin_powell

scipy.optimize.fmin_powell(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)

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

此方法仅使用函数值,不使用导数。

参数:

func可调用函数 f(x,*args)

要最小化的目标函数。

x0数组

初始猜测。

args元组,可选

传递给 func 的额外参数。

xtol浮点数,可选

线搜索错误容忍度。

ftol浮点数,可选

func(xopt) 的相对误差,用于收敛。

maxiter整数,可选

执行的最大迭代次数。

maxfun整数,可选

要执行的最大函数评估次数。

full_output布尔值,可选

如果为 True,则返回 foptxidireciterfuncallswarnflag

disp布尔值,可选

如果为 True,则打印收敛信息。

retall布尔值,可选

如果为 True,则返回每次迭代的解列表。

callback可调用,可选

可选的用户提供的函数,在每次迭代后调用。调用方式为 callback(xk),其中 xk 是当前的参数向量。

direc数组,可选

初始拟合步骤和参数顺序设置为 (N, N) 数组,其中 N 是 x0 中拟合参数的数量。默认步长为 1.0,同时拟合所有参数 (np.eye((N, N)))。若要防止初始考虑步骤中的值或更改初始步长,请将其设置为 0 或所需步长在第 M 块的第 J 位置,其中 J 是 x0 中的位置,M 是所需的评估步骤,步骤将按索引顺序进行评估。随着最小化的进行,步长和顺序将自由变化。

返回:

xopt数组

最小化 func 的参数。

fopt数字

在最小值处函数的值:fopt = func(xopt)

direc数组

当前的方向设置。

iter整数

迭代次数。

funcalls整数

执行的函数调用次数。

warnflag整数

整数警告标志:

1:最大函数评估次数。2:最大迭代次数。3:遇到 NaN 结果。4:结果超出提供的边界。

allvecs列表

每次迭代的解列表。

另请参见

minimize

用于多元函数的无约束最小化算法的接口。特别查看‘Powell’方法。

注意事项

使用修改后的 Powell 方法找到 N 个变量的函数的最小值。Powell 方法是一种共轭方向方法。

该算法有两个循环。外部循环仅在内部循环上迭代。内部循环在方向集合中每个当前方向上进行最小化。在内部循环结束时,如果满足某些条件,则舍弃给出最大减少的方向,并用当前估计的 x 与内部循环开始时的估计 x 之间的差异替换。

替换最大增量方向的技术条件是检查

  1. 从该迭代中最大增量方向上无法再获得进一步的增益。

  2. 最大增量方向占内部循环迭代中函数值减少的大部分。

参考文献

Powell M.J.D. (1964) 一种在不计算导数的情况下找到多变量函数最小值的高效方法,计算机学报,7 (2):155-162。

Press W., Teukolsky S.A., Vetterling W.T., and Flannery B.P.: 数值计算方法(任何版本),剑桥大学出版社

示例

>>> def f(x):
...     return x**2 
>>> from scipy import optimize 
>>> minimum = optimize.fmin_powell(f, -1)
Optimization terminated successfully.
 Current function value: 0.000000
 Iterations: 2
 Function evaluations: 16
>>> minimum
array(0.0) 

scipy.optimize.fmin_cg

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_cg.html#scipy.optimize.fmin_cg

scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None, c1=0.0001, c2=0.4)

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

参数:

fcallable,f(x, *args)

要最小化的目标函数。这里x必须是要在搜索最小值时更改的变量的 1-D 数组,argsf的其他(固定)参数。

x0ndarray

xopt的用户提供的初始估计值,即x的最优值。必须是值的 1-D 数组。

fprimecallable,fprime(x, *args),可选

返回fx处的梯度的函数。这里xargs如上所述为f。返回的值必须是 1-D 数组。默认为 None,此时数值上近似梯度(见下面的epsilon)。

argstuple,可选

传递给ffprime的参数值。每当需要额外的固定参数完全指定ffprime函数时,必须提供。

gtolfloat,可选

当梯度的范数小于gtol时停止。

normfloat,可选

用于梯度范数的顺序(-np.inf是最小值,np.inf是最大值)。

epsilonfloat 或 ndarray,可选

fprime被数值近似时使用的步长。可以是标量或 1-D 数组。默认为sqrt(eps),其中 eps 是浮点数机器精度。通常sqrt(eps)约为 1.5e-8。

maxiterint,可选

要执行的最大迭代次数。默认为200 * len(x0)

full_outputbool,可选

如果为 True,则除了xopt之外,还返回foptfunc_callsgrad_callswarnflag。有关可选返回值的详细信息,请参见下面的 Returns 部分。

dispbool,可选

如果为 True,则返回一个收敛消息,然后是xopt

retallbool,可选

如果为 True,则将每次迭代的结果添加到返回值中。

callbackcallable,可选

一个可选的用户提供的函数,在每次迭代后调用。以callback(xk)的形式调用,其中xkx0的当前值。

c1float,默认值:1e-4

Armijo 条件规则的参数。

c2float,默认值:0.4

曲率条件规则的参数。

返回:

xoptndarray

最小化 f 的参数,即f(xopt) == fopt

foptfloat,可选

找到的最小值,f(xopt)。仅当full_output为 True 时返回。

func_callsint,可选

进行的函数调用次数。仅当full_output为 True 时返回。

grad_callsint,可选

进行的梯度调用次数。仅当full_output为 True 时返回。

warnflagint,可选

警告状态的整数值,仅当full_output为 True 时返回。

0:成功。

1:超过了最大迭代次数。

2:梯度和/或函数调用未更改。可能表示

即精度丢失,即例程未收敛。

3:遇到 NaN 结果。

allvecs 是一个 ndarray 的列表,可选

数组列表,包含每次迭代的结果。仅在 retall 为 True 时返回。

另请参见

minimize

scipy.optimize 的所有算法,无论是多变量函数的无约束还是有约束最小化,都有一个共同的接口。它提供了一种通过指定 method='CG' 来调用 fmin_cg 的替代方式。

注意事项

此共轭梯度算法基于 Polak 和 Ribiere 的算法 [1]

共轭梯度方法在以下情况下表现更好:

  1. f 有一个唯一的全局最小点,并且没有局部最小值或其他静止点,

  2. f 至少在局部范围内可以被变量的二次函数合理逼近,

  3. f 是连续的,并且具有连续的梯度,

  4. fprime 不应过大,例如其范数应小于 1000,

  5. 初始猜测 x0 应该足够接近 f 的全局最小点 xopt

参数 c1c2 必须满足 0 < c1 < c2 < 1

参考文献

[1]

Wright & Nocedal,《数值优化》,1999 年,第 120-122 页。

示例

示例 1:寻找给定参数值和初始猜测 (u, v) = (0, 0) 下表达式 a*u**2 + b*u*v + c*v**2 + d*u + e*v + f 的最小值。

>>> import numpy as np
>>> args = (2, 3, 7, 8, 9, 10)  # parameter values
>>> def f(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f
>>> def gradf(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     gu = 2*a*u + b*v + d     # u-component of the gradient
...     gv = b*u + 2*c*v + e     # v-component of the gradient
...     return np.asarray((gu, gv))
>>> x0 = np.asarray((0, 0))  # Initial guess.
>>> from scipy import optimize
>>> res1 = optimize.fmin_cg(f, x0, fprime=gradf, args=args)
Optimization terminated successfully.
 Current function value: 1.617021
 Iterations: 4
 Function evaluations: 8
 Gradient evaluations: 8
>>> res1
array([-1.80851064, -0.25531915]) 

示例 2:使用 minimize 函数解决相同问题。(myopts 字典显示所有可用选项,实际应用中通常只需要非默认值。返回值将是一个字典。)

>>> opts = {'maxiter' : None,    # default value.
...         'disp' : True,    # non-default value.
...         'gtol' : 1e-5,    # default value.
...         'norm' : np.inf,  # default value.
...         'eps' : 1.4901161193847656e-08}  # default value.
>>> res2 = optimize.minimize(f, x0, jac=gradf, args=args,
...                          method='CG', options=opts)
Optimization terminated successfully.
 Current function value: 1.617021
 Iterations: 4
 Function evaluations: 8
 Gradient evaluations: 8
>>> res2.x  # minimum found
array([-1.80851064, -0.25531915]) 

scipy.optimize.fmin_bfgs

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_bfgs.html#scipy.optimize.fmin_bfgs

scipy.optimize.fmin_bfgs(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None, xrtol=0, c1=0.0001, c2=0.9, hess_inv0=None)

使用 BFGS 算法最小化函数。

参数:

f可调用函数 f(x,*args)

要最小化的目标函数。

x0ndarray

初始猜测,形状为 (n,)

fprime可调用函数 f'(x,*args),可选

f 的梯度。

args元组,可选

传递给 f 和 fprime 的额外参数。

gtol浮点数,可选

如果梯度范数小于 gtol,则成功终止。

norm浮点数,可选

范数的顺序(Inf 为最大,-Inf 为最小)

epsilon整数或 ndarray,可选

如果 fprime 是近似的,则使用此值作为步长。

callback可调用对象,可选

每次迭代后调用的可选用户提供的函数。调用方式为 callback(xk),其中 xk 是当前的参数向量。

maxiter整数,可选

要执行的最大迭代次数。

full_output布尔值,可选

如果为 True,则除了 xopt 外还返回 foptfunc_callsgrad_callswarnflag

disp布尔值,可选

如果为 True,则打印收敛消息。

retall布尔值,可选

如果为 True,则返回每次迭代的结果列表。

xrtol浮点数,默认值:0

x 的相对容差。如果步长小于 xk * xrtol,其中 xk 是当前的参数向量,则成功终止。

c1浮点数,默认值:1e-4

用于 Armijo 条件规则的参数。

c2浮点数,默认值:0.9

曲率条件规则的参数。

hess_inv0None 或 ndarray,可选``

初始逆海森估计,形状为 (n, n)。如果为 None(默认),则使用单位矩阵。

返回:

xoptndarray

最小化函数 f 的参数,即 f(xopt) == fopt

fopt浮点数

最小值。

goptndarray

最小值处的梯度值,即 f’(xopt),应接近 0。

Boptndarray

f’’(xopt) 的倒数值,即逆海森矩阵。

func_calls整数

函数调用数。

grad_calls整数

进行的梯度调用数。

warnflag整数

1:超过最大迭代次数。2:梯度和/或函数调用未更改。3:遇到 NaN 结果。

allvecs列表

xopt 在每次迭代时的值。仅在 retall 为 True 时返回。

另请参见

最小化

多变量函数最小化算法的接口。特别是看 method='BFGS'

注意

优化函数 f,其梯度由 fprime 给出,使用 Broyden、Fletcher、Goldfarb 和 Shanno(BFGS)的拟牛顿方法。

参数 c1c2 必须满足 0 < c1 < c2 < 1

参考

Wright 和 Nocedal,《数值优化》,1999 年,第 198 页。

示例

>>> import numpy as np
>>> from scipy.optimize import fmin_bfgs
>>> def quadratic_cost(x, Q):
...     return x @ Q @ x
...
>>> x0 = np.array([-3, -4])
>>> cost_weight =  np.diag([1., 10.])
>>> # Note that a trailing comma is necessary for a tuple with single element
>>> fmin_bfgs(quadratic_cost, x0, args=(cost_weight,))
Optimization terminated successfully.
 Current function value: 0.000000
 Iterations: 7                   # may vary
 Function evaluations: 24        # may vary
 Gradient evaluations: 8         # may vary
array([ 2.85169950e-06, -4.61820139e-07]) 
>>> def quadratic_cost_grad(x, Q):
...     return 2 * Q @ x
...
>>> fmin_bfgs(quadratic_cost, x0, quadratic_cost_grad, args=(cost_weight,))
Optimization terminated successfully.
 Current function value: 0.000000
 Iterations: 7
 Function evaluations: 8
 Gradient evaluations: 8
array([ 2.85916637e-06, -4.54371951e-07]) 

scipy.optimize.fmin_ncg

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_ncg.html#scipy.optimize.fmin_ncg

scipy.optimize.fmin_ncg(f, x0, fprime, fhess_p=None, fhess=None, args=(), avextol=1e-05, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None, c1=0.0001, c2=0.9)

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

参数:

fcallable f(x, *args)

要最小化的目标函数。

x0ndarray

初始猜测。

fprimecallable f'(x, *args)

f 的梯度。

fhess_pcallable fhess_p(x, p, *args), optional

计算 f 的 Hessian 矩阵乘以任意向量 p 的函数。

fhesscallable fhess(x, *args), optional

计算 f 的 Hessian 矩阵的函数。

argstuple, optional

传递给 f、fprime、fhess_p 和 fhess 的额外参数(这些函数的所有额外参数相同)。

epsilonfloat 或 ndarray, optional

如果 fhess 是近似的,则使用此值作为步长大小。

callbackcallable, optional

每次迭代后调用的可选用户提供函数。作为 callback(xk)调用,其中 xk 是当前参数向量。

avextolfloat, optional

当最小化器中的平均相对误差低于此值时,假定收敛。

maxiterint, optional

执行的最大迭代次数。

full_outputbool, optional

如果为 True,则返回可选的输出。

dispbool, optional

如果为 True,则打印收敛消息。

retallbool, optional

如果为 True,则返回每次迭代的结果列表。

c1float,默认值:1e-4

Armijo 条件规则的参数。

c2float,默认值:0.9

曲率条件规则的参数

返回:

xoptndarray

使 f 最小化的参数,即f(xopt) == fopt

foptfloat

函数在 xopt 处的值,即fopt = f(xopt)

fcallsint

调用的函数次数。

gcallsint

调用的梯度次数。

hcallsint

调用黑塞矩阵的次数。

warnflagint

算法生成的警告。1:超过最大迭代次数。2:线搜索失败(精度丢失)。3:遇到 NaN 结果。

allvecslist

每次迭代的结果,如果 retall 为 True(见下文)。

另请参阅

minimize

用于多元函数最小化算法的接口。特别查看‘Newton-CG’method

注意事项

只需给出fhess_pfhess中的一个。如果提供了fhess,则将忽略fhess_p。如果未提供fhessfhess_p,则将使用fprime上的有限差分近似计算 Hessian 乘积。fhess_p必须计算任意向量的 Hessian 乘积。如果未给出,将使用fprime上的有限差分计算它。

Newton-CG 方法也称为截断 Newton 方法。此函数与 scipy.optimize.fmin_tnc 不同,因为

  1. scipy.optimize.fmin_ncg 是纯用 Python 和 NumPy 编写的。

    scipy 同时调用了 scipy.optimize.fmin_tnc 来调用一个 C 函数。

  2. scipy.optimize.fmin_ncg 仅适用于无约束最小化。

    scipy.optimize.fmin_tnc 则适用于无约束最小化或者箱约束最小化。(箱约束为每个变量分别给出下限和上限。)

参数 c1c2 必须满足 0 < c1 < c2 < 1

参考文献

Wright & Nocedal,《数值优化》,1999 年,第 140 页。

scipy.optimize.fmin_l_bfgs_b

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_l_bfgs_b.html#scipy.optimize.fmin_l_bfgs_b

scipy.optimize.fmin_l_bfgs_b(func, x0, fprime=None, args=(), approx_grad=0, bounds=None, m=10, factr=10000000.0, pgtol=1e-05, epsilon=1e-08, iprint=-1, maxfun=15000, maxiter=15000, disp=None, callback=None, maxls=20)

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

参数:

funccallable f(x,*args)

要最小化的函数。

x0ndarray

初始猜测。

fprimecallable fprime(x,*args),可选

func的梯度。如果为 None,则func返回函数值和梯度(f, g = func(x, *args)),除非approx_grad为 True,在这种情况下func仅返回f

args序列,可选

传递给funcfprime的参数。

approx_grad布尔值,可选

是否数值近似梯度(此时func仅返回函数值)。

bounds列表,可选

对于 x 中每个元素的(min, max)对,定义该参数的边界。当该方向上没有边界时使用 None 或+-inf。

m整数,可选

用于定义有限内存矩阵的最大变量度量修正数。(有限内存 BFGS 方法不存储完整的 Hessian 矩阵,而是使用这么多项的近似值。)

factr浮点数,可选

(f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr * eps时,迭代停止,其中eps是代码自动生成的机器精度。factr的典型值为:低精度为 1e12;中等精度为 1e7;极高精度为 10.0。请参见注释以了解与ftol的关系,后者由scipy.optimize.minimize接口暴露给 L-BFGS-B,而不是factr

pgtol浮点数,可选

max{|proj g_i | i = 1, ..., n} <= pgtol时,迭代将停止,其中proj g_i是投影梯度的第 i 个分量。

epsilon浮点数,可选

approx_grad为 True 时使用的步长,用于数值计算梯度。

iprint整数,可选

控制输出频率。iprint < 0 表示无输出;iprint = 0 仅在最后一次迭代打印一行;0 < iprint < 99 每 iprint 次迭代还打印 f 和|proj g|iprint = 99 每次迭代都打印详细信息,除了 n-向量;iprint = 100 还打印活跃集的变化和最终 x;iprint > 100 每次迭代都打印详细信息,包括 x 和 g。

disp整数,可选

如果为零,则没有输出。如果为正数,则覆盖iprint(即iprintdisp的值)。

maxfun整数,可选

最大函数评估次数。请注意,由于通过数值微分计算梯度,此函数可能会违反限制。

maxiter整数,可选

最大迭代次数。

callbackcallable,可选

在每次迭代后调用,作为callback(xk),其中xk是当前参数向量。

maxlsint,可选

最大线搜索步骤数(每次迭代)。默认为 20。

返回:

xarray_like

最小值的估计位置。

ffloat

func 在最小值处的值。

ddict

信息字典。

  • d[‘warnflag’] 是

    • 如果收敛则为 0,

    • 如果函数评估或迭代次数过多则为 1,

    • 如果由于其他原因停止,则为 2,具体原因见 d[‘task’]

  • d[‘grad’] 是最小值处的梯度(应该接近 0)。

  • d[‘funcalls’] 是进行的函数调用次数。

  • d[‘nit’] 是迭代次数。

另见

minimize

多变量函数的最小化算法接口。特别查看 ‘L-BFGS-B’ 方法。请注意,ftol 选项通过该接口提供,而 factr 则通过此接口提供,其中 factr 是将默认机器浮点精度乘以以计算 ftol 的因子:ftol = factr * numpy.finfo(float).eps

注意

L-BFGS-B 的许可证(FORTRAN 代码):

此处包含的版本(Fortran 代码)为 3.0(2011 年 4 月 25 日发布)。由 Ciyou Zhu、Richard Byrd 和 Jorge Nocedal 编写 nocedal@ece.nwu.edu。其使用条件如下:

本软件可自由使用,但我们期望所有使用该软件的工作或商业产品至少引用下列参考文献中的一篇。本软件根据 BSD 许可证发布。

参考文献

  • R. H. Byrd, P. Lu 和 J. Nocedal。有界约束优化的有限内存算法(1995),SIAM 科学与统计计算杂志,16,5,第 1190-1208 页。

  • C. Zhu, R. H. Byrd 和 J. Nocedal。L-BFGS-B:算法 778:大规模有界约束优化的 FORTRAN 例程(1997),ACM 数学软件交易,23,4,第 550 - 560 页。

  • J.L. Morales 和 J. Nocedal。L-BFGS-B:关于算法 778 的注记:大规模有界约束优化的 FORTRAN 例程(2011),ACM 数学软件交易,38,1。

scipy.optimize.fmin_tnc

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_tnc.html#scipy.optimize.fmin_tnc

scipy.optimize.fmin_tnc(func, x0, fprime=None, args=(), approx_grad=0, bounds=None, epsilon=1e-08, scale=None, offset=None, messages=15, maxCGit=-1, maxfun=None, eta=-1, stepmx=0, accuracy=0, fmin=0, ftol=-1, xtol=-1, pgtol=-1, rescale=-1, disp=None, callback=None)

使用截断牛顿算法中的梯度信息最小化受限变量的函数。此方法包装了算法的 C 实现。

参数:

funccallable func(x, *args)

要最小化的函数。必须执行以下操作之一:

  1. 返回 f 和 g,其中 f 是函数的值,g 是其梯度(一个浮点数列表)。

  2. 返回函数值,但单独提供梯度函数作为 fprime

  3. 返回函数值并设置 approx_grad=True

如果函数返回 None,则最小化过程中止。

x0array_like

最小值的初始估计。

fprimecallable fprime(x, *args),可选

func 的梯度。如果为 None,则 func 必须返回函数值和梯度 (f,g = func(x, *args)),或者 approx_grad 必须为 True。

args元组,可选

传递给函数的参数。

approx_grad布尔值,可选

如果为真,则通过数值方法近似梯度。

bounds列表,可选

x0 中每个元素的(最小值,最大值)对,定义该参数的边界。当某个方向没有边界时,使用 None 或 +/-inf。

epsilon浮点数,可选

如果 approx_grad 为 True,则使用有限差分逼近中的步长。

scalearray_like,可选

应用于每个变量的缩放因子。如果为 None,则对于区间边界变量,因子是上限-下限,对于其他变量,因子是 1+|x|。默认为 None。

offsetarray_like,可选

从每个变量中减去的值。如果为 None,则对于区间边界变量,偏移量为 (上限+下限)/2,对于其他变量,偏移量为 x。

messages整数,可选

位掩码用于选择在最小化过程中显示的消息,值在 MSGS 字典中定义。默认为 MGS_ALL。

disp整数,可选

消息的整数界面。0 = 无消息,5 = 所有消息

maxCGit整数,可选

每次主迭代中的 Hessian*vector 评估的最大次数。如果 maxCGit == 0,则选择的方向为 -gradient;如果 maxCGit < 0,则 maxCGit 被设置为 max(1,min(50,n/2))。默认为 -1。

maxfun整数,可选

最大函数评估次数。如果为 None,则 maxfun 被设置为 max(100, 10*len(x0))。默认为 None。请注意,由于通过数值微分评估梯度,此函数可能会违反限制。

eta浮点数,可选

线搜索的严重性。如果 < 0 或 > 1,则设置为 0.25。默认为 -1。

stepmx浮点数,可选

线搜索的最大步长。可能在调用过程中增加。如果太小,则设置为 10.0。默认为 0。

accuracy浮点数,可选

有限差分计算的相对精度。如果 <= 机器精度,则设置为 sqrt(机器精度)。默认为 0。

fmin浮点数,可选

最小函数值估计。默认为 0。

ftol浮点数,可选

在停止标准中的 f 值的精度目标。如果 ftol < 0.0,则将 ftol 设置为 0.0,默认为-1。

xtolfloat,可选

在停止标准中的 x 值的精度目标(应用 x 缩放因子后)。如果 xtol < 0.0,则将 xtol 设置为 sqrt(machine_precision)。默认为-1。

pgtolfloat,可选

在停止标准中的投影梯度值的精度目标(应用 x 缩放因子后)。如果 pgtol < 0.0,则将 pgtol 设置为 1e-2 * sqrt(accuracy)。不建议将其设置为 0.0。默认为-1。

rescalefloat,可选

触发 f 值重新缩放的使用的缩放因子(以 log10 为单位)。如果为 0,则在每次迭代时重新缩放。如果为大值,则永不重新缩放。如果< 0,则将 rescale 设置为 1.3。

callbackcallable,可选

在每次迭代后调用,作为 callback(xk),其中 xk 为当前参数向量。

返回:

xndarray

解决方案。

nfevalint

函数评估次数。

rcint

返回代码,请参见下文

亦可参见

minimize

多元函数最小化算法的接口。特别是请参见‘TNC’ 方法

注释

底层算法为截断牛顿法,也称为牛顿共轭梯度。该方法与 scipy.optimize.fmin_ncg 不同之处在于

  1. 它包装了该算法的 C 实现

  2. 它允许为每个变量设定上下界。

该算法通过确定下降方向来整合约束条件,就像在无约束的截断牛顿法中一样,但从不采取足以离开可行 x 空间的步长。该算法跟踪一组当前活动约束,并在计算最小允许步长时忽略它们。(与活动约束相关联的 x 被保持不变。)如果最大允许步长为零,则添加新约束。在每次迭代结束时,可能会被认为不再活动并删除一个约束。如果当前活动但变量梯度向内从约束点,那么约束被认为不再活动。具体删除的约束是与不再活动约束的最大索引变量相关联的约束。

返回代码如下定义:

-1 : Infeasible (lower bound > upper bound)
 0 : Local minimum reached (|pg| ~= 0)
 1 : Converged (|f_n-f_(n-1)| ~= 0)
 2 : Converged (|x_n-x_(n-1)| ~= 0)
 3 : Max. number of function evaluations reached
 4 : Linear search failed
 5 : All lower bounds are equal to the upper bounds
 6 : Unable to progress
 7 : User requested end of minimization 

参考文献

Wright S., Nocedal J.(2006 年),‘Numerical Optimization’

Nash S.G.(1984 年),“通过 Lanczos 方法的牛顿型最小化”,SIAM 数值分析期刊 21,pp. 770-778

scipy.optimize.fmin_cobyla

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_cobyla.html#scipy.optimize.fmin_cobyla

scipy.optimize.fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0, rhoend=0.0001, maxfun=1000, disp=None, catol=0.0002, *, callback=None)

使用约束优化线性逼近(COBYLA)方法最小化函数。该方法封装了算法的 FORTRAN 实现。

参数:

func可调用对象

要最小化的函数。形式为 func(x, *args)。

x0数组

初始猜测。

cons序列

约束函数;必须全部>=0(如果只有一个约束,则为单个函数)。每个函数将参数 x 作为其第一个参数,并可以返回单个数字或数字的数组或列表。

args元组,可选

传递给函数的额外参数。

consargs元组,可选

传递给约束函数的额外参数(默认为 None 意味着使用与传递给 func 相同的额外参数)。使用 () 表示无额外参数。

rhobeg浮点数,可选

变量的合理初始更改。

rhoend浮点数,可选

优化中的最终精度(不能完全保证)。这是信任域大小的下界。

disp,可选

控制输出频率;0 表示无输出。

maxfun整数,可选

最大函数评估次数。

catol浮点数,可选

绝对容忍约束违规。

callback可调用对象,可选

在每次迭代后调用,格式为 callback(x),其中 x 是当前参数向量。

返回:

x数组

最小化 f 的参数。

另请参阅

minimize

多元函数最小化算法的界面。特别参见‘COBYLA’ 方法

注:

此算法基于目标函数和每个约束的线性逼近。我们简要描述算法。

假设正在对 k 个变量进行最小化函数。在第 j 次迭代中,算法具有 k+1 点 v_1, …, v_(k+1),一个近似解 x_j,和一个半径 RHO_j。 (即线性加一个常数) 目标函数和约束函数的近似值使得它们在 k+1 点 v_1,.., v_(k+1) 上的函数值与线性逼近一致。这提供了一个要解决的线性程序(其中约束函数的线性逼近被限制为非负)。

然而,线性逼近可能仅在当前单纯形附近是良好的近似,因此线性程序还有进一步的要求,即解决方案,即将成为 x_(j+1),必须在从 x_j 到 RHO_j 的范围内。 RHO_j 只会减少,不会增加。初始 RHO_j 是 rhobeg,最终 RHO_j 是 rhoend。通过这种方式,COBYLA 的迭代表现得像一个信任域算法。

此外,线性程序可能不一致,或者近似可能带来很差的改进。有关这些问题如何解决的详细信息,以及点 v_i 如何更新,请参考下面的源代码或参考资料。

参考资料

Powell M.J.D. (1994), “一种通过线性插值模拟目标和约束函数的直接搜索优化方法”, 在《优化与数值分析进展》中,主编 S. Gomez 和 J-P Hennart,Kluwer Academic(多德雷赫特),pp. 51-67

Powell M.J.D. (1998), “用于优化计算的直接搜索算法”, Acta Numerica 7, 287-336

Powell M.J.D. (2007), “无导数优化算法的一种观点”, 剑桥大学技术报告 DAMTP 2007/NA03

示例

最小化目标函数 f(x,y) = x*y,受限于约束 x2 + y2 < 1 且 y > 0:

>>> def objective(x):
...     return x[0]*x[1]
...
>>> def constr1(x):
...     return 1 - (x[0]**2 + x[1]**2)
...
>>> def constr2(x):
...     return x[1]
...
>>> from scipy.optimize import fmin_cobyla
>>> fmin_cobyla(objective, [0.0, 0.1], [constr1, constr2], rhoend=1e-7)
array([-0.70710685,  0.70710671]) 

精确解是 (-sqrt(2)/2, sqrt(2)/2)。

scipy.optimize.fmin_slsqp

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fmin_slsqp.html#scipy.optimize.fmin_slsqp

scipy.optimize.fmin_slsqp(func, x0, eqcons=(), f_eqcons=None, ieqcons=(), f_ieqcons=None, bounds=(), fprime=None, fprime_eqcons=None, fprime_ieqcons=None, args=(), iter=100, acc=1e-06, iprint=1, disp=None, full_output=0, epsilon=1.4901161193847656e-08, callback=None)

使用顺序最小二乘编程来最小化函数

最初由 Dieter Kraft 实现的 SLSQP 优化子程序的 Python 接口函数。

参数:

func可调用函数f(x,args)*

目标函数。必须返回一个标量。

x0浮点数的 1-D ndarray

独立变量的初始猜测。

eqcons列表,可选

一个长度为 n 的函数列表,使得 eqconsj == 0.0 在成功优化的问题中。

f_eqcons可调用函数f(x,args)*,可选

在成功优化的问题中,返回一个 1-D 数组,其中每个元素必须等于 0.0。如果指定了 f_eqcons,则忽略 eqcons。

ieqcons列表,可选

一个长度为 n 的函数列表,使得在成功优化的问题中,ieqconsj >= 0.0。

f_ieqcons可调用函数f(x,args)*,可选

在成功优化的问题中,返回一个 1-D ndarray,其中每个元素必须大于或等于 0.0。如果指定了 f_ieqcons,则忽略 ieqcons。

bounds列表,可选

一个元组列表,指定每个独立变量的下限和上限[(xl0, xu0),(xl1, xu1),…] 无限值将被解释为大浮点值。

fprime可调用函数f(x,args)*,可选

一个评估 func 的偏导数的函数。

fprime_eqcons可调用函数f(x,args)*,可选

一个形式为*f(x, args)的函数,返回 m 乘 n 的等式约束法线数组。如果未提供,则将近似法线。fprime_eqcons 返回的数组大小应为(len(eqcons), len(x0))。

fprime_ieqcons可调用函数f(x,args)*,可选

一个形式为*f(x, args)的函数,返回 m 乘 n 的不等式约束法线数组。如果未提供,则将近似法线。fprime_ieqcons 返回的数组大小应为(len(ieqcons), len(x0))。

args序列,可选

传递给 func 和 fprime 的额外参数。

iter整数,可选

最大迭代次数。

acc浮点数,可选

请求的精度。

iprint整数,可选

fmin_slsqp的详细输出:

  • iprint <= 0:静默操作

  • iprint == 1:在完成时打印总结(默认)

  • iprint >= 2:打印每次迭代的状态和总结

disp整数,可选

覆盖 iprint 界面(首选)。

full_output布尔值,可选

如果为 False,则仅返回 func 的最小化器(默认)。否则,输出最终的目标函数和总结信息。

epsilon浮点数,可选

有限差分导数估计的步长。

callback可调用函数,可选

在每次迭代后被调用,形式为callback(x),其中x是当前的参数向量。

返回:

out浮点数的 ndarray

func 的最终最小化器。

fx浮点数的 ndarray,如果full_output为真

目标函数的最终值。

int,如果full_output为真

迭代次数。

imodeint,如果full_output为真

优化器的退出模式(见下文)。

smodestring,如果full_output为真

描述优化器退出模式的消息。

另请参阅

minimize

多元函数最小化算法接口。特别查看‘SLSQP’ 方法

注意事项

退出模式定义如下

-1 : Gradient evaluation required (g & a)
 0 : Optimization terminated successfully
 1 : Function evaluation required (f & c)
 2 : More equality constraints than independent variables
 3 : More than 3*n iterations in LSQ subproblem
 4 : Inequality constraints incompatible
 5 : Singular matrix E in LSQ subproblem
 6 : Singular matrix C in LSQ subproblem
 7 : Rank-deficient equality constraint subproblem HFTI
 8 : Positive directional derivative for linesearch
 9 : Iteration limit reached 

举例

示例见教程中。

scipy.optimize.fminbound

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fminbound.html#scipy.optimize.fminbound

scipy.optimize.fminbound(func, x1, x2, args=(), xtol=1e-05, maxfun=500, full_output=0, disp=1)

标量函数的有界最小化。

参数:

funccallable f(x,*args)

要最小化的目标函数(必须接受并返回标量)。

x1, x2float or array scalar

有限优化边界。

argstuple, optional

传递给函数的额外参数。

xtolfloat, optional

收敛容差。

maxfunint, optional

允许的最大函数评估次数。

full_outputbool, optional

如果为 True,则返回可选输出。

dispint, optional

如果非零,则打印消息。

0:无消息打印。1:仅非收敛通知消息。2:也打印收敛消息。3:打印迭代结果。

返回:

xoptndarray

在给定区间内最小化目标函数的参数。

fvalnumber

(可选输出)在最小化器处评估的函数值。

ierrint

(可选输出)错误标志(如果收敛则为 0,如果达到最大函数调用次数则为 1)。

numfuncint

(可选输出)进行的函数调用次数。

另请参见

minimize_scalar

标量单变量函数最小化算法的接口。特别是参见‘Bounded’ 方法

注意

使用 Brent 方法在区间 x1 < xopt < x2 中找到标量函数 func 的局部最小化器。(参见brent 自动括号。)

引用

[1]

Forsythe, G.E., M. A. Malcolm, and C. B. Moler. “数学计算的计算机方法。” Prentice-Hall 自动计算系列 259 (1977).

[2]

Brent, Richard P. 无导数最小化算法。 Courier Corporation, 2013.

示例

fminbound 在给定范围内找到函数的最小化器。以下示例说明此功能。

>>> from scipy import optimize
>>> def f(x):
...     return (x-1)**2
>>> minimizer = optimize.fminbound(f, -4, 4)
>>> minimizer
1.0
>>> minimum = f(minimizer)
>>> minimum
0.0
>>> res = optimize.fminbound(f, 3, 4, full_output=True)
>>> minimizer, fval, ierr, numfunc = res
>>> minimizer
3.000005960860986
>>> minimum = f(minimizer)
>>> minimum, fval
(4.000023843479476, 4.000023843479476) 

scipy.optimize.brent

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.brent.html#scipy.optimize.brent

scipy.optimize.brent(func, args=(), brack=None, tol=1.48e-08, full_output=0, maxiter=500)

给定一个单变量函数和可能的 bracket,返回被孤立到 tol 分数精度的函数的局部最小值。

参数:

func可调用的 f(x,*args)

目标函数。

args元组,可选

额外的参数(如果存在)。

brack元组,可选

要么是满足xa < xb < xcfunc(xb) < func(xa) and  func(xb) < func(xc)的三元组(xa, xb, xc),要么是用于下山搜索的初始点对(xa, xb)(参见scipy.optimize.bracket)。最小化器x不一定满足xa <= x <= xb

tol浮点数,可选

解决方案xopt中可接受的相对误差。

full_output布尔型,可选

如果为真,则返回所有输出参数(xmin、fval、iter、funcalls)。

maxiter整数,可选

解决方案中的最大迭代次数。

返回值:

xminndarray

最优点。

fval浮点数

(可选输出)最优函数值。

iter整数

(可选输出)迭代次数。

funcalls整数

(可选输出)进行的目标函数评估次数。

参见

minimize_scalar

标量单变量函数最小化算法接口。详见特定的“Brent” 方法

注意事项

在可能时使用反向抛物线插值来加速黄金分割法的收敛。

不保证最小值位于brack指定的范围内。参见scipy.optimize.fminbound

示例

我们展示了在brack大小为 2 和 3 时函数的行为。在brack形式为(xa, xb)的情况下,我们可以看到对于给定的值,输出并不一定位于区间(xa, xb)内。

>>> def f(x):
...     return (x-1)**2 
>>> from scipy import optimize 
>>> minimizer = optimize.brent(f, brack=(1, 2))
>>> minimizer
1
>>> res = optimize.brent(f, brack=(-1, 0.5, 2), full_output=True)
>>> xmin, fval, iter, funcalls = res
>>> f(xmin), fval
(0.0, 0.0) 

scipy.optimize.golden

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.golden.html#scipy.optimize.golden

scipy.optimize.golden(func, args=(), brack=None, tol=1.4901161193847656e-08, full_output=0, maxiter=5000)

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

给定一个单变量函数和可能的括号区间,返回函数的最小化器,精确到 tol 的分数精度。

参数:

funccallable func(x,*args)

要最小化的目标函数。

argstuple, optional

如果存在其他参数,则传递给 func。

bracktuple, optional

要么是一个三元组 (xa, xb, xc),其中 xa < xb < xcfunc(xb) < func(xa)func(xb) < func(xc),要么是一对 (xa, xb),用作向下搜索初始点的起始点(参见 scipy.optimize.bracket)。最小化器 x 不一定满足 xa <= x <= xb

tolfloat, optional

x 容差停止准则

full_outputbool, optional

如果为 True,则返回可选输出。

maxiterint

要执行的最大迭代次数。

返回:

xminndarray

最优点。

fvalfloat

(可选输出)最优函数值。

funcallsint

(可选输出)执行的目标函数评估次数。

另请参阅

minimize_scalar

标量单变量函数最小化算法的接口。特别是参见“Golden” 方法

注意事项

使用二分法的类似方法来缩小括号区间。

示例

我们演示了当 brack 的大小分别为 2 和 3 时函数的行为。在 brack 为 (xa, xb) 形式的情况下,我们可以看到对于给定的值,输出不一定在 (xa, xb) 范围内。

>>> def f(x):
...     return (x-1)**2 
>>> from scipy import optimize 
>>> minimizer = optimize.golden(f, brack=(1, 2))
>>> minimizer
1
>>> res = optimize.golden(f, brack=(-1, 0.5, 2), full_output=True)
>>> xmin, fval, funcalls = res
>>> f(xmin), fval
(9.925165290385052e-18, 9.925165290385052e-18) 

scipy.optimize.leastsq

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.leastsq.html#scipy.optimize.leastsq

scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=False, col_deriv=False, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)

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

x = arg min(sum(func(y)**2,axis=0))
         y 

参数:

func:callable

应至少接受一个(可能长度为N的向量)参数,并返回M个浮点数。不能返回 NaN,否则拟合可能失败。M必须大于或等于N

x0:ndarray

最小化的起始估计。

args:tuple,可选

任何额外的参数放在这个元组中传递给func

Dfun:callable,可选

计算横跨行的函数或方法来计算func的雅可比矩阵。如果为None,则将估计雅可比矩阵。

full_output:bool,可选

如果True,返回所有可选输出(而不仅仅是xier)。

col_deriv:bool,可选

如果True,指定雅可比函数计算列方向的导数(更快,因为没有转置操作)。

ftol:float,可选

在平方和的近似解中期望的相对误差。

xtol:float,可选

在近似解中期望的相对误差。

gtol:float,可选

功能向量和雅可比矩阵列之间期望的正交性。

maxfev:int,可选

函数的最大调用次数。如果提供了Dfun,则默认maxfev为 100(N+1),其中 N 是 x0 中的元素数,否则默认maxfev为 200(N+1)。

epsfcn:float,可选

用于确定前向差分法雅可比矩阵适当步长的变量(对于Dfun=None)。通常实际步长将是 sqrt(epsfcn)*x,如果 epsfcn 小于机器精度,则假定相对误差为机器精度的量级。

factor:float,可选

一个参数,确定初始步长界限(factor * || diag * x||)。应在区间(0.1, 100)内。

diag:sequence,可选

作为变量的比例因子的 N 个正数条目。

返回:

x:ndarray

解决方案(或最后一次迭代的结果,对于未成功调用)。

cov_x:ndarray

海森的逆。fjacipvt用于构造参数x中曲率的估计。None 值表示奇异矩阵,这意味着参数x中的曲率在数值上是平坦的。要获取参数x的协方差矩阵,必须将cov_x乘以残差的方差 - 见 curve_fit。仅在full_outputTrue时返回。

infodict:dict

一个包含可选输出的字典,带有以下键:

nfev

函数调用的次数

fvec

在输出处评估的函数

fjac

一次 QR 分解的 R 矩阵的排列,以列存储。与 ipvt 一起,可以近似估计协方差。

ipvt

长度为 N 的整数数组,定义置换矩阵 p,使得 fjacp = qr,其中 r 是上三角矩阵,对角线元素不增加。p 的第 j 列是单位矩阵的第 ipvt(j) 列。

qtf

向量 (transpose(q) * fvec)。

仅当 full_outputTrue 时返回。

mesg 字符串

给出失败原因的字符串消息。仅当 full_outputTrue 时返回。

ier 整数

一个整数标志。如果它等于 1、2、3 或 4,则找到了解决方案。否则,未找到解决方案。无论哪种情况,可选输出变量 ‘mesg’ 提供更多信息。

另请参阅

least_squares

较新的接口用于解决带有变量界限的非线性最小二乘问题。特别查看 method='lm'

注记

“leastsq” 是 MINPACK 的 lmdif 和 lmder 算法的封装。

cov_x 是最小二乘目标函数 Hessian 矩阵的雅可比近似。该近似假定目标函数基于观察到的目标数据 (ydata) 和参数 f(xdata, params) 的差异(非线性函数)。

func(params) = ydata - f(xdata, params) 

使目标函数为

 min   sum((ydata - f(xdata, params))**2, axis=0)
params 

x 总是一个一维数组,无论 x0 的形状如何,或者 x0 是否为标量。

示例

>>> from scipy.optimize import leastsq
>>> def func(x):
...     return 2*(x-3)**2+1
>>> leastsq(func, 0)
(array([2.99999999]), 1) 

scipy.optimize.fsolve

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.fsolve.html#scipy.optimize.fsolve

scipy.optimize.fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-08, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)

查找函数的根。

给定起始估计,返回func(x) = 0(非线性)方程的根。

参数:

funccallable f(x, *args)

一个至少需要一个(可能是向量)参数并返回相同长度值的函数。

x0ndarray

用于func(x) = 0根的起始估计。

argstuple,可选

传递给func的任何额外参数。

fprimecallable f(x, *args),可选

一个计算func雅可比矩阵及其导数的函数。默认情况下,将估计雅可比矩阵。

full_outputbool,可选

如果为 True,则返回可选输出。

col_derivbool,可选

指定雅可比函数是否沿列计算导数(更快,因为没有转置操作)。

xtolfloat,可选

如果两次迭代之间的相对误差最多为xtol,则计算将终止。

maxfevint,可选

函数调用的最大次数。如果为零,则100*(N+1)是最大的,其中 N 是x0中元素的数量。

bandtuple,可选

如果设置为包含雅可比矩阵带内子和超对角线数的二元序列,则认为雅可比矩阵是带状的(仅适用于fprime=None)。

epsfcnfloat,可选

正向差分近似雅可比矩阵的合适步长(对于fprime=None)。如果epsfcn小于机器精度,则假定函数中的相对误差为机器精度的数量级。

factorfloat,可选

确定初始步长边界的参数(factor * || diag * x||)。应在区间(0.1, 100)内。

diagsequence,可选

用作变量的比例因子的正数输入。

返回:

xndarray

解决方案(或对于不成功的调用的最后迭代的结果)。

infodictdict

具有键的可选输出的字典:

nfev

函数调用次数

njev

雅可比调用的次数

fvec

在输出处评估的函数

fjac

正交矩阵 q,由最终近似雅可比矩阵的 QR 分解以列方式存储

r

由相同矩阵的 QR 分解产生的上三角矩阵

qtf

向量(转置(q) * fvec)

ierint

一个整数标志。如果找到解,则设置为 1,否则请参阅mesg获取更多信息。

mesgstr

如果找不到解,则mesg详细说明失败原因。

另请参见

root

多元函数的根查找算法接口。特别是参见method='hybr'

注释

fsolve是 MINPACK 的 hybrd 和 hybrj 算法的包装器。

示例

找出方程组的解:x0*cos(x1) = 4,  x1*x0 - x1 = 5

>>> import numpy as np
>>> from scipy.optimize import fsolve
>>> def func(x):
...     return [x[0] * np.cos(x[1]) - 4,
...             x[1] * x[0] - x[1] - 5]
>>> root = fsolve(func, [1, 1])
>>> root
array([6.50409711, 0.90841421])
>>> np.isclose(func(root), [0.0, 0.0])  # func(root) should be almost 0.0.
array([ True,  True]) 

scipy.optimize.broyden1

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.broyden1.html#scipy.optimize.broyden1

scipy.optimize.broyden1(F, xin, iter=None, alpha=None, reduction_method='restart', max_rank=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

使用 Broyden 的第一个 Jacobian 近似找到函数的根。

此方法也称为“Broyden 的好方法”。

参数:

Ffunction(x) -> f

要查找其根的函数;应接受并返回一个类似数组的对象。

xinarray_like

解的初始猜测

alphafloat, optional

Jacobian 的初始猜测是(-1/alpha)

reduction_methodstr or tuple, optional

用于确保 Broyden 矩阵排名保持低的方法。可以是一个字符串,给出方法的名称,或者是一个元组形式(method, param1, param2, ...),给出方法的名称和额外参数的值。

方法可用:

  • restart: 丢弃所有矩阵列。没有额外参数。
  • simple: 丢弃最老的矩阵列。没有额外参数。
  • svd: 仅保留最重要的 SVD 分量。在进行秩减少时,采用额外参数to_retain,确定要保留的 SVD 分量数量。默认为max_rank - 2

max_rankint, optional

Broyden 矩阵的最大排名。默认为无穷大(即无排名降低)。

iterint, optional

执行的迭代次数。如果省略(默认),则执行所需的迭代次数以满足容差。

verbosebool, optional

在每次迭代时将状态打印到标准输出。

maxiterint, optional

执行的最大迭代次数。如果需要更多次迭代以达到收敛性,将引发NoConvergence

f_tolfloat, optional

相对于残差的最大范数的绝对容差。如果省略,默认为 6e-6。

f_rtolfloat, optional

相对残差的相对容差。如果省略,则不使用。

x_tolfloat, optional

从 Jacobian 近似中确定的绝对最小步长。如果步长小于此值,则优化被视为成功终止。如果省略,则不使用。

x_rtolfloat, optional

相对最小步长。如果省略,则不使用。

tol_normfunction(vector) -> scalar, optional

用于收敛检查的范数。默认为最大范数。

line_search, optional

用于确定由 Jacobian 近似给出的方向中的步长大小的线搜索类型。默认为'armijo'。

callbackfunction, optional

可选的回调函数。每次迭代时调用,callback(x, f)其中x是当前解,f是相应的残差。

返回:

solndarray

包含最终解的数组(与x0具有相似的数组类型)。

引发:

NoConvergence

当未找到解决方案时。

另请参阅

root

多变量函数的根查找算法接口。特别是查看method='broyden1'

注释

此算法实现了逆雅可比拟牛顿更新

[H_+ = H + (dx - H df) dx^\dagger H / ( dx^\dagger H df)]

对应于 Broyden 的第一个雅可比更新

[J_+ = J + (df - J dx) dx^\dagger / dx^\dagger dx]

参考文献

[1]

B.A. van der Rotten,博士论文,"用于解决高维非线性方程组的有限记忆 Broyden 方法"。荷兰莱顿大学数学研究所 (2003)。

web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf

示例

以下函数定义了一个非线性方程组

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以按如下方式获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.broyden1(fun, [0, 0])
>>> sol
array([0.84116396, 0.15883641]) 

scipy.optimize.broyden2

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.broyden2.html#scipy.optimize.broyden2

scipy.optimize.broyden2(F, xin, iter=None, alpha=None, reduction_method='restart', max_rank=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

使用布罗伊登第二个雅可比近似找到函数的根。

此方法也称为“布罗伊登的坏方法”。

参数:

F 函数(x) -> f

求根的函数;应接受并返回一个类似数组的对象。

xin 数组样式

解的初始猜测

alpha 浮点数,可选

雅可比矩阵的初始猜测为(-1/alpha)

reduction_method 字符串或元组,可选

用于确保布罗伊登矩阵秩保持低的方法。可以是一个给出方法名称的字符串,也可以是一个形如(method, param1, param2, ...)的元组,提供方法名称和额外参数的值。

方法可用:

  • restart:丢弃所有矩阵列。没有额外参数。
  • simple:丢弃最旧的矩阵列。没有额外参数。
  • svd:仅保留最显著的奇异值分解组件。带有额外参数to_retain,确定在降秩时保留的奇异值分解组件数量。默认为max_rank - 2

max_rank 整数,可选

布罗伊登矩阵的最大秩。默认为无穷大(即无降秩)。

iter 整数,可选

要执行的迭代次数。如果省略(默认),则执行所需次数以满足公差。

verbose 布尔值,可选

在每次迭代中将状态打印到标准输出。

maxiter 整数,可选

要执行的最大迭代次数。如果需要更多次迭代以满足收敛性,则引发NoConvergence

f_tol 浮点数,可选

残差的绝对容差(在最大范数中)。如果省略,默认为 6e-6。

f_rtol 浮点数,可选

残差的相对容差。如果省略,则不使用。

x_tol 浮点数,可选

绝对最小步长,根据雅可比近似确定。如果步长小于此值,则优化被视为成功终止。如果省略,不使用。

x_rtol 浮点数,可选

相对最小步长。如果省略,不使用。

tol_norm 函数(向量) -> 标量,可选

用于收敛检查的规范。默认为最大范数。

line_search {None, ‘armijo’ (默认), ‘wolfe’},可选

用于确定雅可比近似方向上步长的线搜索类型。默认为‘armijo’。

callback 函数,可选

可选的回调函数。每次迭代时调用为callback(x, f),其中x为当前解,f为相应的残差。

返回:

sol ndarray

包含最终解的数组(与x0类型相似)。

异常:

NoConvergence

未找到解时。

另请参阅

root

多元函数根查找算法的接口。特别查看method='broyden2'

注:

该算法实现了逆雅各比拟牛顿更新

[H_+ = H + (dx - H df) df^\dagger / ( df^\dagger df)]

对应于布罗伊登第二方法。

参考文献

[1]

B.A. van der Rotten 博士论文,“解高维非线性方程组的有限内存布罗伊登方法”。荷兰莱顿大学数学研究所 (2003 年)。

web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf

例子

以下函数定义了一组非线性方程组

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以如下获得一个解决方案。

>>> from scipy import optimize
>>> sol = optimize.broyden2(fun, [0, 0])
>>> sol
array([0.84116365, 0.15883529]) 

scipy.optimize.newton_krylov

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.newton_krylov.html#scipy.optimize.newton_krylov

scipy.optimize.newton_krylov(F, xin, iter=None, rdiff=None, method='lgmres', inner_maxiter=20, inner_M=None, outer_k=10, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

寻找函数的根,使用基于克里洛夫逆雅可比矩阵近似的方法。

该方法适用于解决大规模问题。

参数:

Ffunction(x) -> f

要找根的函数;应接受并返回类似数组的对象。

xinarray_like

解的初始猜测

rdifffloat,可选

在数值微分中使用的相对步长。

methodstr 或可调用对象,可选

用于近似雅可比矩阵的克里洛夫方法。可以是字符串,或者实现与scipy.sparse.linalg中迭代求解器相同接口的函数。如果是字符串,则必须是以下之一:'lgmres''gmres''bicgstab''cgs''minres''tfqmr'

默认为scipy.sparse.linalg.lgmres

inner_maxiterint,可选

传递给“内部”克里洛夫求解器的参数:最大迭代次数。即使未达到指定的容差,迭代也将在 maxiter 步之后停止。

inner_MLinearOperator 或 InverseJacobian

内部克里洛夫迭代的预处理器。注意,您也可以使用逆雅可比矩阵作为(自适应)预处理器。例如,

>>> from scipy.optimize import BroydenFirst, KrylovJacobian
>>> from scipy.optimize import InverseJacobian
>>> jac = BroydenFirst()
>>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac)) 

如果预处理器有一个名为‘update’的方法,它将在每个非线性步骤后被调用,参数为update(x, f),其中x为当前点,f为当前函数值。

outer_kint,可选

在 LGMRES 非线性迭代过程中保留的子空间大小。详见scipy.sparse.linalg.lgmres了解详情。

inner_kwargskwargs

“内部”克里洛夫求解器的关键参数(由method定义)。参数名必须以inner_前缀开头,在传递给内部方法之前将被剥离。详见,例如scipy.sparse.linalg.gmres了解详情。

iterint,可选

要进行的迭代次数。如果省略(默认),则进行所需数量的迭代以满足容差。

verbosebool,可选

在每次迭代时将状态打印到标准输出。

maxiterint,可选

最大迭代次数。如果需要更多次迭代以满足收敛性,将引发NoConvergence异常。

f_tolfloat,可选

残差的绝对容差(在最大范数下)。如果省略,默认为 6e-6。

f_rtolfloat,可选

残差的相对容差。如果省略,则不使用。

x_tolfloat,可选

绝对最小步长,根据雅可比近似确定。如果步长小于此值,则优化成功终止。如果省略,则不使用。

x_rtol浮点数,可选

相对最小步长。如果省略,则不使用。

tol_norm函数(向量)->标量,可选

用于收敛检查的范数。默认为最大范数。

line_search, 可选

用于确定由雅可比近似给出的方向上的步长的线搜索类型。默认为‘armijo’。

callback函数,可选

可选回调函数。每次迭代时调用callback(x, f),其中x是当前解决方案,f是相应的残差。

返回:

solndarray

一个包含最终解决方案的数组(与x0类型相似)。

Raises:

NoConvergence

当未找到解决方案时。

另见

root

多变量函数根查找算法的接口。特别查看method='krylov'

scipy.sparse.linalg.gmres

scipy.sparse.linalg.lgmres

注意事项

此函数实现了一个牛顿-克莱罗夫求解器。其基本思想是使用迭代的克莱罗夫方法计算雅可比矩阵的逆。这些方法只需要评估雅可比向量乘积,这些乘积可以方便地通过有限差分近似:

[J v \approx (f(x + \omega*v/|v|) - f(x)) / \omega]

由于使用迭代矩阵逆,这些方法可以处理大型非线性问题。

SciPy 的scipy.sparse.linalg模块提供了一系列可供选择的克莱罗夫求解器。默认选择lgmres,这是一种重启的 GMRES 迭代的变体,它重复利用先前牛顿步骤中获取的某些信息来反转雅可比矩阵。

有关牛顿-克莱罗夫方法的评论,请参见例如[1],以及关于 LGMRES 稀疏逆方法,请参见[2]

参考文献

[1]

C. T. Kelley,《使用牛顿法解非线性方程》,SIAM,第 57-83 页,2003 年。DOI:10.1137/1.9780898718898.ch3

[2]

D.A. Knoll 和 D.E. Keyes,《J. Comp. Phys. 193,357(2004 年)》。DOI:10.1016/j.jcp.2003.08.010

[3]

A.H. Baker 和 E.R. Jessup 和 T. Manteuffel,《SIAM J. Matrix Anal. Appl. 26,962(2005 年)》。DOI:10.1137/S0895479803422014

示例

以下函数定义了一个非线性方程系统

>>> def fun(x):
...     return [x[0] + 0.5 * x[1] - 1.0,
...             0.5 * (x[1] - x[0]) ** 2] 

可通过以下方式获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.newton_krylov(fun, [0, 0])
>>> sol
array([0.66731771, 0.66536458]) 

scipy.optimize.anderson

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.anderson.html#scipy.optimize.anderson

scipy.optimize.anderson(F, xin, iter=None, alpha=None, w0=0.01, M=5, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

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

雅可比矩阵由在最后M向量所张成的空间中为“最佳”解形成。因此,只需要进行 MxM 矩阵反演和 MxN 乘法。[Ey]

参数:

Ffunction(x) -> f

要找到其根的函数;应接受并返回一个类似数组的对象。

xinarray_like

解决方案的初始猜测

alphafloat, 可选

雅可比矩阵的初始猜测为(-1/alpha)。

Mfloat, 可选

要保留的先前向量数。默认为 5。

w0float, 可选

用于数值稳定性的正则化参数。与单位相比,阶数为 0.01 的良好值。

iterint, 可选

要进行的迭代次数。如果省略(默认),则进行所需数量的迭代以满足容差。

verbosebool, 可选

在每次迭代时向标准输出打印状态。

maxiterint, 可选

最大迭代次数。如果需要更多迭代以达到收敛,将引发NoConvergence

f_tolfloat, 可选

绝对残差(在最大范数中)。如果省略,默认值为 6e-6。

f_rtolfloat, 可选

相对残差的容差。如果省略,则不使用。

x_tolfloat, 可选

绝对最小步长,由雅可比近似确定。如果步长小于此值,则优化被视为成功终止。如果省略,则不使用。

x_rtolfloat, 可选

相对最小步长。如果省略,则不使用。

tol_norm函数(向量)->标量,可选

在收敛检查中使用的范数。默认为最大范数。

line_search, 可选

用于确定由雅可比近似给定方向上的步长大小的线搜索类型。默认为“armijo”。

callback函数,可选

可选回调函数。每次迭代时调用callback(x, f),其中x为当前解决方案,f为相应残差。

返回:

solndarray

包含最终解的类似x0的数组(相似的数组类型)。

引发:

未收敛

未找到解决方案时。

另见

root

多变量函数根查找算法的接口。特别查看method='anderson'

参考文献

[Ey]

  1. Eyert,J. Comp. Phys.,124,271(1996)。

示例

以下函数定义了一个非线性方程组

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以通过以下方法获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.anderson(fun, [0, 0])
>>> sol
array([0.84116588, 0.15883789]) 

scipy.optimize.BroydenFirst

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.BroydenFirst.html#scipy.optimize.BroydenFirst

class scipy.optimize.BroydenFirst(alpha=None, reduction_method='restart', max_rank=None)

使用布罗伊登的第一个雅可比逼近找到一个函数的根。

这种方法也被称为“布罗伊登的良好方法”。

参数:

%(params_basic)s

%(broyden_params)s

%(params_extra)s

参见

root

多元函数根查找算法的接口。特别是查看 method='broyden1'

注意事项

此算法实现了逆雅可比拟牛顿更新。

[H_+ = H + (dx - H df) dx^\dagger H / ( dx^\dagger H df)]

对应于布罗伊登的第一个雅可比更新

[J_+ = J + (df - J dx) dx^\dagger / dx^\dagger dx]

参考文献

[1]

B.A. van der Rotten,博士论文,"用于解决高维非线性方程组的有限记忆布罗伊登方法"。荷兰莱顿大学数学研究所(2003 年)。

web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf

例子

下列函数定义了一个非线性方程组

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以通过以下方式获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.broyden1(fun, [0, 0])
>>> sol
array([0.84116396, 0.15883641]) 

方法

aspreconditioner
matvec
rmatvec
rsolve
setup
solve
todense
update

scipy.optimize.InverseJacobian

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.InverseJacobian.html#scipy.optimize.InverseJacobian

class scipy.optimize.InverseJacobian(jacobian)

属性:

dtype

shape

scipy.optimize.KrylovJacobian

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.KrylovJacobian.html#scipy.optimize.KrylovJacobian

class scipy.optimize.KrylovJacobian(rdiff=None, method='lgmres', inner_maxiter=20, inner_M=None, outer_k=10, **kw)

使用克莱洛夫近似求解函数的根,用于求解逆雅可比矩阵。

此方法适用于解决大规模问题。

参数:

%(params_basic)s

rdifffloat,可选项

在数值微分中使用的相对步长。

methodstr 或 callable,可选项

用于近似雅可比矩阵的克莱洛夫方法。可以是字符串,也可以是实现与scipy.sparse.linalg中迭代求解器相同接口的函数。如果是字符串,必须是以下之一:'lgmres''gmres''bicgstab''cgs''minres''tfqmr'

默认为scipy.sparse.linalg.lgmres

inner_maxiterint,可选项

传递给“内部”克莱洛夫求解器的参数:最大迭代次数。即使未达到指定的容差,迭代也将在 maxiter 步后停止。

inner_MLinearOperator 或 InverseJacobian

内部克莱洛夫迭代的预处理器。注意,您也可以使用逆雅可比矩阵作为(自适应)预处理器。例如,

>>> from scipy.optimize import BroydenFirst, KrylovJacobian
>>> from scipy.optimize import InverseJacobian
>>> jac = BroydenFirst()
>>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac)) 

如果预处理器有一个名为‘update’的方法,则在每个非线性步骤后将其作为update(x, f)调用,其中x为当前点,f为当前函数值。

outer_kint,可选项

在 LGMRES 非线性迭代中保留的子空间大小。详见scipy.sparse.linalg.lgmres

inner_kwargskwargs

“内部”克莱洛夫求解器的关键参数(使用method定义)。参数名必须以inner_前缀开头,在传递给内部方法之前将被剥离。例如详见scipy.sparse.linalg.gmres

%(params_extra)s

参见

root

多变量函数根查找算法的接口。特别是查看method='krylov'

scipy.sparse.linalg.gmres

scipy.sparse.linalg.lgmres

注意

此函数实现了牛顿-克莱洛夫求解器。其基本思想是使用迭代克莱洛夫方法计算雅可比矩阵的逆。这些方法仅需评估雅可比向量积,这可以通过有限差分方便地近似:

[J v \approx (f(x + \omega*v/|v|) - f(x)) / \omega]

由于使用迭代矩阵逆,这些方法可以处理大型非线性问题。

SciPy 的scipy.sparse.linalg模块提供了多种选择的 Krylov 求解器。默认选择是lgmres,这是重启 GMRES 迭代的一种变体,它在后续步骤中重复使用前几步中获得的一些信息以求解雅可比矩阵的逆。

关于 Newton-Krylov 方法的评论,例如见[1],以及关于 LGMRES 稀疏逆方法,见[2]

参考文献

[1]

C.T. Kelley, 用 Newton 方法解非线性方程, SIAM, pp.57-83, 2003. DOI:10.1137/1.9780898718898.ch3

[2]

D.A. Knoll 和 D.E. Keyes, J. Comp. Phys. 193, 357 (2004). DOI:10.1016/j.jcp.2003.08.010

[3]

A.H. Baker 和 E.R. Jessup 和 T. Manteuffel, SIAM J. Matrix Anal. Appl. 26, 962 (2005). DOI:10.1137/S0895479803422014

示例

以下函数定义了一组非线性方程系统。

>>> def fun(x):
...     return [x[0] + 0.5 * x[1] - 1.0,
...             0.5 * (x[1] - x[0]) ** 2] 

可以按照以下步骤获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.newton_krylov(fun, [0, 0])
>>> sol
array([0.66731771, 0.66536458]) 

方法

aspreconditioner
matvec
setup
solve
update

scipy.optimize.excitingmixing

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.excitingmixing.html#scipy.optimize.excitingmixing

scipy.optimize.excitingmixing(F, xin, iter=None, alpha=None, alphamax=1.0, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

使用调整后的对角雅可比近似值找到函数的根。

雅可比矩阵是对角的,并且在每次迭代中都进行调整。

警告

此算法可能对特定问题有用,但其有效性可能严重依赖于问题本身。

参数:

F 函数(x) -> f

要找到其根的函数;应接受并返回类似数组的对象。

xin 类似数组

解决方案的初始猜测

alpha 浮点数,可选

初始雅可比近似值为 (-1/alpha)。

alphamax 浮点数,可选

对角雅可比矩阵的条目保持在范围 [alpha, alphamax] 内。

iter 整数,可选

要进行的迭代次数。如果省略(默认),则进行足够多的迭代以满足容差。

verbose 布尔值,可选

在每次迭代中将状态打印到标准输出。

maxiter 整数,可选

最大迭代次数。如果需要更多迭代以满足收敛性,则会引发 NoConvergence

f_tol 浮点数,可选

绝对容差(在最大范数中)用于残差。如果省略,默认值为 6e-6。

f_rtol 浮点数,可选

相对残差的容差。如果省略,则不使用。

x_tol 浮点数,可选

绝对最小步长,根据雅可比近似值确定。如果步长小于此值,则优化成功终止。如果省略,则不使用。

x_rtol 浮点数,可选

相对最小步长。如果省略,则不使用。

tol_norm 函数(向量)-> 标量,可选

用于收敛检查的范数。默认为最大范数。

line_search {None, ‘armijo’(默认),‘wolfe’},可选

要使用的线搜索类型,以确定在雅可比近似值给定方向中采取的步长。默认为 ‘armijo’。

callback 函数,可选

可选的回调函数。每次迭代时调用 callback(x, f),其中 x 是当前解,f 是相应的残差。

返回:

sol ndarray

包含最终解的类似x0的数组(相同数组类型)。

Raises:

NoConvergence

未找到解时。

参见

root

多元函数根查找算法的接口。特别查看 method='excitingmixing'

scipy.optimize.linearmixing

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.linearmixing.html#scipy.optimize.linearmixing

scipy.optimize.linearmixing(F, xin, iter=None, alpha=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

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

警告

此算法可能对特定问题有用,但其是否有效可能严重依赖于问题的性质。

参数:

F函数(x) -> f

要查找其根的函数;应接受并返回类似数组的对象。

xin类数组对象

解的初始猜测

alpha浮点数,可选

雅可比近似为(-1/alpha)。

iter整数,可选

要进行的迭代次数。如果省略(默认),则进行足够的迭代以满足公差要求。

verbose布尔值,可选

在每次迭代时将状态打印到标准输出。

maxiter整数,可选

最大迭代次数。如果需要更多迭代以满足收敛性,则引发NoConvergence

f_tol浮点数,可选

残差的最大范数的绝对容差。如果省略,默认为 6e-6。

f_rtol浮点数,可选

残差的相对容差。如果省略,则不使用。

x_tol浮点数,可选

绝对最小步长,由雅可比近似确定。如果步长小于此值,则优化作为成功终止。如果省略,则不使用。

x_rtol浮点数,可选

相对最小步长。如果省略,则不使用。

tol_norm函数(向量)-> 标量,可选

收敛检查中使用的范数。默认为最大范数。

line_search,可选

用于确定由雅可比近似给定方向上的步长大小的线搜索类型。默认为'armijo'。

callback函数,可选

可选回调函数。每次迭代调用为callback(x, f),其中x为当前解,f为相应残差。

返回:

solndarray

一个包含最终解的数组(与x0相似的数组类型)。

引发:

NoConvergence

当未找到解决方案时。

另见

root

多元函数的根查找算法接口。特别查看method='linearmixing'

scipy.optimize.diagbroyden

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.optimize.diagbroyden.html#scipy.optimize.diagbroyden

scipy.optimize.diagbroyden(F, xin, iter=None, alpha=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

查找函数的根,使用对角布罗伊登雅各比近似法。

雅各比近似法源自先前迭代,仅保留布罗伊登矩阵的对角线。

警告

这种算法可能对特定问题有用,但其是否有效可能严重依赖于问题本身。

参数:

Ffunction(x) -> f

要找其根的函数;应接受并返回类似数组的对象。

xinarray_like

解的初始猜测

alphafloat,可选

雅各比的初始猜测为(-1/alpha)。

iterint,可选

要进行的迭代次数。如果省略(默认),则进行足够多次迭代以满足容差要求。

verbosebool,可选

在每次迭代时将状态打印到标准输出。

maxiterint,可选

要进行的最大迭代次数。如果需要更多次迭代以满足收敛性,将引发NoConvergence

f_tolfloat,可选

残差的绝对容差(最大范数)。如果省略,默认为 6e-6。

f_rtolfloat,可选

相对残差的相对容差。如果省略,则不使用。

x_tolfloat,可选

绝对最小步长,根据雅各比近似法确定。如果步长小于此值,则优化将成功终止。如果省略,则不使用。

x_rtolfloat,可选

相对最小步长。如果省略,则不使用。

tol_normfunction(vector) -> scalar,可选

用于收敛检查的范数。默认为最大范数。

line_search,可选

决定由雅各比近似给出的方向上的步长时,使用哪种类型的线搜索。默认为‘armijo’。

callbackfunction,可选

可选回调函数。在每次迭代时调用,参数为callback(x, f),其中x为当前解,f为对应残差。

返回:

solndarray

包含最终解的数组(与x0具有相似的数组类型)。

引发:

NoConvergence

当未找到解时。

另请参见

root

用于多元函数根查找算法的接口。特别查看method='diagbroyden'

示例

下面的函数定义了一个非线性方程组的系统。

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以通过以下方式获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.diagbroyden(fun, [0, 0])
>>> sol
array([0.84116403, 0.15883384]) 

信号处理(scipy.signal

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/signal.html

卷积

convolve(in1, in2[, mode, method]) 对两个 N 维数组进行卷积。
correlate(in1, in2[, mode, method]) 对两个 N 维数组进行交叉相关。
fftconvolve(in1, in2[, mode, axes]) 使用 FFT 对两个 N 维数组进行卷积。
oaconvolve(in1, in2[, mode, axes]) 使用重叠-加法方法对两个 N 维数组进行卷积。
convolve2d(in1, in2[, mode, boundary, fillvalue]) 对两个二维数组进行卷积。
correlate2d(in1, in2[, mode, boundary, ...]) 对两个二维数组进行交叉相关。
sepfir2d(input, hrow, hcol) 使用二维可分离 FIR 滤波器进行卷积。
choose_conv_method(in1, in2[, mode, measure]) 查找最快的卷积/相关方法。
correlation_lags(in1_len, in2_len[, mode]) 计算 1D 交叉相关的滞后/位移索引数组。

B 样条曲线

bspline(x, n) B 样条基函数。

自版本 1.11.0 起已弃用。

|

cubic(x) 三次曲线插值。

自版本 1.11.0 起已弃用。

|

quadratic(x) 二次曲线插值。

自版本 1.11.0 起已弃用。

|

gauss_spline(x, n) 高斯逼近的 B 样条基函数(n 阶)。
cspline1d(signal[, lamb]) 计算一维秩为 1 的三次样条插值系数。
qspline1d(signal[, lamb]) 计算一维秩为 1 的二次样条插值系数。
cspline2d(input[, lambda, precision]) 二维三次 B 样条的系数。
qspline2d(input[, lambda, precision]) 二维二次 B 样条的系数:
cspline1d_eval(cj, newx[, dx, x0]) 在新点集上评估一维三次样条。
qspline1d_eval(cj, newx[, dx, x0]) 在新点集上评估一维二次样条。
spline_filter(Iin[, lmbda]) 对二维数组进行平滑样条(三次)滤波。

Filtering

order_filter(a, domain, rank) 在 N 维数组上执行阶次滤波。
medfilt(volume[, kernel_size]) 对 N 维数组执行中值滤波。
medfilt2d(input[, kernel_size]) 对二维数组进行中值滤波。
wiener(im[, mysize, noise]) 对 N 维数组执行维纳滤波。
symiirorder1(input, c0, z1[, precision]) 使用第一阶段级联实现具有镜像对称边界条件的平滑 IIR 滤波器。第二阶段使用反向序列。
symiirorder2(input, r, omega[, precision]) 使用第二阶段级联实现具有镜像对称边界条件的平滑 IIR 滤波器。第二阶段使用反向序列。
lfilter(b, a, x[, axis, zi]) 使用 IIR 或 FIR 滤波器沿着一维对数据进行滤波。
lfiltic(b, a, y[, x]) 给定输入和输出向量,构造 lfilter 的初始条件。
lfilter_zi(b, a) 构造 lfilter 的初始条件,用于阶跃响应的稳态。
filtfilt 对信号进行前向和后向数字滤波。
savgol_filter 对数组应用 Savitzky-Golay 滤波器。
deconvolve 使用逆滤波器将divisorsignal中去卷积出来。
sosfilt 使用级联的二阶段沿着一个维度对数据进行滤波。
sosfilt_zi 构造 sosfilt 的初始条件,用于步响应稳态。
sosfiltfilt 使用级联的二阶段进行前向-后向数字滤波。
hilbert 使用 Hilbert 变换计算解析信号。
hilbert2 计算x的二维解析信号。
decimate 在应用抗混叠滤波器后对信号进行下采样。
detrend 从数据中沿着指定轴去除线性趋势。
resample 使用傅里叶方法沿给定轴对x进行num样本的重采样。
resample_poly 使用多相滤波器沿指定轴对x进行重采样。
upfirdn 上采样、FIR 滤波和下采样。

Filter design

bilinear 使用双线性变换从模拟滤波器返回数字 IIR 滤波器。
bilinear_zpk 使用双线性变换从模拟滤波器返回数字 IIR 滤波器。
findfreqs(num, den, N[, kind]) 查找用于计算模拟滤波器响应的频率数组。
firls(numtaps, bands, desired, *[, weight, ...]) 使用最小二乘误差最小化设计 FIR 滤波器。
firwin(numtaps, cutoff, *[, width, window, ...]) 使用窗口方法设计 FIR 滤波器。
firwin2(numtaps, freq, gain, *[, nfreqs, ...]) 使用窗口方法设计 FIR 滤波器。
freqs(b, a[, worN, plot]) 计算模拟滤波器的频率响应。
freqs_zpk(z, p, k[, worN]) 计算模拟滤波器的频率响应。
freqz(b[, a, worN, whole, plot, fs, ...]) 计算数字滤波器的频率响应。
freqz_zpk(z, p, k[, worN, whole, fs]) 计算 ZPK 形式数字滤波器的频率响应。
sosfreqz(sos[, worN, whole, fs]) 计算 SOS 格式数字滤波器的频率响应。
gammatone(freq, ftype[, order, numtaps, fs]) Gammatone 滤波器设计。
group_delay(system[, w, whole, fs]) 计算数字滤波器的群延迟。
iirdesign(wp, ws, gpass, gstop[, analog, ...]) 完成 IIR 数字和模拟滤波器设计。
iirfilter(N, Wn[, rp, rs, btype, analog, ...]) 给定阶数和关键点,设计 IIR 数字和模拟滤波器。
kaiser_atten(numtaps, width) 计算 Kaiser FIR 滤波器的衰减。
kaiser_beta(a) 给定衰减a,计算 Kaiser 参数beta
kaiserord(ripple, width) 确定 Kaiser 窗口方法的滤波器窗口参数。
minimum_phase(h[, method, n_fft]) 将线性相位 FIR 滤波器转换为最小相位。
savgol_coeffs(window_length, polyorder[, ...]) 计算 1-D Savitzky-Golay FIR 滤波器的系数。
remez(numtaps, bands, desired, *[, weight, ...]) 使用 Remez 交换算法计算最小最大化优化滤波器。
unique_roots(p[, tol, rtype]) 从根列表中确定唯一的根及其重数。
residue(b, a[, tol, rtype]) 计算 b(s) / a(s) 的部分分数展开。
residuez(b, a[, tol, rtype]) 计算 b(z) / a(z) 的部分分数展开。
invres(r, p, k[, tol, rtype]) 从部分分数展开中计算 b(s) 和 a(s)。
invresz(r, p, k[, tol, rtype]) 从部分分数展开中计算 b(z) 和 a(z)。
BadCoefficients 关于条件不佳的滤波器系数的警告。

低级滤波器设计函数:

abcd_normalize([A, B, C, D]) 检查状态空间矩阵并确保其为二维。
band_stop_obj(wp, ind, passb, stopb, gpass, ...) 频带阻止目标函数,用于最小化阶数。
besselap(N[, norm]) 返回 N 阶贝塞尔滤波器的模拟原型 (z, p, k)。
buttap(N) 返回 N 阶巴特沃斯滤波器的模拟原型 (z, p, k)。
cheb1ap(N, rp) 返回 N 阶切比雪夫类型 I 模拟低通滤波器的 (z, p, k)。
cheb2ap(N, rs) 返回 N 阶切比雪夫类型 II 模拟低通滤波器的 (z, p, k)。
cmplx_sort(p)
ellipap(N, rp, rs) 返回第 N 阶椭圆模拟低通滤波器的 (z,p,k)。
lp2bp(b, a[, wo, bw]) 将低通滤波器原型转换到带通滤波器。
lp2bp_zpk(z, p, k[, wo, bw]) 将低通滤波器原型转换到带通滤波器。
lp2bs(b, a[, wo, bw]) 将低通滤波器原型转换到带阻滤波器。
lp2bs_zpk(z, p, k[, wo, bw]) 将低通滤波器原型转换到带阻滤波器。
lp2hp(b, a[, wo]) 将低通滤波器原型转换到高通滤波器。
lp2hp_zpk(z, p, k[, wo]) 将低通滤波器原型转换到高通滤波器。
lp2lp(b, a[, wo]) 将低通滤波器原型转换到不同的频率。
lp2lp_zpk(z, p, k[, wo]) 将低通滤波器原型转换到不同的频率。
normalize(b, a) 归一化连续时间传递函数的分子/分母。

Matlab 风格 IIR 滤波器设计

butter(N, Wn[, btype, analog, output, fs]) Butterworth 数字和模拟滤波器设计。
buttord(wp, ws, gpass, gstop[, analog, fs]) Butterworth 滤波器阶数选择。
cheby1(N, rp, Wn[, btype, analog, output, fs]) Chebyshev I 数字和模拟滤波器设计。
cheb1ord(wp, ws, gpass, gstop[, analog, fs]) Chebyshev I 滤波器阶数选择。
cheby2(N, rs, Wn[, btype, analog, output, fs]) Chebyshev II 数字和模拟滤波器设计。
cheb2ord(wp, ws, gpass, gstop[, analog, fs]) Chebyshev II 滤波器阶数选择。
ellip(N, rp, rs, Wn[, btype, analog, output, fs]) 椭圆(考尔)数字和模拟滤波器设计。
ellipord(wp, ws, gpass, gstop[, analog, fs]) 椭圆(考尔)滤波器阶数选择。
bessel(N, Wn[, btype, analog, output, norm, fs]) Bessel/Thomson 数字和模拟滤波器设计。
iirnotch(w0, Q[, fs]) 设计二阶 IIR 陷波数字滤波器。
iirpeak(w0, Q[, fs]) 设计二阶 IIR 峰值(共振)数字滤波器。
iircomb(w0, Q[, ftype, fs, pass_zero]) 设计 IIR 凹凸或峰值数字梳状滤波器。

连续时间线性系统

lti(*system) 连续时间线性时不变系统基类。
StateSpace(*system, **kwargs) 状态空间形式的线性时不变系统。
TransferFunction(*system, **kwargs) 传递函数形式的线性时不变系统类。
ZerosPolesGain(*system, **kwargs) 零极点增益形式的线性时不变系统类。
lsim(system, U, T[, X0, interp]) 模拟连续时间线性系统的输出。
lsim2(system[, U, T, X0]) 使用 ODE 求解器 scipy.integrate.odeint 模拟连续时间线性系统的输出。
impulse(system[, X0, T, N]) 连续时间系统的冲激响应。
impulse2(system[, X0, T, N]) 单输入连续时间线性系统的冲激响应。
step(system[, X0, T, N]) 连续时间系统的阶跃响应。
step2(system[, X0, T, N]) 连续时间系统的阶跃响应。
freqresp(system[, w, n]) 计算连续时间系统的频率响应。
bode(system[, w, n]) 计算连续时间系统的波德幅度和相位数据。

离散时间线性系统

dlti(*system, **kwargs) 离散时间线性时不变系统基类。
StateSpace(*system, **kwargs) 状态空间形式的线性时不变系统。
TransferFunction(*system, **kwargs) 传递函数形式的线性时不变系统类。
ZerosPolesGain(*system, **kwargs) 零点、极点、增益形式的线性时不变系统类。
dlsim(system, u[, t, x0]) 模拟离散时间线性系统的输出。
dimpulse(system[, x0, t, n]) 离散时间系统的冲激响应。
dstep(system[, x0, t, n]) 离散时间系统的阶跃响应。
dfreqresp(system[, w, n, whole]) 计算离散时间系统的频率响应。
dbode(system[, w, n]) 计算离散时间系统的波德幅度和相位数据。

LTI 表示

tf2zpk(b, a) 从分子、分母表示的线性滤波器返回零点、极点、增益(z, p, k)表示。
tf2sos(b, a[, pairing, analog]) 从传递函数表示返回二阶段节。
tf2ss(num, den) 传递函数到状态空间表示。
zpk2tf(z, p, k) 从零点和极点返回多项式传递函数表示。
zpk2sos(z, p, k[, pairing, analog]) 从系统的零点、极点和增益返回二阶段节。
zpk2ss(z, p, k) 零极点增益表示转换为状态空间表示
ss2tf(A, B, C, D[, input]) 状态空间到传递函数的转换。
ss2zpk(A, B, C, D[, input]) 状态空间表示转换为零极点增益表示。
sos2zpk(sos) 返回一系列二阶段的零点、极点和增益
sos2tf(sos) 从一系列二阶段得到单一传递函数
cont2discrete(system, dt[, method, alpha]) 将连续状态空间系统转换为离散系统。
place_poles(A, B, poles[, method, rtol, maxiter]) 计算 K 使得特征值(A - dot(B, K))=poles。

波形

chirp(t, f0, t1, f1[, method, phi, vertex_zero]) 频率扫描余弦波生成器。
gausspulse(t[, fc, bw, bwr, tpr, retquad, ...]) 返回高斯调制正弦波:
max_len_seq(nbits[, state, length, taps]) 最大长度序列(MLS)生成器。
sawtooth(t[, width]) 返回周期锯齿波形或三角波形。
square(t[, duty]) 返回周期方波波形。
sweep_poly(t, poly[, phi]) 频率扫描余弦波生成器,具有时间相关的频率。
unit_impulse(shape[, idx, dtype]) 单位冲激信号(离散δ函数)或单位基向量。

窗口函数

对于窗口函数,请参见scipy.signal.windows命名空间。

scipy.signal命名空间中,有一个方便的函数可通过名称获取这些窗口:

get_window(window, Nx[, fftbins]) 返回指定长度和类型的窗口。

小波

cascade(hk[, J]) 从滤波器系数返回 dyadic 点K/2**J处的(x, phi, psi)。
daub(p) 产生 Daubechies 小波的 FIR 低通滤波器系数。
morlet(M[, w, s, complete]) 复杂 Morlet 小波。
qmf(hk) 从低通滤波器返回高通 qmf 滤波器。
ricker(points, a) 返回一个 Ricker 小波,也称为“墨西哥帽小波”。
morlet2(M, s[, w]) 复杂 Morlet 小波,专为与cwt一起使用而设计。
cwt(data, wavelet, widths[, dtype]) 连续小波变换。

峰值检测

argrelmin(data[, axis, order, mode]) 计算data的相对最小值。
argrelmax(data[, axis, order, mode]) 计算data的相对最大值。
argrelextrema(data, comparator[, axis, ...]) 计算data的相对极值。
find_peaks(x[, height, threshold, distance, ...]) 基于峰值特性在信号内部找到峰值。
find_peaks_cwt(vector, widths[, wavelet, ...]) 使用小波变换在 1-D 数组中找到峰值。
peak_prominences(x, peaks[, wlen]) 计算信号中每个峰值的显著性。
peak_widths(x, peaks[, rel_height, ...]) 计算信号中每个峰值的宽度。

谱分析

periodogram(x[, fs, window, nfft, detrend, ...]) 使用周期图估算功率谱密度。
welch(x[, fs, window, nperseg, noverlap, ...]) 使用 Welch 方法估算功率谱密度。
csd(x, y[, fs, window, nperseg, noverlap, ...]) 使用 Welch 方法估计交叉功率谱密度 Pxy。
coherence(x, y[, fs, window, nperseg, ...]) 使用 Welch 方法估计离散时间信号 X 和 Y 的幅度平方相干估计 Cxy。
spectrogram(x[, fs, window, nperseg, ...]) 使用连续傅里叶变换计算谱图。
lombscargle(x, y, freqs) 计算朗伯-斯卡戈尔周期图。
vectorstrength(events, period) 确定与给定周期对应的事件的向量强度。
ShortTimeFFT(win, hop, fs, *[, fft_mode, ...]) 提供参数化的离散短时傅里叶变换(STFT)及其逆变换(ISTFT)。
stft(x[, fs, window, nperseg, noverlap, ...]) 计算短时傅里叶变换(STFT)。
istft(Zxx[, fs, window, nperseg, noverlap, ...]) 执行逆短时傅里叶变换(iSTFT)。
check_COLA(window, nperseg, noverlap[, tol]) 检查是否满足恒定重叠添加(COLA)约束。
check_NOLA(window, nperseg, noverlap[, tol]) 检查非零重叠添加(NOLA)约束是否满足。

Chirp Z-transform and Zoom FFT

czt(x[, m, w, a, axis]) 计算 Z 平面上螺旋周围的频率响应。
zoom_fft(x, fn[, m, fs, endpoint, axis]) 仅计算范围内频率 fnx 的离散傅里叶变换(DFT)。
CZT(n[, m, w, a]) 创建可调用的啁啾 Z 变换函数。
ZoomFFT(n, fn[, m, fs, endpoint]) 创建可调用的缩放 FFT 变换函数。
czt_points(m[, w, a]) 返回进行啁啾 Z 变换的点。

函数比类更易于使用,但在对许多长度相同的数组执行相同变换时效率较低,因为它们在每次调用时都会重复生成相同的啁啾信号。在这些情况下,使用类来创建可重复使用的函数更为合适。

scipy.signal.convolve

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.convolve.html#scipy.signal.convolve

scipy.signal.convolve(in1, in2, mode='full', method='auto')

对两个 N 维数组进行卷积。

使用mode参数确定输出大小,对in1in2进行卷积。

参数:

in1array_like

第一个输入。

in2array_like

第二输入。应与in1具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’},可选

一个表示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含那些不依赖于零填充的元素。在‘valid’模式下,in1in2必须至少在每个维度上与另一个一样大。

same

输出与in1相同大小,并相对于‘full’输出中心化。

methodstr {‘auto’, ‘direct’, ‘fft’},可选

一个表示计算卷积使用的方法的字符串。

direct

卷积直接来自求和,即卷积的定义。

fft

通过调用fftconvolve使用傅立叶变换执行卷积。

auto

根据估计选择直接方法或傅立叶方法(默认)以提高速度。更多详细信息请参见注释。

新版本 0.19.0 中引入。

返回:

convolvearray

包含in1in2的离散线性卷积子集的 N 维数组。

警告:

RuntimeWarning

在包含 NAN 或 INF 的输入上使用 FFT 卷积将导致整个输出为 NAN 或 INF。当输入包含 NAN 或 INF 值时,请使用 method=’direct’。

另请参见

numpy.polymul

执行多项式乘法(相同操作,但还接受 poly1d 对象)

choose_conv_method

选择最快适当的卷积方法

fftconvolve

始终使用 FFT 方法。

oaconvolve

使用重叠-添加方法进行卷积,当输入数组大且大小显著不同时通常更快。

注释

默认情况下,convolvecorrelate 使用 method='auto',这会调用 choose_conv_method 来选择最快的方法,使用预先计算的值(choose_conv_method 还可以通过关键字参数测量真实世界的时间)。因为 fftconvolve 依赖于浮点数,所以存在某些约束可能会强制使用 method=direct(详细信息请参见 choose_conv_method 文档字符串)。

示例

使用汉宁窗口平滑方波脉冲:

>>> import numpy as np
>>> from scipy import signal
>>> sig = np.repeat([0., 1., 0.], 100)
>>> win = signal.windows.hann(50)
>>> filtered = signal.convolve(sig, win, mode='same') / sum(win) 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_win, ax_filt) = plt.subplots(3, 1, sharex=True)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('Original pulse')
>>> ax_orig.margins(0, 0.1)
>>> ax_win.plot(win)
>>> ax_win.set_title('Filter impulse response')
>>> ax_win.margins(0, 0.1)
>>> ax_filt.plot(filtered)
>>> ax_filt.set_title('Filtered signal')
>>> ax_filt.margins(0, 0.1)
>>> fig.tight_layout()
>>> fig.show() 

../../_images/scipy-signal-convolve-1.png

scipy.signal.correlate

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate

scipy.signal.correlate(in1, in2, mode='full', method='auto')

交叉相关两个 N 维数组。

in1in2 进行交叉相关,输出大小由 mode 参数确定。

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与 in1 具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’}, 可选

一个指示输出大小的字符串:

full

输出是输入的完整离散线性交叉相关。(默认)

valid

输出仅包含不依赖于零填充的元素。在“有效”模式下,in1in2 在每个维度上至少与另一个一样大。

same

输出与 in1 相同大小,相对于“full”输出居中。

methodstr {‘auto’, ‘direct’, ‘fft’}, 可选

表示计算相关性的方法的字符串。

direct

相关性直接根据总和确定。

fft

使用快速傅里叶变换来更快地执行相关性计算(仅适用于数值数组)。

auto

基于估计的速度更快的直接或傅里叶方法(默认)自动选择。详细信息请参阅 convolve 说明。

从版本 0.19.0 开始新添加。

返回:

correlatearray

包含 in1in2 的离散线性交叉相关的子集的 N 维数组。

另请参阅

choose_conv_method

包含更多关于 method 的文档。

correlation_lags

计算 1D 交叉相关的滞后/位移索引数组。

注意

两个 d 维数组 x 和 y 的相关性 z 定义为:

z[...,k,...] = sum[..., i_l, ...] x[..., i_l,...] * conj(y[..., i_l - k,...]) 

因此,如果 x 和 y 是 1-D 数组,并且 z = correlate(x, y, 'full'),则

[z[k] = (x * y)(k - N + 1) = \sum_{l=0}^{||x||-1}x_l y_{l-k+N-1}^{*}]

对于 (k = 0, 1, ..., ||x|| + ||y|| - 2)

其中 (||x||) 是 x 的长度,(N = \max(||x||,||y||)),当 m 超出 y 的范围时,(y_m) 为 0。

method='fft' 仅适用于数值数组,因为它依赖于 fftconvolve。在某些情况下(例如,对象数组或者当四舍五入整数可能会丢失精度时),始终使用 method='direct'

在使用偶数长度输入的“same”模式时,correlatecorrelate2d 的输出不同:它们之间有一个 1 索引偏移。

示例

使用互相关实现匹配滤波器,以恢复通过噪声通道传输的信号。

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng() 
>>> sig = np.repeat([0., 1., 1., 0., 1., 0., 0., 1.], 128)
>>> sig_noise = sig + rng.standard_normal(len(sig))
>>> corr = signal.correlate(sig_noise, np.ones(128), mode='same') / 128 
>>> clock = np.arange(64, len(sig), 128)
>>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, sharex=True)
>>> ax_orig.plot(sig)
>>> ax_orig.plot(clock, sig[clock], 'ro')
>>> ax_orig.set_title('Original signal')
>>> ax_noise.plot(sig_noise)
>>> ax_noise.set_title('Signal with noise')
>>> ax_corr.plot(corr)
>>> ax_corr.plot(clock, corr[clock], 'ro')
>>> ax_corr.axhline(0.5, ls=':')
>>> ax_corr.set_title('Cross-correlated with rectangular pulse')
>>> ax_orig.margins(0, 0.1)
>>> fig.tight_layout()
>>> plt.show() 

../../_images/scipy-signal-correlate-1_00_00.png

计算带噪声信号与原始信号的互相关。

>>> x = np.arange(128) / 128
>>> sig = np.sin(2 * np.pi * x)
>>> sig_noise = sig + rng.standard_normal(len(sig))
>>> corr = signal.correlate(sig_noise, sig)
>>> lags = signal.correlation_lags(len(sig), len(sig_noise))
>>> corr /= np.max(corr) 
>>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, figsize=(4.8, 4.8))
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('Original signal')
>>> ax_orig.set_xlabel('Sample Number')
>>> ax_noise.plot(sig_noise)
>>> ax_noise.set_title('Signal with noise')
>>> ax_noise.set_xlabel('Sample Number')
>>> ax_corr.plot(lags, corr)
>>> ax_corr.set_title('Cross-correlated signal')
>>> ax_corr.set_xlabel('Lag')
>>> ax_orig.margins(0, 0.1)
>>> ax_noise.margins(0, 0.1)
>>> ax_corr.margins(0, 0.1)
>>> fig.tight_layout()
>>> plt.show() 

../../_images/scipy-signal-correlate-1_01_00.png

scipy.signal.fftconvolve

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.fftconvolve.html#scipy.signal.fftconvolve

scipy.signal.fftconvolve(in1, in2, mode='full', axes=None)

使用 FFT 对两个 N 维数组进行卷积。

使用快速 Fourier 变换方法对 in1in2 进行卷积,输出大小由 mode 参数确定。

对于大数组(n > ~500),这通常比 convolve 快得多,但是当仅需要少数输出值时可能较慢,并且只能输出浮点数数组(整数或对象数组输入将转换为浮点数)。

自 v0.19 起,convolve 根据哪种方法更快的估计自动选择。

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与 in1 具有相同数量的维度。

modestr {'full', 'valid', 'same'},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。在 'valid' 模式下,in1in2 在每个维度上必须至少与另一个一样大。

same

输出与 in1 大小相同,相对于 'full' 输出居中。

axesint 或 array_like 的整数或 None,可选

计算卷积的轴。默认为所有轴。

返回:

outarray

包含 in1in2 的离散线性卷积的子集的 N 维数组。

另请参阅

convolve

根据速度选择直接卷积或 FFT 卷积算法。

oaconvolve

当输入数组大且尺寸显著不同时,使用重叠-添加方法进行卷积通常更快。

示例

白噪声的自相关是一个脉冲。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> sig = rng.standard_normal(1000)
>>> autocorr = signal.fftconvolve(sig, sig[::-1], mode='full') 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('White noise')
>>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)), autocorr)
>>> ax_mag.set_title('Autocorrelation')
>>> fig.tight_layout()
>>> fig.show() 

使用 FFT 卷积实现高斯模糊。请注意图像周围的黑暗边界,这是由于超出其边界的零填充所致。convolve2d 函数允许其他类型的图像边界,但速度较慢。

>>> from scipy import datasets
>>> face = datasets.face(gray=True)
>>> kernel = np.outer(signal.windows.gaussian(70, 8),
...                   signal.windows.gaussian(70, 8))
>>> blurred = signal.fftconvolve(face, kernel, mode='same') 
>>> fig, (ax_orig, ax_kernel, ax_blurred) = plt.subplots(3, 1,
...                                                      figsize=(6, 15))
>>> ax_orig.imshow(face, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_kernel.imshow(kernel, cmap='gray')
>>> ax_kernel.set_title('Gaussian kernel')
>>> ax_kernel.set_axis_off()
>>> ax_blurred.imshow(blurred, cmap='gray')
>>> ax_blurred.set_title('Blurred')
>>> ax_blurred.set_axis_off()
>>> fig.show() 

../../_images/scipy-signal-fftconvolve-1_00.png../../_images/scipy-signal-fftconvolve-1_01.png

scipy.signal.oaconvolve

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.oaconvolve.html#scipy.signal.oaconvolve

scipy.signal.oaconvolve(in1, in2, mode='full', axes=None)

使用重叠添加方法对两个 N 维数组进行卷积。

使用重叠添加方法对in1in2进行卷积,输出大小由mode参数确定。

对于大数组(n > ~500),这通常比convolve快得多,并且通常比fftconvolve快得多,当一个数组远大于另一个数组时,但当仅需要少量输出值或数组在形状上非常相似时,可能会更慢,并且只能输出浮点数组(int 或 object 数组输入将被转换为 float)。

参数:

in1array_like

第一个输入。

in2array_like

第二输入。应该与in1具有相同的维数。

modestr {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅由不依赖于零填充的元素组成。在“valid”模式下,in1in2必须在每个维度上至少与另一个一样大。

same

输出与in1大小相同,相对于“full”输出居中。

axesint 或 int 数组或 None,可选

要计算卷积的轴。默认在所有轴上。

返回:

outarray

包含in1in2离散线性卷积子集的 N 维数组。

另请参阅

convolve

根据哪个更快,使用直接卷积或 FFT 卷积算法。

fftconvolve

使用 FFT 实现的卷积。

注意事项

新版本 1.4.0 中引入。

参考文献

[1]

Wikipedia,“重叠添加方法”。en.wikipedia.org/wiki/Overlap-add_method

[2]

Richard G. Lyons. 《理解数字信号处理》,第三版,2011。第 13.10 章。ISBN 13: 978-0137-02741-5

示例

用 512 个样本的滤波器卷积一个 100,000 个样本的信号。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> sig = rng.standard_normal(100000)
>>> filt = signal.firwin(512, 0.01)
>>> fsig = signal.oaconvolve(sig, filt) 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('White noise')
>>> ax_mag.plot(fsig)
>>> ax_mag.set_title('Filtered noise')
>>> fig.tight_layout()
>>> fig.show() 

../../_images/scipy-signal-oaconvolve-1.png

scipy.signal.convolve2d

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.convolve2d.html#scipy.signal.convolve2d

scipy.signal.convolve2d(in1, in2, mode='full', boundary='fill', fillvalue=0)

对两个二维数组进行卷积。

用于计算输出大小的模式以及由 boundaryfillvalue 决定的边界条件对 in1in2 进行卷积。

参数:

in1 类似数组

First input.

in2 类似数组

第二个输入。应该与 in1 具有相同数量的维度。

mode 字符串 {‘full’, ‘valid’, ‘same’},可选

表示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。在“valid”模式下,in1in2 在每个维度上至少必须与另一个一样大。

same

输出与 in1 相同大小,并相对于“full”输出居中。

boundary 字符串 {‘fill’, ‘wrap’, ‘symm’},可选

一个指示如何处理边界的标志:

fill

用 fillvalue 填充输入数组。(默认)

wrap

循环边界条件。

symm

对称边界条件。

fillvalue 标量,可选

用于填充输入数组的值。默认为 0。

返回:

out ndarray

包含 in1in2 离散线性卷积子集的二维数组。

示例

使用复杂的 Scharr 算子通过 2D 卷积计算图像的梯度。(水平操作符是实部,垂直是虚部。)使用对称边界条件避免在图像边界创建边缘。

>>> import numpy as np
>>> from scipy import signal
>>> from scipy import datasets
>>> ascent = datasets.ascent()
>>> scharr = np.array([[ -3-3j, 0-10j,  +3 -3j],
...                    [-10+0j, 0+ 0j, +10 +0j],
...                    [ -3+3j, 0+10j,  +3 +3j]]) # Gx + j*Gy
>>> grad = signal.convolve2d(ascent, scharr, boundary='symm', mode='same') 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag, ax_ang) = plt.subplots(3, 1, figsize=(6, 15))
>>> ax_orig.imshow(ascent, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_mag.imshow(np.absolute(grad), cmap='gray')
>>> ax_mag.set_title('Gradient magnitude')
>>> ax_mag.set_axis_off()
>>> ax_ang.imshow(np.angle(grad), cmap='hsv') # hsv is cyclic, like angles
>>> ax_ang.set_title('Gradient orientation')
>>> ax_ang.set_axis_off()
>>> fig.show() 

../../_images/scipy-signal-convolve2d-1.png

scipy.signal.correlate2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.correlate2d.html#scipy.signal.correlate2d

scipy.signal.correlate2d(in1, in2, mode='full', boundary='fill', fillvalue=0)

交叉相关两个二维数组。

mode确定输出大小,boundaryfillvalue确定边界条件交叉相关in1in2

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与in1具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性交叉相关。(默认)

valid

输出仅包含那些不依赖于零填充的元素。在“valid”模式下,in1in2必须至少在每个维度上与另一个一样大。

same

输出与in1相同大小,相对于“full”输出居中。

boundarystr {‘fill’, ‘wrap’, ‘symm’},可选

指示如何处理边界的标志:

fill

用 fillvalue 填充输入数组。(默认)

wrap

循环边界条件。

symm

对称边界条件。

fillvaluescalar,可选

用于填充填充输入数组的值。默认为 0。

返回:

correlate2dndarray

包含in1in2的离散线性交叉相关子集的二维数组。

注意事项

使用偶数长度输入的“same”模式时,correlatecorrelate2d的输出不同:它们之间存在 1 索引偏移。

示例

使用 2D 交叉相关在嘈杂图像中找到模板的位置:

>>> import numpy as np
>>> from scipy import signal
>>> from scipy import datasets
>>> rng = np.random.default_rng()
>>> face = datasets.face(gray=True) - datasets.face(gray=True).mean()
>>> template = np.copy(face[300:365, 670:750])  # right eye
>>> template -= template.mean()
>>> face = face + rng.standard_normal(face.shape) * 50  # add noise
>>> corr = signal.correlate2d(face, template, boundary='symm', mode='same')
>>> y, x = np.unravel_index(np.argmax(corr), corr.shape)  # find the match 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_template, ax_corr) = plt.subplots(3, 1,
...                                                     figsize=(6, 15))
>>> ax_orig.imshow(face, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_template.imshow(template, cmap='gray')
>>> ax_template.set_title('Template')
>>> ax_template.set_axis_off()
>>> ax_corr.imshow(corr, cmap='gray')
>>> ax_corr.set_title('Cross-correlation')
>>> ax_corr.set_axis_off()
>>> ax_orig.plot(x, y, 'ro')
>>> fig.show() 

../../_images/scipy-signal-correlate2d-1.png

scipy.signal.sepfir2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.sepfir2d.html#scipy.signal.sepfir2d

scipy.signal.sepfir2d(input, hrow, hcol)

用二维可分离 FIR 滤波器进行卷积。

将二阶排列输入数组与由一阶数组 hrow 和 hcol 定义的可分离滤波器卷积。假设使用镜像对称边界条件。此函数可用于根据其 B-样条表示找到图像。

参数:

inputndarray

输入信号。必须是二阶数组。

hrowndarray

定义滤波器行方向的一阶数组。必须是奇数长度。

hcolndarray

定义滤波器列方向的一阶数组。必须是奇数长度。

返回:

outputndarray

过滤后的信号。

示例

示例显示在教程中。

scipy.signal.choose_conv_method

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.choose_conv_method.html#scipy.signal.choose_conv_method

scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)

找到最快的卷积/相关方法。

主要用于在卷积相关method='auto'选项期间调用。它还可用于确定许多相同 dtype/shape 的卷积的method的值。此外,它支持根据特定输入和/或硬件的时间来调整method的值。

参数:

in1类数组

传递给卷积函数的第一个参数。

in2类数组

传递给卷积函数的第二个参数。

模式字符串 {‘full’, ‘valid’, ‘same’},可选

输出大小的字符串指示:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。

same

输出与in1相同大小,相对于‘full’输出居中。

测量布尔值,可选

如果为 True,则使用两种方法运行和计时in1in2的卷积,并返回最快的方法。如果为 False(默认),则使用预计算的值预测最快方法。

返回:

方法字符串

指示哪种卷积方法最快的字符串,可以是‘direct’或‘fft’

times字典,可选

包含每种方法所需时间(以秒为单位)的字典。仅当measure=True时才返回此值。

另见

卷积

相关

注意

一般来说,对于随机选择的输入尺寸,此方法在 2D 信号中的准确率为 99%,在 1D 信号中为 85%。为了精度,使用measure=True来找到计算卷积所需的最快方法。这可以用来避免稍后找到最快method的最小开销,或者根据特定输入集合调整method的值。

实验在 Amazon EC2 r5a.2xlarge 机器上运行,以测试此函数。这些实验测量了使用method='auto'时所需的时间与最快方法(即ratio = time_auto / min(time_fft, time_direct))之间的比率。在这些实验中,我们发现:

  • 对于 1D 信号,这个比率小于 1.5 的可能性为 95%,对于 2D 信号,这个比率小于 2.5 的可能性为 99%。

  • 对于 1D/2D 信号,这个比率始终小于 2.5/5。

  • 此函数在处理method='direct'的 1D 卷积时最不准确,耗时介于 1 到 10 毫秒之间。在我们的实验中,这个值的一个良好代理是1e6 <= in1.size * in2.size <= 1e7

2D 结果几乎可以肯定地推广到 3D/4D 等,因为实现是相同的(1D 实现是不同的)。

上述所有数字都特定于 EC2 机器。然而,我们确实发现该函数在不同硬件上表现相当良好。速度测试的质量与调整此函数数字的机器相似(一台 2014 年中期的 15 英寸 MacBook Pro,配备 16GB RAM 和 2.5GHz 的 Intel i7 处理器)。

存在一些情况,fftconvolve支持输入,但此函数返回direct(例如,为了防止浮点整数精度问题)。

从 0.19 版本开始新增。

示例

估算给定输入的最快方法:

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> img = rng.random((32, 32))
>>> filter = rng.random((8, 8))
>>> method = signal.choose_conv_method(img, filter, mode='same')
>>> method
'fft' 

然后可以应用于相同数据类型和形状的其他数组:

>>> img2 = rng.random((32, 32))
>>> filter2 = rng.random((8, 8))
>>> corr2 = signal.correlate(img2, filter2, mode='same', method=method)
>>> conv2 = signal.convolve(img2, filter2, mode='same', method=method) 

此函数的输出(method)与correlateconvolve一起使用。

scipy.signal.correlation_lags

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.correlation_lags.html#scipy.signal.correlation_lags

scipy.signal.correlation_lags(in1_len, in2_len, mode='full')

计算一维交叉相关的滞后/位移索引数组。

参数:

in1_len整数

第一个输入大小。

in2_len整数

第二个输入大小。

模式str {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串。有关更多信息,请参阅文档correlate

返回:

lags数组

返回一个包含交叉相关滞后/位移索引的数组。可以使用相关性的 np.argmax 来索引 lag/displacement。

另请参阅

correlate

计算 N 维交叉相关。

注意事项

连续函数(f)和(g)的交叉相关定义为:

[\left ( f\star g \right )\left ( \tau \right ) \triangleq \int_{t_0}^{t_0 +T} \overline{f\left ( t \right )}g\left ( t+\tau \right )dt]

其中(\tau)定义为位移,也称为滞后。

离散函数(f)和(g)的交叉相关定义为:

[\left ( f\star g \right )\left [ n \right ] \triangleq \sum_{-\infty}^{\infty} \overline{f\left [ m \right ]}g\left [ m+n \right ]]

其中(n)为滞后。

示例

信号与其自身延迟的交叉相关。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> x = rng.standard_normal(1000)
>>> y = np.concatenate([rng.standard_normal(100), x])
>>> correlation = signal.correlate(x, y, mode="full")
>>> lags = signal.correlation_lags(x.size, y.size, mode="full")
>>> lag = lags[np.argmax(correlation)] 

scipy.signal.bspline

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.bspline.html#scipy.signal.bspline

scipy.signal.bspline(x, n)

自版本 1.11.0 起已弃用:scipy.signal.bspline 在 SciPy 1.11 中已弃用,并将在 SciPy 1.13 中移除。

对于浮点数组 x 的精确等价物是:

>>> import numpy as np
>>> from scipy.interpolate import BSpline
>>> knots = np.arange(-(n+1)/2, (n+3)/2)
>>> out = BSpline.basis_element(knots)(x)
>>> out[(x < knots[0]) | (x > knots[-1])] = 0.0 

阶数为 n 的 B 样条基函数。

参数:

xarray_like

一个结点向量

nint

样条的阶数。必须是非负的,即 n >= 0

返回:

resndarray

B 样条基函数值

另请参见

cubic

一个立方 B 样条。

quadratic

一个二次 B 样条。

注意事项

使用 numpy.piecewise 和自动函数生成器。

示例

我们可以计算几个阶数的 B 样条基函数:

>>> import numpy as np
>>> from scipy.signal import bspline, cubic, quadratic
>>> bspline(0.0, 1)
1 
>>> knots = [-1.0, 0.0, -1.0]
>>> bspline(knots, 2)
array([0.125, 0.75, 0.125]) 
>>> np.array_equal(bspline(knots, 2), quadratic(knots))
True 
>>> np.array_equal(bspline(knots, 3), cubic(knots))
True 
posted @ 2024-06-27 17:11  绝不原创的飞龙  阅读(111)  评论(0)    收藏  举报