Scipy.optimize.newton 用于复值函数

问题描述 投票:0回答:1

我正在尝试使用 scipy.optimize.newton 为复杂的值函数找到根。当我将函数的导数作为参数之一传递时,该函数效果很好,因此使用了牛顿-拉夫森方法,但是,当我不传递导数并尝试仅使用一个初始猜测的割线方法时(它可以工作,如果第二个初始猜测通过,因此有问题的行被跳过),它会生成以下错误:

# I understand the error I was just wondering if there's a workaround.
x, r = optimize.newton(f_complex, x0=complex(5, -2), tol=1e-9, full_output=True)

# Error
File "C:\...\Python\Python310\lib\site-packages\scipy\optimize\zeros.py", line 325, in newton
p1 += (eps if p1 >= 0 else -eps)
TypeError: '>=' not supported between instances of 'complex' and 'int'

这是我尝试过的:

from scipy import optimize

def f(z):
    return z**2 + 1 

def fp(z):
    return 2 * z

# works
x, r = x, r = optimize.newton(f, x0=complex(5, -2), fprime=fp, tol=1e-9, full_output=True)
print(r)

# does not work
x, r = x, r = optimize.newton(f, x0=complex(5, -2), tol=1e-9, full_output=True)
print(r)

#  works if I pass a second initial guess thus line #325 is skipped
x, r = x, r = optimize.newton(f, x0=complex(5, -2), tol=1e-9, full_output=True, x1=complex(4, -1.5))
print(r)

我的问题是:

内割法适用于复值函数吗?

python scipy
1个回答
0
投票

该错误与内置的复杂赋值有关。如果您使用类似 np.complex128(1+1j) 的东西,错误就会被纠正。至于为什么会出现这种情况,我不确定,但它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.