ในบทความเกี่ยวกับ ulab ในตอนที่ 3 นี้ เป็นเรื่องของโมดูลย่อย vector ของ ulab ที่ใช้สำหรับการคำนวณทางคณิตศาสตร์เช่นเดียวกับไลบรารี math ของ MicroPython โดยในเนื้อหาได้แสดงรายการฟังก์ชันที่ ulab บน ESP32 และ ESP8266 รองรับ พร้อมคำอธิบายหน้าที่ของฟังก์ชันนั้น ๆ
vector
ฟังก์ชันในกลุ่มของโมดูลย่อย vector ทำหน้าที่เหมือนฟังก์ชันในไลบรารี math แตกต่างกันในเรื่องของฟังก์ชันใน vector เป็นการคำนวณกับทุกสมาชิกของแถวลำดับ 1 มิติและ 2 มิติที่สร้างขึ้น และมีผลลัพธ์เหมือนการวนรอบเพื่อประมวลผลด้วยการใช้ไลบรารี math กับสมาชิกแต่ละตัว แต่ไม่ต้องทำการวนรอบเองเนื่องจากโมดูลย่อย vector กระทำให้ และประสิทธิภาพที่ได้นั้นดีกว่าการวนรอบเองเนื่องจากไลบรารี ulab ถูกเขียนด้วยภาษา C และอยู่ในระดับล่างกว่าการเขียนวนรอบด้วยภาษาไพธอน
ฟังก์ชันที่โมดูลย่อย vector รองรับได้แก่
- ผลลัพธ์ = ulab.vector.acos( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย cosine ซึ่งเป็นการหาส่วนกลับของ cosine
- ผลลัพธ์ = ulab.vector.acosh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย coshซึ่งเป็นการหาส่วนกลับของ cosh
- ผลลัพธ์ = ulab.vector.arctan2( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tan ซึ่งเป็นการหาส่วนกลับของ tan มีค่ามุมอยู่ในช่วง [-pi,pi]
- ผลลัพธ์ = ulab.vector.around( x ) ปัดเศษของตัวเลขทศนิยม
- ผลลัพธ์ = ulab.vector.asin( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย sine ซึ่งเป็นการหาส่วนกลับของ sine
- ผลลัพธ์ = ulab.vector.asinh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วย sinh ซึ่งเป็นการหาส่วนกลับของ sinh
- ผลลัพธ์ = ulab.vector.atan( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tan ซึ่งเป็นการหาส่วนกลับของ tan มีค่ามุมอยู่ในช่วง [-pi/2,pi/2]
- ผลลัพธ์ = ulab.vector.atanh( x ) หาค่ามุมจากค่าที่ได้จากการคำนวณด้วยค่า tanh ซึ่งเป็นการหาส่วนกลับของ tanh
- ผลลัพธ์ = ulab.vector.ceil( x ) ปัดทศนิยมเป็นจำนวนเต็มตัวถัดไป
- ผลลัพธ์ = ulab.vector.cos( x ) หาค่ามุมแบบเรเดียนด้วย cosine
- ผลลัพธ์ = ulab.vector.erf( x ) คำนวณค่า error ของค่าทางสถิติ
- ผลลัพธ์ = ulab.vector.erfc( x ) คำนวณค่า complement error ของค่าทางสถิติ
- ผลลัพธ์ = ulab.vector.exp( x ) หาค่าของ ex
- ผลลัพธ์ = ulab.vector.expm1( x ) หาค่า ex-1 โดยในบางการใช้งานจะมีความแม่นยำกว่าการใช้ exp(x)
- ผลลัพธ์ = ulab.vector.floor( x ) ปัดทศนิยมเป็นจำนวนเต็มตัวก่อนหน้า
- ผลลัพธ์ = ulab.vector.gamma( x ) คำนวณหาค่า gamma ของ x
- ผลลัพธ์ = ulab.vector.lgamma( x ) คำนวณหาค่า log ของ gamma ของ x
- ผลลัพธ์ = ulab.vector.log( x ) หาค่า log ฐานธรรมชาติ
- ผลลัพธ์ = ulab.vector.log10( x ) หาค่า log ฐาน 10
- ผลลัพธ์ = ulab.vector.log2( x ) หาค่า log ฐาน 2
- ผลลัพธ์ = ulab.vector.sin( x ) หาค่า sine ของมุมแบบเรเดียน
- ผลลัพธ์ = ulab.vector.sinh( x ) หาค่า hyperbolic sine
- ผลลัพธ์ = ulab.vector.sqrt( x ) หาค่ารากที่สอง
- ผลลัพธ์ = ulab.vector.tan( x ) หาค่า tangent ของมุมแบบเรเดียน
- ผลลัพธ์ = 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]))
สรุป
จากบทความนี้จะพบว่าชุดคำสั่งของโมดูลย่อย vector เป็นฟังก์ชันการทำงานเหมือนในไลบรารี math เพียงถูกออกแบบมาให้คำนวณกับแถวลำดับ 1 และ 2 มิติ ที่สร้างจาก ulab เพื่อให้มีความเร็วที่ดีกว่าการสั่งวนรอบโดยตรงจากภาษาไพธอน ส่วนบทความครั้งหน้าจะเป็นโมดูลย่อย linalg ซึ่งเป็นโมดูลย่อยด้านพีชคณิตเชิงเส้น
สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-09
ปรับปรุงเมื่อ 2021-08-12