[英]Python gives me different outputs if I add a print() later on
我對編程非常陌生,只想做一些事情來找到方程x^3 - 1 = x
的x
的近似值。 我知道-2
大於0
而-1
小於。 我的想法是,如果我找到平均值並檢查它是否大於或小於0
,則可以重新定義a
和b
並重復直到得到一個近似值。 不過,我一直很難使它正確執行。 例如,如果我在沒有print(i)的情況下運行此塊,我將得到-1.5
,這是平均值,但是當我將print(total)
放到函數equation(n)
以查看其是否正常工作時,它會甚至沒有告訴我,僅輸出-8.881784197001252e-16
。 如果我將print(i)
放在if/else
可能性的末尾,例如這樣,它將打印16
,然后-8.881784197001252e-16
。 我正在使用PyCharm CE。
除了這個小故障,我的邏輯是否正確? 通過將占位符設置為1
,它將運行while循環。 while循環將獲取新的n
值並運行該函數,將其與0
進行比較,然后根據該比較重新分配a
或b
? 提前致謝。
a = float(-2)
b = float(-1)
n = ((a+b)/2)
print(n)
def equation(n):
total = float((n - n**3 - 1))
return total
i = 1
while i != 0:
n = ((a + b) / 2)
if (equation(n)) > 0.0:
a = n
i = equation(n)
print(i)
else:
b = n
i = equation(n)
print(i)
將所有方程x^3 - 1 = x
移到一側應使x^3 - 1 - x = 0
或x - x^3 + 1 = 0
。 您的函數中有其他方程式。
另一個問題是x=-2
和x=-1
之間的兩個方程之間沒有交集(請參閱此處 )。 您需要先將窗口擴展到x=2
然后才能看到交集。
一些經常發生的數值分析(在那里你會看到這種類型的問題)是不是試圖找到x
,實際上使方程給出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))
注意:如果您移除浮子,然后這樣做,就可以正常工作
a = -2
b = 2
#...etc
因為python已經根據需要重鑄了值。 嘗試
>>> type(3)
<class 'int'>
>>> type(3.5)
<class 'float'>
>>> type(float(3))
<class 'float'>
>>> type(3/5)
<class 'float'>
因此python將在必要時立即將結果存儲為浮點數。
當前的問題是浮子精度有限。 如果在一百次迭代后打印a
和b
,則會得到:
a, b = -1.324717957244746, -1.3247179572447458
print((a + b) / 2 # -1.3247179572447458, the same as b
因此,在某些時候,b永遠不會改變,這就是為什么會出現無限循環的原因。 如果我們以a
和b
的平均值評估equation
,您將得到-8.881784197001252e-16,這是您一直看到的值。
但是,這絕不會收斂到恰好為零,因為該解決方案是不合理的 ,所以即使你有無限的精度,方程永遠不會等於零。
解決此問題的常用方法是避免比較浮點數:
if a == b # don't do this
if abs(a - b) < epsilon # do this, where epsilon is some small value
(注意:您要描述的是二分法 ,它比高階算法(例如牛頓法)要慢,您可以使用它,因為可以獲得導數)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.