返回函数值时处理复数

Handling Complex Numbers while returning function values

我正在尝试求解方程

f(x) = cos(x) - sqrt(x)

在 python

中使用 Newton-Raphson 方法
f'(x) = -sin(x) - (1/2*sqrt(x))

对于我的初步猜测,我正在尝试从 0 到 4 的值。它在 0.00001 到 2.45 的范围内工作正常

图形看起来像这样

问题是2.45以后,进入虚数(复数)。我如何处理生成复数?

import numpy as np
def eqn(x):
    return np.cos(x) - np.sqrt(x)

def eqn_derivation(x):
    return (-(1/(2*(np.sqrt(x)))) - (np.sin(x))) 

def new-raphson(eqn,eqn_derivation,start_guess,eps):
            x0=start_guess
            if funDeriv(x0) != 0:
                x1=x0-fun(x0)/funDeriv(x0)
                while np.abs(x1-x0)>eps:
                    x0=x1
                    if funDeriv(x0) != 0:
                        x1=x0-fun(x0)/funDeriv(x0)
            return x1

Wolfram Alpha suggests that 2nd iteration spits out complex numbers. I'm not sure how to return/generate/convert/handle function values returning complex numbers

(1) 你没有。

通常(或默认情况下),我们假设搜索 space 在真正的笛卡尔平面上。对于 x < 0,您的函数和导数未定义。因此,您需要朝该方向迈出较小的一步,或者在过程的收敛半径内搜索 x 的值。

(2) 你已经这样做了。

另一种可能性是像您一样继续搜索 4D 复数 space。您得到的答案在 space 中是相当合理的。看看你的答案:实部就是你想要的,虚部非常接近于零。

如果您需要一个证明收敛的纯实数答案,则取该实数部分并将其作为初始猜测反馈回您的算法。您将在两次迭代中收敛到经过验证的结果。

我能够使用 CMATH Library

来解决这个问题
import numpy as np
def eqn(x):
    return cmath.cos(x) - cmath.sqrt(x)

def eqn_derivation(x):
    return (-(1/(2*(cmath.sqrt(x)))) - (cmath.sin(x))) 

def new-raphson(eqn,eqn_derivation,start_guess,eps):
            x0=start_guess
            if funDeriv(x0) != 0:
                x1=x0-fun(x0)/funDeriv(x0)
                while np.abs(x1-x0)>eps:
                    x0=x1
                    if funDeriv(x0) != 0:
                        x1=x0-fun(x0)/funDeriv(x0)
            return x1

输出 -

(0.6417, (0.6417-5.61e-28j))