2016-08-02 70 views
0

所以我完全不熟悉編碼,我正在參加麻省理工Openware課程入門(我正在使用本書介紹計算和使用Python編程)如何更改代碼以查找負數和正數的立方根的近似值?

此外,由於我是新來的,有點害怕我的問題質量低下,所以請指出,如果你認爲我應該改善我提問的方式。

在3.4,我給出的代碼:

x = int(input("Please enter an integer: ")) 
epsilon = 0.01 
numGuesses = 0 
low = -100 
high = max(1.0, x) 
ans = (high + low)/2.0 
while abs(ans**2 -x) >= epsilon: 
     print ("low = ", low, "High=", high, "ans=", ans) 
     numGuesses += 1 
     if ans**2 < x: 
      low = ans 
     else: 
      high = ans 
     ans = (high + low)/2.0 
print ("numGuesses =", numGuesses) 
print (ans, "Is close to square root of", x) 

所以我試圖做的首先是瞭解代碼的每一行,它到底做了什麼。我已經得到了提示:「考慮改變低點以確保答案在於正在搜索的區域內。)

我試圖將低位改爲負數,我嘗試添加,如果低位更少大於0,則低= - 低這樣的:

x = int(input("Please enter an integer: ")) 
epsilon = 0.01 
numGuesses = 0 
low = 0.0 
if low < 0: 
    low = -low 
high = max(1.0, x) 
ans = (high + low)/2.0 
while abs(ans**2 -x) >= epsilon: 
     print ("low = ", low, "High=", high, "ans=", ans) 
     numGuesses += 1 
     if ans**2 < x: 
      low = ans 
     else: 
      high = ans 
     ans = (high + low)/2.0 
print ("numGuesses =", numGuesses) 
print (ans, "Is close to square root of", x) 

不過我可能採取了錯誤的做法...

回答

-1

你的算法是通過dichotomy method數值搜索應用於X^2-X = 0,只要低於溶液,它就會收斂(實際上相當快)到解X = sqrt(x),並且高於解。

在你的情況下,x總是高於sqrt(x),0總是低於sqrt(x)。 答案將始終在搜索區域,您可以儘可能多地降低epsilon。改變low的初始化沒有意義。如果你把它降低到負值,這將只需要幾個步驟,大致的log 2(ABS(低))

變化

ans**2 

ans**3 

和你的算法收斂到x的立方根。

負數的立方根沒有很好的定義,我猜他們的意思是絕對值的立方根乘以-1。所以(-3)^ 3 = -9 如果x < 0,用abs替換x(x),運行該算法並返回乘以-1的解。

+0

您仍然可以使用此方法查找負數的平方根。只需找到數字絕對值的平方根,然後將結果乘以* i *即可。當然負數可以有立方根:-3 * -3 * -3 = -27。 – chepner

+0

不,確切地說,-3不是-27的立方根,它是X^3 + 27 = 0的三個根中的一個,這就是爲什麼面額有點不適合的原因。按照慣例,平方根通常指的是正數,並且被定義爲多項式X 2 -x = 0的唯一正根。這只是一個慣例問題。 – marmouset

-2

此:

low = 0.0 
if low < 0: 
low = -low 

字面上什麼都不做。您設置了low = 0,然後檢查它是否小於0(不是)。另外,0既是正數又是負數,所以改變它的符號什麼也不做。

恐怕我完全不瞭解這個問題,但它看起來像highlow是你期望的方形/立方根是什麼?

如果x是負數,那麼你想確保你的下限可以包含它。也許設置low = x會有幫助嗎?

1

你非常接近,爲了將程序轉換爲找到正數和負數的立方根的近似值,您只需更改算法搜索的範圍。

找正數的立方根:

x = 8 
epsilon = 0.01 
numGuesses = 0 
high = max(1.0, x) 
low = 0.0 

ans = (high + low)/2.0 

while abs((pow(ans,3)- x)) >= epsilon: 

    print("low ",low," ,high ",high," ans ",ans) 
    numGuesses += 1 

    if pow(ans,3) < x: 
     low = ans 

    else: 
     high = ans 

    ans = (high + low) /2.0 

print("numguesses , = "+str(numGuesses)) 
print(str(ans)+"is close to square root of x "+ str(x)) 

低和高之間的算法搜索。 假設用戶輸入一個數字,8表示高= 8,低= 0.0,然後執行搜索並輸出2.0,如果用戶輸入一個負數,比如-8,然後高= 1.0,低= 0.0,則不會出現爲正確,正確的限制應該是[-8,0)(負數的立方根是負數)「忽略複數根」,在這種情況下,高= 0和低= -8。 你可以通過簡單的if語句來完成。

x = 8 
epsilon = 0.01 
numGuesses = 0 
high = max(1.0, x) 
low = 0.0 



if x < 0: 
low = x 
else: 
None 

ans = (high + low)/2.0 

while abs((pow(ans,3)- x)) >= epsilon: 

    print("low ",low," ,high ",high," ans ",ans) 
    numGuesses += 1 

    if pow(ans,3) < x: 
     low = ans 

    else: 
     high = ans 

    ans = (high + low) /2.0 
print("numguesses , = "+str(numGuesses)) 
print(str(ans)+"is close to square root of x "+ str(x)) 

我希望這是一個初學者友好的答案。