本文简要介绍 python 语言中 scipy.optimize.newton
的用法。
用法:
scipy.optimize.newton(func, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)#
使用 Newton-Raphson(或正割法或哈雷法)求实函数或复函数的根。
给定附近的标量起点 x0,求 scalar-valued 函数 func 的根。如果提供了 func 的导数 fprime,则使用 Newton-Raphson 方法,否则使用割线方法。如果还提供了 func 的二阶导数 fprime2,则使用哈雷法。
如果x0是一个包含多个项目的序列,
newton
返回一个数组:从每个(标量)起点开始的函数根x0.在这种情况下,函数必须矢量化以返回与其第一个参数相同形状的序列或数组。如果fprime(fprime2) ,那么它的返回也必须具有相同的形状:每个元素都是一阶(二阶)导数函数关于在其第一个参数的每个元素处评估的唯一变量。newton
用于查找单个变量的scalar-valued 函数的根。对于涉及多个变量的问题,请参阅root
。- func: 可调用的
需要其根的函数。它必须是以下形式的单个变量的函数
f(x,a,b,c...)
,其中a,b,c...
是可以在参数范围。- x0: 浮点数、序列或 ndarray
对根的初步估计应该接近实际根。如果不是标量,则 func 必须向量化并返回与其第一个参数形状相同的序列或数组。
- fprime: 可调用的,可选的
可用且方便的函数的导数。如果它是无(默认),则使用割线法。
- args: 元组,可选
要在函数调用中使用的额外参数。
- tol: 浮点数,可选
根值的允许误差。如果函数是complex-valued,一个更大的tol推荐作为实部和虚部x有助于
|x - x0|
.- maxiter: 整数,可选
最大迭代次数。
- fprime2: 可调用的,可选的
可用且方便时函数的二阶导数。如果为无(默认),则使用普通的Newton-Raphson 或割线法。如果不是 None,则使用 Halley 方法。
- x1: 浮点数,可选
根的另一个估计值应该接近实际根。如果未提供 fprime,则使用。
- rtol: 浮点数,可选
终止公差(相对)。
- full_output: 布尔型,可选
如果full_output为 False(默认),则返回根。如果为真并且x0是标量,返回值为
(x, r)
,其中x
是根和r
是一个RootResults
目的。如果为真并且x0是非标量,返回值为(x, converged, zero_der)
(有关详细信息,请参阅返回部分)。- disp: 布尔型,可选
如果为 True,如果算法没有收敛,则引发 RuntimeError,错误消息包含迭代次数和当前函数值。否则,收敛状态记录在一个
RootResults
返回对象。忽略如果x0不是标量。注意:这与显示无关,但是,`disp` 关键字不能重命名以实现向后兼容性。
- root: 浮点数、序列或 ndarray
函数为零的估计位置。
- r:
RootResults
,可选 呈现如果
full_output=True
和x0是标量。包含有关收敛信息的对象。特别是,r.converged
如果例程收敛,则为 True。- converged: bool的ndarray,可选
呈现如果
full_output=True
和x0是非标量的。对于向量函数,指示哪些元素成功收敛。- zero_der: bool的ndarray,可选
呈现如果
full_output=True
和x0是非标量的。对于向量函数,指示哪些元素具有零导数。
参数 ::
返回 ::
注意:
Newton-Raphson方法的收敛速度是二次的,哈雷方法是三次的,割线方法是sub-quadratic。这意味着,如果函数是well-behaved,则第 n 次迭代后估计根中的实际误差大约是第 (n-1) 步后误差的平方(对于 Halley 来说是立方)。然而,这里使用的停止标准是步长,并不能保证找到根。因此,应验证结果。更安全的算法有 brentq、brenth、ridder 和 bisect,但它们都要求根首先被括在函数改变符号的区间中。当找到这样的区间时,建议将 brentq 算法一般用于一维问题。
当
newton
与数组一起使用时,它最适合解决以下类型的问题:初始猜测 x0 与根的距离都相对相同。
部分或全部额外参数 args 也是数组,因此可以一起解决一类类似问题。
初始猜测的大小 x0 大于 O(100) 个元素。否则,朴素循环的性能可能与向量一样好或更好。
例子:
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy import optimize
>>> def f(x): ... return (x**3 - 1) # only one real root at x = 1
fprime
未提供,使用割线法:>>> root = optimize.newton(f, 1.5) >>> root 1.0000000000000016 >>> root = optimize.newton(f, 1.5, fprime2=lambda x: 6 * x) >>> root 1.0000000000000016
仅提供
fprime
,使用Newton-Raphson方法:>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2) >>> root 1.0
fprime2
和fprime
都提供,使用哈雷法:>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2, ... fprime2=lambda x: 6 * x) >>> root 1.0
当我们想要找到一组相关起始值和/或函数参数的根时,我们可以将它们作为输入数组提供:
>>> f = lambda x, a: x**3 - a >>> fder = lambda x, a: 3 * x**2 >>> rng = np.random.default_rng() >>> x = rng.standard_normal(100) >>> a = np.arange(-50, 50) >>> vec_res = optimize.newton(f, x, fprime=fder, args=(a, ), maxiter=200)
以上相当于在for-loop中分别求解
(x, a)
中的每个值,只是更快:>>> loop_res = [optimize.newton(f, x0, fprime=fder, args=(a0,), ... maxiter=200) ... for x0, a0 in zip(x, a)] >>> np.allclose(vec_res, loop_res) True
绘制为
a
的所有值找到的结果:>>> analytical_result = np.sign(a) * np.abs(a)**(1/3) >>> fig, ax = plt.subplots() >>> ax.plot(a, analytical_result, 'o') >>> ax.plot(a, vec_res, '.') >>> ax.set_xlabel('$a$') >>> ax.set_ylabel('$x$ where $f(x, a)=0$') >>> plt.show()
相关用法
- Python SciPy optimize.newton_krylov用法及代码示例
- Python SciPy optimize.nnls用法及代码示例
- Python SciPy optimize.rosen_der用法及代码示例
- Python SciPy optimize.line_search用法及代码示例
- Python SciPy optimize.rosen用法及代码示例
- Python SciPy optimize.shgo用法及代码示例
- Python SciPy optimize.minimize_scalar用法及代码示例
- Python SciPy optimize.root用法及代码示例
- Python SciPy optimize.fmin用法及代码示例
- Python SciPy optimize.NonlinearConstraint用法及代码示例
- Python SciPy optimize.KrylovJacobian用法及代码示例
- Python SciPy optimize.toms748用法及代码示例
- Python SciPy optimize.linprog_verbose_callback用法及代码示例
- Python SciPy optimize.bracket用法及代码示例
- Python SciPy optimize.milp用法及代码示例
- Python SciPy optimize.diagbroyden用法及代码示例
- Python SciPy optimize.bisect用法及代码示例
- Python SciPy optimize.isotonic_regression用法及代码示例
- Python SciPy optimize.golden用法及代码示例
- Python SciPy optimize.brute用法及代码示例
- Python SciPy optimize.fsolve用法及代码示例
- Python SciPy optimize.Bounds用法及代码示例
- Python SciPy optimize.fixed_point用法及代码示例
- Python SciPy optimize.rosen_hess用法及代码示例
- Python SciPy optimize.broyden1用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.newton。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。