我对编程非常陌生,只想创建一些东西来找到等式x
的{{1}}的近似值。我知道x^3 - 1 = x
大于-2
且0
更少。我的想法是,如果我找到平均值并检查它是否大于或小于-1
,我可以重新定义0
和a
并重复直到我得到一个近似值。尽管如此,我还是很难让它采取行动。例如,如果我在没有打印(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
进行比较,然后根据该比较重新分配0
或a
?提前谢谢。
b
答案 0 :(得分:2)
将所有等式x^3 - 1 = x
移到一边应该给x^3 - 1 - x = 0
或x - x^3 + 1 = 0
。你的函数中有一个不同的等式。
另一个问题是x=-2
和x=-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)
当前的问题是浮子的精度有限。如果您在一百次迭代后打印a
和b
,则会得到:
a, b = -1.324717957244746, -1.3247179572447458
print((a + b) / 2 # -1.3247179572447458, the same as b
所以在某些时候,b永远不会改变,这就是为什么你得到一个无限循环。如果我们以equation
和a
的平均值评估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的方法,你可以使用它,因为你可以得到导数)