Lab 4 : Trigonometric Sine

 

ผู้ที่ผ่านปฏิบัติการนี้จะสามารถ

  • สร้างและใช้ตัวแปรประเภท double
  • ใช้ตัวปฏิบัติการทางคณิตศาสตร์
  • ใช้คำสั่งวงวน

ข้อกำหนด

โดยปกติเวลาที่เราต้องการคำนวณค่าของฟังก์ชันพื้นฐานทางคณิตศาสตร์จำพวก sine, cosine, tan, exp, log ก็มักจะนึกถึง class Math ซึ่งเป็น class มาตรฐานของ Java 2

สำหรับปฎิบัติการนี้ เราจะมาเขียน method ของเราเองเพื่อคำนวณค่าของฟังก์ชัน sin(x) โดยใช้ฟังก์ชันการประมาณค่าของ sine(x) ข้างล่างนี้

 

โดยที่ x มีหน่วยเป็น radian  แต่ว่าเราคงไม่คำนวณไปจนถึงพจน์ที่อนันต์หรอก เราจะคำนวณไปถึงพจน์ที่มีค่าน้อยๆ ที่คิดว่าน่าจะได้ผลลัพธ์ที่มีความละเอียดพอแล้ว เช่นจะคำนวณไปจนถึงเมื่อ มีค่าน้อยกว่า 1.0 x 10-10 ก็น่าจะพอ

จงเติมรายละเอียดของ method sin(x) ใน class Lab4  ซึ่งรับ x มีหน่วยเป็น radian และคืนค่าของ sin(x) ซึ่งหาได้จากการคำนวณด้วยฟังก์ชันที่แสดงข้างบนนี้ 

คะแนนเต็ม : 15 คะแนน

  • ตอบคำถามย่อยตอนต้น  5  คะแนน (ระบบตรวจให้อัตโนมัติ)
  • เขียนโปรแกรม  10 คะแนน  (ระบบตรวจให้อัตโนมัติ เมื่อกดปุ่ม F6)

เวลาปฏิบัติการ : 45 นาที

อย่าลืม

  • กดปุ่ม F5 เป็นการสั่งทำงานคลาส Lab4 ซึ่งจะรับมุมเป็นองศาจากแป้นพิมพ์ แปลงเป็น radian แล้วแสดงค่า sine ที่หาได้ เปรียบเทียบกับค่า sine จาก Math.sin
  • กดปุ่ม F6 เป็นการสั่งทำงาน TestScript เพื่อทดสอบและให้คะแนน
  • ถ้ามี window โผล่มาเตือนเรื่อง Virus (จากโปรแกรม Norton) ให้เลือกช่องที่อนุญาตให้ทำต่อ (Allow....)

ข้อแนะนำในการเขียนโปรแกรมนี้

  • อย่าคำนวณ xk/k! ด้วยการคำนวณ xk และ k! แล้วนำมาหารกัน เพราะเสียเวลา อีกทั้งค่า xk และ k! อาจเป็นค่าที่ใหญ่มากๆ
  • ให้คำนวณพจน์ xk/k! ใหม่ จากพจน์เก่าที่คำนวณมาก่อนหน้านี้  เช่น อยากจะคำนวณ x17 / 17! ก็ให้นำค่าของ x15 / 15! ซึ่งคำนวณไว้แล้ว มาคูณด้วย x2/(16*17)  ก็จะได้ x17/17!
  • เก็บ xk / k! ของรอบที่แล้ว เพิ่มนำมาคำนวณหา xk / k! ของรอบใหม่
  • เนื่องจากแต่ละพจน์จะสลับเครื่องหมาย + - + - ไปเรื่อยๆ ซึ่งทำได้โดยการคูณด้วย (-1) 
  • โดยรวมมีตัวแปร sine และ term,  เริ่มต้น  sine = x และ term = x  จากนั้นเข้าวงวนเพิ่อคำนวณ
    • term = (-1) * term * x2 / (3*2);       sine += term;
    • term = (-1) * term * x2 / (5*4);       sine += term;
    • term = (-1) * term * x2 / (7*5);       sine += term;
    • term = (-1) * term * x2 / (9*8);       sine += term;
    • ...
    • ทำไปเรื่อยๆ จนกว่า |term| < 1.0 x 10-10