gpt4 book ai didi

python - 带有导数 : TypeError: 'numpy.float64' object is not callable 的 Scipy Newton

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:50 25 4
gpt4 key购买 nike

我对 scipy 的 newton 方法有疑问。当我使用带有给定导数的牛顿时出现错误(错误输出见下文)。

我正在尝试计算 x**2 的根,起始值为 x0 = 2.0:

def test_newtonRaphson():
def f(x):
resf = x**2
return resf
assert(derivative(f, 1.0)) == 2.0
assert(round(newton(f, 0.0), 10)) == 0.0
dfx0 = derivative(f, 2.0)
assert(round(newton(f, 2.0, dfx0), 10)) == 0.0

整个错误输出如下:

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

func = <function f at 0x04049EF0>, x0 = 2.0, fprime = 4.0, args = ()
tol = 1.48e-08, maxiter = 50, fprime2 = None

def newton(func, x0, fprime=None, args=(), tol=1.48e-8, maxiter=50,
fprime2=None):
"""
Find a zero using the Newton-Raphson or secant method.

Find a zero of the function `func` given a nearby starting point `x0`.
The Newton-Raphson method is used if the derivative `fprime` of `func`
is provided, otherwise the secant method is used. If the second order
derivate `fprime2` of `func` is provided, parabolic Halley's method
is used.

Parameters
----------
func : function
The function whose zero is wanted. It must be a function of a
single variable of the form f(x,a,b,c...), where a,b,c... are extra
arguments that can be passed in the `args` parameter.
x0 : float
An initial estimate of the zero that should be somewhere near the
actual zero.
fprime : function, optional
The derivative of the function when available and convenient. If it
is None (default), then the secant method is used.
args : tuple, optional
Extra arguments to be used in the function call.
tol : float, optional
The allowable error of the zero value.
maxiter : int, optional
Maximum number of iterations.
fprime2 : function, optional
The second order derivative of the function when available and
convenient. If it is None (default), then the normal Newton-Raphson
or the secant method is used. If it is given, parabolic Halley's
method is used.

Returns
-------
zero : float
Estimated location where function is zero.

See Also
--------
brentq, brenth, ridder, bisect
fsolve : find zeroes in n dimensions.

Notes
-----
The convergence rate of the Newton-Raphson method is quadratic,
the Halley method is cubic, and the secant method is
sub-quadratic. This means that if the function is well behaved
the actual error in the estimated zero is approximately the square
(cube for Halley) of the requested tolerance up to roundoff
error. However, the stopping criterion used here is the step size
and there is no guarantee that a zero has been found. Consequently
the result should be verified. Safer algorithms are brentq,
brenth, ridder, and bisect, but they all require that the root
first be bracketed in an interval where the function changes
sign. The brentq algorithm is recommended for general use in one
dimensional problems when such an interval has been found.

"""
if tol <= 0:
raise ValueError("tol too small (%g <= 0)" % tol)
if fprime is not None:
# Newton-Rapheson method
# Multiply by 1.0 to convert to floating point. We don't use float(x0)
# so it still works if x0 is complex.
p0 = 1.0 * x0
fder2 = 0
for iter in range(maxiter):
myargs = (p0,) + args
          fder = fprime(*myargs)

E TypeError: 'numpy.float64' object is not callable

File "C:\Anaconda\lib\site-packages\scipy\optimize\zeros.py", line 116
TypeError

最佳答案

您可以使用 SymPy 计算导数,然后使用 lambdify 将该表达式转换为可与 scipy 一起使用的函数。请注意,lambdify 目前默认不了解 SciPy,因此您必须手动为 scipy 特殊函数添加翻译字典:

In [23]: expr = gamma(1+3/x)/gamma(1+1/x)**3

In [24]: print(expr.diff(x))
3*gamma(1 + 3/x)*polygamma(0, 1 + 1/x)/(x**2*gamma(1 + 1/x)**3) - 3*gamma(1 + 3/x)*polygamma(0, 1 + 3/x)/(x**2*gamma(1 + 1/x)**3)

In [25]: f = lambdify(x, expr.diff(x), ['numpy', {'gamma': scipy.special.gamma, 'polygamma': scipy.special.polygamma}])

此时,我无法使用 newton 函数找到此表达式的任何根。基于来自 Wolfram Alpha 的原始图表,我没有看到导数为 0 的任何明显点,所以如果没有实根,我不会感到惊讶。

关于python - 带有导数 : TypeError: 'numpy.float64' object is not callable 的 Scipy Newton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com