0

我正在尝试求解方程

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 建议第二次迭代输出复数。我不确定如何返回/生成/转换/处理返回复数的函数值

沃尔夫拉姆阿尔法

4

2 回答 2

0

(1) 你没有。

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

(2) 你已经这样做了。

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

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

于 2019-09-17T16:44:21.960 回答
0

我能够使用CMath 库解决答案

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))

于 2019-09-21T17:50:17.060 回答