ข้ามไปยังเนื้อหา
คู่มือ Varlig
หน้าแรกของ Varlig

เวกเตอร์และเมทริกซ์

เวกเตอร์เป็นรายการตัวเลขหนึ่งมิติ เช่น ทิศทางในปริภูมิหรือชุดปริมาณ ส่วนเมทริกซ์เป็นรายการที่แต่ละสมาชิกเป็นแถว หน้านี้อธิบายผลคูณจุด ผลคูณไขว้ การคูณเมทริกซ์ ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน การแก้ระบบสมการเชิงเส้น และเครื่องมือเชิงตัวเลขของพีชคณิตเชิงเส้น ได้แก่ ค่าเฉพาะและการแยกตัวประกอบแบบ QR, LU และค่าเอกฐาน

ใช้กับงานเรียนพีชคณิตเชิงเส้น เรขาคณิตและการแปลง หรือโจทย์ที่มีตัวไม่ทราบค่าหลายตัวสัมพันธ์กันด้วยสมการเชิงเส้น เวกเตอร์และเมทริกซ์เป็นรายการตามปกติ สิ่งที่อธิบายในรายการและสถิติ เช่น การอ้างสมาชิกด้วยดัชนี จึงใช้ได้ด้วย

เวกเตอร์

calc
dot([1, 2, 3], [4, 5, 6]) ได้ผลลัพธ์เป็น 32
dot([3, 4], [4, -3]) ได้ผลลัพธ์เป็น 0
cross([1, 0, 0], [0, 1, 0]) ได้ผลลัพธ์เป็น [0, 0, 1]
cross([1, 2, 3], [4, 5, 6]) ได้ผลลัพธ์เป็น [-3, 6, -3]
v = [3, 4]
sqrt(dot(v, v)) ได้ผลลัพธ์เป็น 5

dot คูณสมาชิกตำแหน่งเดียวกันแล้วบวกผลลัพธ์ทั้งหมด ผลคูณจุดเป็นศูนย์หมายถึงเวกเตอร์ตั้งฉากกัน เช่น [3, 4] และ [4, -3] ส่วน cross ให้เวกเตอร์ที่ตั้งฉากกับเวกเตอร์อินพุตทั้งสอง เช่น ทิศ x คูณไขว้กับทิศ y ได้ทิศ z ความยาวเวกเตอร์เท่ากับรากที่สองของผลคูณจุดระหว่างเวกเตอร์นั้นกับตัวเอง

dot ต้องใช้เวกเตอร์สองตัวที่มีจำนวนสมาชิกเท่ากัน ส่วน cross ต้องใช้เวกเตอร์สองตัวที่มีสมาชิกตัวละสามค่า หากต้องการบวกเวกเตอร์หรือคูณด้วยสเกลาร์ ใช้การคำนวณรายการตามปกติ เช่น [1, 2] + [3, 4] ได้ [4, 6] และ 2 * [3, 4] ได้ [6, 8]

การเขียนและการคูณเมทริกซ์

เขียนเมทริกซ์เป็นรายการแถว แต่ละแถวอยู่ในวงเล็บเหลี่ยมของตัวเอง:

