題目描述
來源
OpenJudge網站 —— 百練習題集-第4142號習題
要求
總時間限制: 3000ms 單個測試點時間限制: 1000ms 內存限制: 65536kB
描述
有函數:
f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121
已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在區間 [1.5,2.4] 有且只有一個根,請用二分法求出該根。
輸入
無。
輸出
該方程在區間[1.5,2.4]中的根。要求四捨五入到小數點後6位。
樣例輸入
無
樣例輸出
不提供
解題思路
- 對於區間[x1, x2],令mid = (x1 + x2) / 2,即mid是區間中點。如果f(mid)大於0,則在[mid, x2]區間內尋找函數的零點。如果f(mid)小於0,則在[x1, mid]區間內找函數的零點。
- 上述步驟不斷重複,直至x2 - x1小於10-7。此即爲二分法求函數的零點。
參考答案
def f(x):
return x**5 - 15 * x**4 + 85 * x**3 - 225 * x**2 + 274 * x - 121
LIMIT = 10**-7
x1 = 1.5
x2 = 2.4
while x2 - x1 > LIMIT:
mid = (x1 + x2) / 2
y = f(mid)
if y > 0:
x1 = mid
elif y < 0:
x2 = mid
print("%.6f"%((x1 + x2) / 2))
測試用例
無。
小結
- 二分法是典型的算法。本題採用的算法本質上是二分查找法。
- 二分查找算法步驟中的每一輪排除掉一半的查找範圍(也叫搜索空間)。