4: Repetition

4-3: Bisection

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 4-3 ข้อที่ 1

รับจำนวนจริง \(a\), \(b\) และ \(e\) จาก input (ในบรรทัดเดียวกัน คั่นด้วยช่องว่าง) แล้วแสดงคำว่า close enough ถ้า \(|a-b| \leq e \cdot max(|a|,|b|)\) เป็นจริง ไม่เช่นนั้น แสดงว่า not equal

___inp___ = ["1 1 1e-10"] def input(): return ___inp___[0] x = input().split() a = float(x[0]) b = float(x[1]) e = float(x[2]) x = input().split() a = float(x[0]) b = float(x[1]) e = float(x[2]) if abs(a-b) <= e*max(abs(a),abs(b)): print("close enough") else: print("not equal") for v in ["0.1 0.1000000001 1e-9", "0.1 0.1000000001 1e-10", \ "0 2 1", "-1 -1 1"]: Ex().has_equal_output(pre_code="___inp___[0] ='"+str(v)+"'", incorrect_msg = "ผิด เช่น กรณี x = " + str(v))
แบบฝึกหัด 4-3 ข้อที่ 2

รับจำนวนจริง x จาก input แล้วใช้วิธี bisection หาและแสดงค่าของ \(\sqrt[^3]{x}\) (รากที่ 3 ของ \(x\))
กำหนดให้ \(a\) และ \(b\) มีค่าเกือบเท่ากัน เมื่อ \(|a-b| \leq 10^{-6}max(|a|,|b|)\)

___inp___ = ["1"] def input(): return ___inp___[0] x = float(input()) L = 0; U = x r = (L + U)/2 r3 = r**3 while abs(r3-x) > 1e-6*max(r3, x): if r3 > x: U = r else: L = r r = (L + U)/2 r3 = r**3 print(r) Ex().check_while(missing_msg="ควรฝึกใช้วงวน while") for v in [8, 27, 64.0, 125.0, 1000.0, 970299]: Ex().has_equal_output(pre_code="___inp___[0] ='"+str(v)+"'", incorrect_msg = "ผิด เช่น กรณี x = " + str(v))
ดูการทำงานของ bisection เพื่อหารากที่ 2 ใน VDO แล้วปรับให้หารากที่ 3