calc
shape([[1, 2, 3], [4, 5, 6]]) ได้ผลลัพธ์เป็น [2, 3]
transpose([[1, 2, 3], [4, 5, 6]]) ได้ผลลัพธ์เป็น [[1, 4], [2, 5], [3, 6]]
identity(3) ได้ผลลัพธ์เป็น [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
[[1, 2], [3, 4]] * [[5, 6], [7, 8]] ได้ผลลัพธ์เป็น [[19, 22], [43, 50]]

shape ให้ [rows, columns] transpose สลับแถวและคอลัมน์ identity(n) คือเมทริกซ์ n คูณ n ที่จะคงค่าเมทริกซ์อื่นไว้เดิมเมื่อคูณด้วยเมทริกซ์นี้

* ระหว่างสองเมทริกซ์หมายถึงการคูณเมทริกซ์ โดยจำนวนคอลัมน์ของเมทริกซ์ซ้ายต้องเท่ากับจำนวนแถวของเมทริกซ์ขวา หากจะคูณเมทริกซ์กับเวกเตอร์ ให้เขียนเวกเตอร์เป็นคอลัมน์ โดยใส่สมาชิกหนึ่งค่าต่อแถว:

calc
# Rotate the point (3, 1) by 90° anticlockwise
rotate = [[0, -1], [1, 0]]
rotate * [[3], [1]] ได้ผลลัพธ์เป็น [[-1], [3]]
rotate * rotate ได้ผลลัพธ์เป็น [[-1, 0], [0, -1]]

การหมุน 90° สองครั้งเท่ากับครึ่งรอบ rotate * rotate จึงกลับเครื่องหมายทั้งสองค่า ไม่รองรับรายการหนึ่งมิติอย่าง [3, 1] ทางขวาของเมทริกซ์ หากมีตัวแปรที่เก็บรายการหนึ่งมิติ ใช้ transpose([v]) แปลงเป็นคอลัมน์ได้

เมทริกซ์ที่มีจำนวนแถวและคอลัมน์เท่ากันนำมาบวกหรือลบกันได้ และคูณหรือหารด้วยตัวเลขได้เช่นเดียวกับรายการอื่น

กฎสองสามข้อใช้กับทุกการดําเนินการเมทริกซ์:

  • ทุกแถวต้องมีจํานวนองค์ประกอบเท่ากัน
  • สมาชิกต้องเป็นตัวเลขที่ไม่มีหน่วย ไม่รองรับค่าเงินหรือค่าที่มีหน่วย
  • เมทริกซ์สามารถมีได้มากที่สุด 32 แถวและ 32 คอลัมน์
  • ไม่มีรูปแบบย่อที่ใช้อัฒภาค ให้เขียน [[1, 2], [3, 4]] ไม่ใช่ [1, 2; 3, 4]

ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน เทรซ และอันดับ

calc
M = [[2, 1], [5, 3]]
det(M) ได้ผลลัพธ์เป็น 1
inverse(M) ได้ผลลัพธ์เป็น [[3, -1], [-5, 2]]
M * inverse(M) ได้ผลลัพธ์เป็น [[1, 0], [0, 1]]
trace(M) ได้ผลลัพธ์เป็น 5
inverse([[2, 1], [1, 3]]) ได้ผลลัพธ์เป็น [[0.6, -0.2], [-0.2, 0.4]]
det([[1, 2], [2, 4]]) ได้ผลลัพธ์เป็น 0
rank([[1, 2, 3], [2, 4, 6]]) ได้ผลลัพธ์เป็น 1

det, inverse และ trace (ผลรวมสมาชิกบนเส้นทแยงมุมหลัก) ต้องใช้เมทริกซ์จัตุรัส ดีเทอร์มิแนนต์เป็นศูนย์หมายความว่าเมทริกซ์เป็นเมทริกซ์เอกฐาน แถวไม่เป็นอิสระเชิงเส้น จึงไม่มีเมทริกซ์ผกผัน และ inverse([[1, 2], [2, 4]]) จะเกิดข้อผิดพลาด ส่วน rank นับจำนวนแถวที่เป็นอิสระเชิงเส้น และใช้กับเมทริกซ์ที่ไม่เป็นจัตุรัสได้ด้วย ในบรรทัดสุดท้าย แถวที่สองเป็นสองเท่าของแถวแรก อันดับจึงเป็น 1

ฟังก์ชันทั้งสี่ใช้เศษส่วนแบบแม่นตรงแทนทศนิยม ดังนั้น M * inverse(M) จึงได้เมทริกซ์เอกลักษณ์อย่างแม่นตรง

แก้ระบบสมการเชิงเส้น

สมมติว่ากาแฟสามแก้วและชาสองแก้วราคา 13.50 ปอนด์ และกาแฟหนึ่งแก้วและชาสี่แก้วราคา 11.50 ปอนด์ ใส่จํานวนเครื่องดื่มแต่ละชนิดในแถวต่อสมการ โดยมีคอลัมน์อยู่ในลําดับคงที่ (กาแฟ ชา) และยอดรวมในรายการจับคู่:

calc
solve_system([[3, 2], [1, 4]], [13.5, 11.5]) ได้ผลลัพธ์เป็น [3.1, 2.1]

คำตอบเรียงตามลำดับคอลัมน์ กาแฟราคา £3.10 และชาราคา £2.10 ไม่ต้องใส่สัญลักษณ์สกุลเงินในการคำนวณ เพราะสมาชิกเมทริกซ์ต้องเป็นตัวเลขที่ไม่มีหน่วย

solve_system(A, b) แก้สมการ A * x = b เพื่อหา x ต้องใช้เมทริกซ์จัตุรัสที่มีจำนวนแถวเท่ากับจำนวนตัวไม่ทราบค่า และรายการหนึ่งมิติของค่าด้านขวาที่มีความยาวเท่ากัน ระบบใช้เศษส่วนแบบแม่นตรง คำตอบจึงไม่มีความคลาดเคลื่อนจากการปัดเศษ

หากสมการไม่ได้กำหนดคำตอบเพียงชุดเดียว ระบบจะแจ้งว่าไม่มีคำตอบที่เป็นเอกลักษณ์ เช่น solve_system([[1, 2], [2, 4]], [3, 6]) ล้มเหลวเพราะสมการที่สองเป็นสองเท่าของสมการแรก solve_system รองรับเฉพาะสมการเชิงเส้น หากเป็นสมการอย่าง x^2 = 2 ให้ใช้ solve จากผลรวม การแก้สมการ และแคลคูลัส

ค่าเฉพาะ

calc
eigenvalues([[2, 1], [1, 2]]) ได้ผลลัพธ์เป็น [1, 3]
eigenvalues([[4, 1], [2, 3]]) ได้ผลลัพธ์เป็น [5, 2]
eigenvalues([[0, -1], [1, 0]]) ได้ผลลัพธ์เป็น [i, -i]

eigenvalues รับเมทริกซ์จัตุรัสและคืนรายการหนึ่งมิติ การหมุน 90° ไม่คงทิศทางใดไว้ จึงมีค่าเฉพาะเป็นคู่เชิงซ้อน i และ -i ดูจำนวนเชิงซ้อน ไม่ควรอาศัยลำดับสมาชิกในรายการผลลัพธ์

การแยกตัวประกอบ: QR, LU และ SVD

การแยกตัวประกอบแต่ละแบบคืนรายการเมทริกซ์ ใช้ดัชนีดึงแต่ละส่วนออกมา:

calc
A = [[3, 0], [4, 5]]
parts = qr(A)
q = parts[0] ได้ผลลัพธ์เป็น [[0.6, -0.8], [0.8, 0.6]]
r = parts[1] ได้ผลลัพธ์เป็น [[5, 4], [0, 3]]
q * r ได้ผลลัพธ์เป็น [[3, 0], [4, 5]]

เมื่อนำตัวประกอบมาคูณกลับจะได้ A จึงตรวจการแยกตัวประกอบได้ง่าย การคำนวณด้วยเลขทศนิยมลอยตัวฐานสองทำให้มีเศษคลาดเคลื่อนเล็กน้อยราว 10⁻¹⁵ ซึ่ง Varlig แสดงเป็น 0 ในรายการและเมทริกซ์ แต่ค่าที่เก็บไว้ยังมีทุกหลัก จึงควรตรวจผลการแยกตัวประกอบด้วยสายตาหรือดูผลต่าง แทนการใช้ ==

calc
lu([[2, 1], [4, 3]]) ได้ผลลัพธ์เป็น [[[0, 1], [1, 0]], [[1, 0], [0.5, 1]], [[4, 3], [0, -0.5]]]

lu คืน [P, L, U] โดย P บันทึกการสลับแถว และ P * A เท่ากับ L * U ในตัวอย่างนี้สลับแถวเพื่อใช้ตัวเลขที่มากกว่า คือ 4 ก่อน

calc
B = [[3, 1], [4, 7]]
f = svd(B)
u = f[0]
s = f[1]
vt = f[2]
u * [[s[0], 0], [0, s[1]]] * vt ได้ผลลัพธ์เป็น [[3, 1], [4, 7]]
svd([[3, 4]]) ได้ผลลัพธ์เป็น [[[1]], [5], [[0.6, 0.8]]]

svd คืน [U, s, Vt] โดย s เป็นรายการหนึ่งมิติของค่าเอกฐานเรียงจากมากไปน้อย ตามตำรา B เท่ากับ U * diag(s) * Vt แต่แอปไม่มีฟังก์ชัน diag จึงต้องสร้างเมทริกซ์ทแยงมุมเอง เช่น [[s[0], 0], [0, s[1]]]

ฟังก์ชัน ข้อมูลที่ต้องใช้และผลลัพธ์ที่คืน
identity(n) เมทริกซ์เอกลักษณ์ขนาด n คูณ n
shape(A) [rows, columns]
transpose(A) สลับแถวและคอลัมน์
det(A) ดีเทอร์มิแนนต์ของเมทริกซ์จัตุรัส
inverse(A) เมทริกซ์ผกผันของเมทริกซ์จัตุรัสที่มีดีเทอร์มิแนนต์ไม่เป็นศูนย์
trace(A) ผลรวมของสมาชิกบนเส้นทแยงมุมหลักของเมทริกซ์จัตุรัส
rank(A) จำนวนแถวที่อิสระเชิงเส้น ใช้กับเมทริกซ์สี่เหลี่ยมขนาดใดก็ได้
solve_system(A,b) คำตอบของ A * x = b สำหรับเมทริกซ์จัตุรัสที่มีคำตอบเดียว
eigenvalues(A) ค่าเฉพาะของเมทริกซ์จัตุรัส ซึ่งอาจเป็นจำนวนเชิงซ้อน โดยไม่กำหนดลำดับ
qr(A) [Q, R] โดย Q * R มีค่าประมาณ A ใช้กับเมทริกซ์สี่เหลี่ยมขนาดใดก็ได้
lu(A) [P, L, U] โดย P * A มีค่าประมาณ L * U ใช้กับเมทริกซ์จัตุรัส
svd(A) [U, s, Vt] โดย s เป็นรายการหนึ่งมิติ ใช้กับเมทริกซ์สี่เหลี่ยมขนาดใดก็ได้

สำหรับเมทริกซ์ที่ไม่เป็นจัตุรัส qr และ svd คืนตัวประกอบแบบลดขนาด เช่น เมทริกซ์ขนาด 3 คูณ 2 จะได้ Q ขนาด 3 คูณ 2 เช่นกัน ไม่ใช่ 3 คูณ 3

กรณีที่คำนวณได้แม่นตรงและกรณีที่ไม่รองรับ

การบวก ลบ และคูณเมทริกซ์ การคูณเมทริกซ์ด้วยตัวเลข รวมถึง transpose, det และ inverse ใช้เศษส่วนแบบแม่นตรงกับทุกเมทริกซ์ที่ Varlig รองรับ ไม่มีการปัดค่าตอนรับข้อมูลหรือส่งผลไปคำนวณต่อ เมื่อนำเมทริกซ์ผกผันคูณกลับจึงได้เมทริกซ์เอกลักษณ์อย่างแม่นตรง:

calc
[[1, 2], [3, 4]] + [[10, 20], [30, 40]] ได้ผลลัพธ์เป็น [[11, 22], [33, 44]]
[[1, 2], [3, 4]] - [[1, 1], [1, 1]] ได้ผลลัพธ์เป็น [[0, 1], [2, 3]]
3 * [[1, 2], [3, 4]] ได้ผลลัพธ์เป็น [[3, 6], [9, 12]]
[[1, 2], [3, 4]] * [[0, 1], [1, 0]] ได้ผลลัพธ์เป็น [[2, 1], [4, 3]]
det([[1, 2], [3, 4]]) ได้ผลลัพธ์เป็น -2
inverse([[1, 2], [3, 4]]) ได้ผลลัพธ์เป็น [[-2, 1], [1.5, -0.5]]
inverse([[1, 2], [3, 4]]) * [[1, 2], [3, 4]] ได้ผลลัพธ์เป็น [[1, 0], [0, 1]]

ทุกเงื่อนไขจะถูกตรวจสอบก่อนที่คําตอบจะปรากฏขึ้น และข้อความจะบอกว่าข้อใดล้มเหลว:

calc
det([[1, 2, 3], [4, 5, 6]]) ได้ผลลัพธ์เป็น Unsupported: Expected a square matrix
inverse([[1, 2], [2, 4]]) ได้ผลลัพธ์เป็น Unsupported: Singular matrix has no inverse
[[1, 2], [3, 4]] + [[1, 2, 3], [4, 5, 6]] ได้ผลลัพธ์เป็น Unsupported: List dimensions do not match
[[1, 2, 3], [4, 5, 6]] * [[1, 2], [3, 4]] ได้ผลลัพธ์เป็น Unsupported: Matrix inner dimensions do not match

สมาชิกเมทริกซ์ต้องเป็นตัวเลขที่ไม่มีหน่วย หากสมาชิกใดมีหน่วย เป็นค่าเงิน หรือเป็นจำนวนเชิงซ้อน ระบบจะหยุดการคำนวณแทนการคำนวณต่อ เพราะการคำนวณเมทริกซ์ไม่สามารถรักษาข้อมูลเหล่านั้นไว้ได้:

calc
det([[1 kg, 2], [3, 4]]) ได้ผลลัพธ์เป็น Unsupported: Matrix entries must be plain numbers; units, money and complex values are not supported

ระบบอ่านเฉพาะรายการที่สมาชิกเป็นแถวเป็นเมทริกซ์ รายการหนึ่งมิติยังคงความหมายเดิม ดังนั้น [1, 2] + [3, 4] จึงยังบวกทีละสมาชิกได้ [4, 6] และ [1, 2] * [3, 4] ยังเกิดข้อผิดพลาดพร้อมแนะนำให้ใช้ dot

ดูข้อกำหนดเรื่องความแม่นตรงของสมการ เมทริกซ์ และสถิติรวมกันในสิ่งที่ระบบคำนวณรับประกัน

อัลกอริทึมและข้อจํากัด

det, inverse, rank และ solve_system ใช้เศษส่วนแบบแม่นตรงภายในขีดจำกัดขนาดตัวเลขของเครื่องคำนวณ ส่วน eigenvalues, qr, lu และ svd ใช้เลขทศนิยมลอยตัวฐานสอง คำตอบจึงเป็นค่าประมาณที่ใกล้เคียง และหยุดการวนคำนวณหลัง 10,000 ขั้น

เมทริกซ์ที่แถวเกือบไม่เป็นอิสระเชิงเส้น เช่น [[1, 1], [1, 1.0000001]] เรียกว่าเมทริกซ์ที่มีสภาพไม่ดี ความคลาดเคลื่อนจากการปัดเพียงเล็กน้อยอาจขยายมากเมื่อคำนวณ จึงทำให้การแยกตัวประกอบและค่าเฉพาะของเมทริกซ์เหล่านี้แม่นยำน้อยลง และในกรณีรุนแรงอาจเกินขีดจำกัดเชิงตัวเลขจนเกิดข้อผิดพลาด

อ่านข้อกำหนดทั้งหมดได้ในเอกสารอ้างอิงคณิตศาสตร์ขั้นสูง

ตัวอย่างการใช้ร่วมกัน

ใบเสร็จสามใบจากแผงขายของในตลาดระบุจํานวนแอปเปิ้ล กล้วย และส้มที่ซื้อและจ่ายทั้งหมด แต่ไม่ใช่ราคาแต่ละรายการ:

calc
# Each row: apples, bananas, oranges
baskets = [[2, 3, 1], [1, 2, 3], [4, 1, 2]]
paid = [2.15, 2.70, 3.05]
det(baskets) ได้ผลลัพธ์เป็น 25
prices = solve_system(baskets, paid) ได้ผลลัพธ์เป็น [0.4, 0.25, 0.6]
# Check the prices against every receipt
baskets * transpose([prices]) ได้ผลลัพธ์เป็น [[2.15], [2.7], [3.05]]
# What would 5 apples, 2 bananas and 4 oranges cost?
dot([5, 2, 4], prices) ได้ผลลัพธ์เป็น 4.9

ดีเทอร์มิแนนต์ที่ไม่เป็นศูนย์ยืนยันว่าใบเสร็จให้ข้อมูลเพียงพอที่จะหาราคาได้ชุดเดียว ได้แก่ แอปเปิล 40p กล้วย 25p และส้ม 60p เมื่อนำเมทริกซ์ตะกร้าคูณราคาที่เขียนเป็นคอลัมน์ จะได้ยอดรวมเดิม และใช้ dot คำนวณตะกร้าใหม่ได้ £4.90