[TH] ulab EP3 vector

ในบทความเกี่ยวกับ ulab ในตอนที่ 3 นี้ เป็นเรื่องของโมดูลย่อย vector ของ ulab ที่ใช้สำหรับการคำนวณทางคณิตศาสตร์เช่นเดียวกับไลบรารี math ของ MicroPython โดยในเนื้อหาได้แสดงรายการฟังก์ชันที่ ulab บน ESP32 และ ESP8266 รองรับ พร้อมคำอธิบายหน้าที่ของฟังก์ชันนั้น ๆ

vector

ฟังก์ชันในกลุ่มของโมดูลย่อย vector ทำหน้าที่เหมือนฟังก์ชันในไลบรารี math แตกต่างกันในเรื่องของฟังก์ชันใน vector เป็นการคำนวณกับทุกสมาชิกของแถวลำดับ 1 มิติและ 2 มิติที่สร้างขึ้น และมีผลลัพธ์เหมือนการวนรอบเพื่อประมวลผลด้วยการใช้ไลบรารี math กับสมาชิกแต่ละตัว แต่ไม่ต้องทำการวนรอบเองเนื่องจากโมดูลย่อย vector กระทำให้ และประสิทธิภาพที่ได้นั้นดีกว่าการวนรอบเองเนื่องจากไลบรารี ulab ถูกเขียนด้วยภาษา C และอยู่ในระดับล่างกว่าการเขียนวนรอบด้วยภาษาไพธอน

ฟังก์ชันที่โมดูลย่อย vector รองรับได้แก่

  1. ผลลัพธ์ = ulab.vector.acos( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย cosine ซึ่งเป็นการหาส่วนกลับของ cosine
  2. ผลลัพธ์ = ulab.vector.acosh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย coshซึ่งเป็นการหาส่วนกลับของ cosh
  3. ผลลัพธ์ = ulab.vector.arctan2( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tan ซึ่งเป็นการหาส่วนกลับของ tan มีค่ามุมอยู่ในช่วง [-pi,pi]
  4. ผลลัพธ์ = ulab.vector.around( x ) ปัดเศษของตัวเลขทศนิยม
  5. ผลลัพธ์ = ulab.vector.asin( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย sine ซึ่งเป็นการหาส่วนกลับของ sine
  6. ผลลัพธ์ = ulab.vector.asinh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย sinh ซึ่งเป็นการหาส่วนกลับของ sinh
  7. ผลลัพธ์ = ulab.vector.atan( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tan ซึ่งเป็นการหาส่วนกลับของ tan มีค่ามุมอยู่ในช่วง [-pi/2,pi/2]
  8. ผลลัพธ์ = ulab.vector.atanh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tanh ซึ่งเป็นการหาส่วนกลับของ tanh
  9. ผลลัพธ์ = ulab.vector.ceil( x ) ปัดทศนิยมเป็นจำนวนเต็มตัวถัดไป
  10. ผลลัพธ์ = ulab.vector.cos( x ) หาค่ามุมแบบเรเดียนด้วย cosine
  11. ผลลัพธ์ = ulab.vector.erf( x ) คำนวณค่า error ของค่าทางสถิติ
  12. ผลลัพธ์ = ulab.vector.erfc( x ) คำนวณค่า complement error ของค่าทางสถิติ
  13. ผลลัพธ์ = ulab.vector.exp( x ) หาค่าของ ex
  14. ผลลัพธ์ = ulab.vector.expm1( x ) หาค่า ex-1 โดยในบางการใช้งานจะมีความแม่นยำกว่าการใช้ exp(x)
  15. ผลลัพธ์ = ulab.vector.floor( x ) ปัดทศนิยมเป็นจำนวนเต็มตัวก่อนหน้า
  16. ผลลัพธ์ = ulab.vector.gamma( x ) คำนวณหาค่า gamma ของ x
  17. ผลลัพธ์ = ulab.vector.lgamma( x ) คำนวณหาค่า log ของ gamma ของ x
  18. ผลลัพธ์ = ulab.vector.log( x ) หาค่า log ฐานธรรมชาติ
  19. ผลลัพธ์ = ulab.vector.log10( x ) หาค่า log ฐาน 10
  20. ผลลัพธ์ = ulab.vector.log2( x ) หาค่า log ฐาน 2
  21. ผลลัพธ์ = ulab.vector.sin( x ) หาค่า sine ของมุมแบบเรเดียน
  22. ผลลัพธ์ = ulab.vector.sinh( x ) หาค่า hyperbolic sine
  23. ผลลัพธ์ = ulab.vector.sqrt( x ) หาค่ารากที่สอง
  24. ผลลัพธ์ = ulab.vector.tan( x ) หาค่า tangent ของมุมแบบเรเดียน
  25. ผลลัพธ์ = ulab.vector.tanh( x ) หาค่า hyperbolic tan

ฟังก์ชัน math.radians() และ math.degrees() ในการแปลงค่ามุมระหว่างประเภทเรเดียนและองศา

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรม code18-7 เป็นการนำเวกเตอร์ pX และ pY จำนวน 4 สมาชิกซึ่งเป็นพิกัดของจุด 4 จุด เพื่อมาคำนวณขยายให้เป็น 2 เท่าในแกน X และ 4 เท่าในแกน Y กับนำมาหมุน 45 องศา และแสดงผลลัพธ์จากการคำนวณออกมาตามตัวอย่างภาพที่ 1 และเมื่อไปประยุกต์กับการแสดงผลด้วยการหมุนกล่องสี่เหลี่ยมตามเข็มนาฬิกา 360 องศาและทวนเข็มนาฬิกาจะเป็นดังคลิปที่1

# code18-7
import time
import ulab as np
import math

def scale(pX,pY,Sx=1.0,Sy=1.0):
    return ((pX*Sx, pY*Sy))

def rotate(pX,pY,angle):
    rad = math.radians(angle)
    xCos = pX*np.vector.cos(rad)
    ySin = pY*np.vector.sin(rad)
    xSin = pX*np.vector.sin(rad)
    yCos = pY*np.vector.cos(rad)
    newX = xCos - ySin
    newY = xSin + yCos
    return (newX, newY)

pX = np.array([-1,1,1,-1],dtype=np.float)
pY = np.array([1,1,-1,-1],dtype=np.float)
Sx = 2.0
Sy = 4.0
newP = scale(pX,pY,Sx,Sy)
newP2 = rotate(pX, pY, 45.0)
print("Vector X={}".format(pX))
print("Vector Y={}".format(pY))
print("Vector X*Sx={}".format(newP[0]))
print("Vector Y*Sy={}".format(newP[1]))
print("Vector X rot 45 degrees={}".format(newP2[0]))
print("Vector Y rot 45 degrees={}".format(newP2[1]))

ภาพที่ 1 ผลลัพธิ์จากโปรแกรม code18-7
คลิปที่ 1 ตัวอย่างการนำตัวอย่าง code18-7 ไปประยุกต์ใช้งาน

สรุป

จากบทความนี้จะพบว่าชุดคำสั่งของโมดูลย่อย vector เป็นฟังก์ชันการทำงานเหมือนในไลบรารี math เพียงถูกออกแบบมาให้คำนวณกับแถวลำดับ 1 และ 2 มิติ ที่สร้างจาก ulab เพื่อให้มีความเร็วที่ดีกว่าการสั่งวนรอบโดยตรงจากภาษาไพธอน ส่วนบทความครั้งหน้าจะเป็นโมดูลย่อย linalg ซึ่งเป็นโมดูลย่อยด้านพีชคณิตเชิงเส้น

สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-09
ปรับปรุงเมื่อ 2021-08-12