返回函数值时处理复数

2024-05-14 09:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着解这个方程

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

在python中使用Newton-Raphson方法

f'(x) = -sin(x) - (1/2*sqrt(x))

对于我的开始猜测,我尝试从0到4的值,它在0.00001到2.45的范围内运行良好

图表如下所示 enter image description here

问题是,超过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

Wolfram Alpha


Tags: returndefnpsqrtsincosepsstart
2条回答

(1)你没有

通常(或默认情况下),我们假设搜索空间在真实的笛卡尔平面上。您的函数和导数对于x<;因此,您需要在该方向上采取较小的步骤,或者在进程的收敛半径内搜索值x

(2)你已经做到了

另一种可能是继续你有,搜索4D复杂的空间。你得到的答案在那方面是相当合理的。看看你的答案:实部正是你想要的,虚部非常接近于零

如果你需要一个收敛性很强的纯实数答案,那么把这个实数分量作为初始猜测反馈到你的算法中。您将在两次迭代中收敛到一个经过验证的结果

我能用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))

相关问题 更多 >

    热门问题