簡體   English   中英

如果稍后再添加print(),Python將為我提供不同的輸出

[英]Python gives me different outputs if I add a print() later on

我對編程非常陌生,只想做一些事情來找到方程x^3 - 1 = xx的近似值。 我知道-2大於0-1小於。 我的想法是,如果我找到平均值並檢查它是否大於或小於0 ,則可以重新定義ab並重復直到得到一個近似值。 不過,我一直很難使它正確執行。 例如,如果我在沒有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進行比較,然后根據該比較重新分配ab 提前致謝。

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 = 0x - x^3 + 1 = 0 您的函數中有其他方程式。

另一個問題是x=-2x=-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將在必要時立即將結果存儲為浮點數。

當前的問題是浮子精度有限。 如果在一百次迭代后打印ab ,則會得到:

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

因此,在某些時候,b永遠不會改變,這就是為什么會出現無限循環的原因。 如果我們以ab的平均值評估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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM