Python中的Newton-Raphson算法不起作用;只向一个方向进行估计

2024-04-23 15:00:23 发布

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

先读:问题很简单,绝对值的括号应该围绕实际分数。现在的问题是,它实际上不够精确,它忽略了0.000001,而且更多的人喜欢0.0001作为公差(当我要求它接近55时,它停在54.994397921372205)。我把容忍度增加到一个疯狂的数值0,然后是1,但是比如说接近50,估计是49.14!!可怕的!为什么会这样?在

更新:必须是float()

我试图找到属于函数的θ,它基于一些向量。我让这段代码在R中运行,我试图把它从R翻译成Python。在

当grensscore等于50时,我想近似θ的值。 我有一个起始值θ=0.5,然后在R中迭代。 在R中只需要大约11次迭代就可以达到目的。在

不幸的是,这在Python中不起作用,我把它隔离了很多:由于某些原因,值只能低于0.5,但不能超过0.5。在这些地方使用打印甚至表明它没有运行代码中的#a部分,而#b部分在运行。这表明这个值永远不会上升,因此我永远找不到像0.4这样的值(因为它必须变为0.5、0.25、0.37.5、0.4375等,但它只能下降;0.5、0.25、0.125迟早会停下来)

我可以看到它运行了很多次,当它必须下降,但它从来没有上升。我也把它们换了一下,看看是否存在顺序效应,但实际上没有:它根本不评估它是否为真(即使我知道它是真的) 有人能看到出什么问题吗,因为这是在R工作?在

def CalcTheta(grensscore, alpha, beta):
    theta = 0.5
    estimate = [10000]   # I just set this to not error on the check
    up = 1
    down = 0

    while((math.fabs(sum(estimate)) - grensscore) > 0.00001):

        if estimate == [10000]:     # I set it like this, 
            estimate = [grensscore] # so it will skip the first run

        # a.
        if (sum(estimate) - grensscore) < 0:
            down = theta
            print(down)
            theta = (theta + up) / 2
            print(theta)

        #b.
        if (sum(estimate) - grensscore) > 0:
            print(up, down, theta)
            up = theta
            theta = (theta + down) / 2
            print(up, down, theta)

        for x in range(len(beta)):
            if x == 0:
                estimate = []

            estimate.append(math.exp(alpha[x] * (theta - beta[x]))  / (1 + math.exp(alpha[x] * (theta - beta[x]))))

    return(theta)

CalcTheta(50, data[:,1], data[:,2])

Tags: 代码alphaifmaththisbetadownsum
2条回答

有一些图书馆可以帮你做到这一点。我建议Scipyscipy.optimize.newton)。配方如下:

http://code.activestate.com/recipes/576762-newton-raphson-root-finding/

问题是

while(math.fabs(sum(estimate)) - grensscore) > 0.00001):

应该是

while(math.fabs(sum(estimate) - grensscore)) > 0.00001):

对于另一部分,它不是float,因此它不是很精确。在

相关问题 更多 >