如果我稍后在

时间:2017-09-07 16:29:29

标签: python

我对编程非常陌生,只想创建一些东西来找到等式x的{​​{1}}的近似值。我知道x^3 - 1 = x大于-20更少。我的想法是,如果我找到平均值并检查它是否大于或小于-1,我可以重新定义0a并重复直到我得到一个近似值。尽管如此,我还是很难让它采取行动。例如,如果我在没有打印(i)的情况下运行此块,我将获得b这是平均值,但是当我在函数-1.5中放置print(total)时看它是否正常工作,它甚至没有向我显示,只是输出equation(n)。如果我将-8.881784197001252e-16放在print(i)种可能性的末尾,例如,它会打印if/else然后16。我使用的是PyCharm CE。

除了这个小故障,我的逻辑是否正确?通过将占位符设置为-8.881784197001252e-16,它将运行while循环。 while循环将获得1的新值并运行该函数,将其与n进行比较,然后根据该比较重新分配0a?提前谢谢。

b

2 个答案:

答案 0 :(得分:2)

将所有等式x^3 - 1 = x移到一边应该给x^3 - 1 - x = 0x - x^3 + 1 = 0。你的函数中有一个不同的等式。

另一个问题是x=-2x=-1之间的两个方程之间没有交叉(见here)。在您看到十字路口之前,您需要将窗口展开到x=2

在数值分析中经常发生的事情(你会看到这种类型的问题)是,而不是试图找到实际使等式给出x的{​​{1}},我们寻找一个值产生低于可接受误差水平的0。另一种方法是测试x

如果我们使用所有这些来调整您所拥有的内容,那么

while b - a > tol:

注意:如果删除浮动并且只执行

,这样可以正常工作
a = float(-2)
b = float(2)
tol = 0.001

def equation(n):
    return float(n - n**3 + 1)

n = (a + b) / 2
iter = 0
while abs(equation(n) - 0) > tol and iter < 100:
    iter+=1

    if equation(n) > 0.0:
        a = n
    else:
        b = n

    n = (a + b) / 2

    print(iter,a,b,equation(n))

因为python已经根据需要重新创建了值。试试

a = -2
b = 2
#...etc

所以python会在必要时将结果存储为float。

答案 1 :(得分:1)

当前的问题是浮子的精度有限。如果您在一百次迭代后打印ab,则会得到:

a, b = -1.324717957244746, -1.3247179572447458
print((a + b) / 2  # -1.3247179572447458, the same as b

所以在某些时候,b永远不会改变,这就是为什么你得到一个无限循环。如果我们以equationa的平均值评估b,您将得到-8.881784197001252e-16,这是您一直看到的值。

但是这永远不会收敛到完全零因为解决方案是irrational,所以即使你有无限的精度,方程也永远不会等于零。

解决此问题的常用方法是避免比较浮点数:

if a == b               # don't do this
if abs(a - b) < epsilon      # do this, where epsilon is some small value

(注意:你所描述的是bisection method,它比高阶算法慢,例如Newton的方法,你可以使用它,因为你可以得到导数)