เวกเตอร์และเมทริกซ์
เวกเตอร์เป็นรายการตัวเลขหนึ่งมิติ เช่น ทิศทางในปริภูมิหรือชุดปริมาณ ส่วนเมทริกซ์เป็นรายการที่แต่ละสมาชิกเป็นแถว หน้านี้อธิบายผลคูณจุด ผลคูณไขว้ การคูณเมทริกซ์ ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน การแก้ระบบสมการเชิงเส้น และเครื่องมือเชิงตัวเลขของพีชคณิตเชิงเส้น ได้แก่ ค่าเฉพาะและการแยกตัวประกอบแบบ QR, LU และค่าเอกฐาน
ใช้กับงานเรียนพีชคณิตเชิงเส้น เรขาคณิตและการแปลง หรือโจทย์ที่มีตัวไม่ทราบค่าหลายตัวสัมพันธ์กันด้วยสมการเชิงเส้น เวกเตอร์และเมทริกซ์เป็นรายการตามปกติ สิ่งที่อธิบายในรายการและสถิติ เช่น การอ้างสมาชิกด้วยดัชนี จึงใช้ได้ด้วย
เวกเตอร์
dot([1, 2, 3], [4, 5, 6]) ได้ผลลัพธ์เป็น 32dot([3, 4], [4, -3]) ได้ผลลัพธ์เป็น 0cross([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)) ได้ผลลัพธ์เป็น 5dot คูณสมาชิกตำแหน่งเดียวกันแล้วบวกผลลัพธ์ทั้งหมด ผลคูณจุดเป็นศูนย์หมายถึงเวกเตอร์ตั้งฉากกัน เช่น [3, 4] และ [4, -3] ส่วน cross ให้เวกเตอร์ที่ตั้งฉากกับเวกเตอร์อินพุตทั้งสอง เช่น ทิศ x คูณไขว้กับทิศ y ได้ทิศ z ความยาวเวกเตอร์เท่ากับรากที่สองของผลคูณจุดระหว่างเวกเตอร์นั้นกับตัวเอง
dot ต้องใช้เวกเตอร์สองตัวที่มีจำนวนสมาชิกเท่ากัน ส่วน cross ต้องใช้เวกเตอร์สองตัวที่มีสมาชิกตัวละสามค่า หากต้องการบวกเวกเตอร์หรือคูณด้วยสเกลาร์ ใช้การคำนวณรายการตามปกติ เช่น [1, 2] + [3, 4] ได้ [4, 6] และ 2 * [3, 4] ได้ [6, 8]
การเขียนและการคูณเมทริกซ์
เขียนเมทริกซ์เป็นรายการแถว แต่ละแถวอยู่ในวงเล็บเหลี่ยมของตัวเอง:
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 ที่จะคงค่าเมทริกซ์อื่นไว้เดิมเมื่อคูณด้วยเมทริกซ์นี้
* ระหว่างสองเมทริกซ์หมายถึงการคูณเมทริกซ์ โดยจำนวนคอลัมน์ของเมทริกซ์ซ้ายต้องเท่ากับจำนวนแถวของเมทริกซ์ขวา หากจะคูณเมทริกซ์กับเวกเตอร์ ให้เขียนเวกเตอร์เป็นคอลัมน์ โดยใส่สมาชิกหนึ่งค่าต่อแถว:
# Rotate the point (3, 1) by 90° anticlockwiserotate = [[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]
ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน เทรซ และอันดับ
M = [[2, 1], [5, 3]]det(M) ได้ผลลัพธ์เป็น 1inverse(M) ได้ผลลัพธ์เป็น [[3, -1], [-5, 2]]M * inverse(M) ได้ผลลัพธ์เป็น [[1, 0], [0, 1]]trace(M) ได้ผลลัพธ์เป็น 5inverse([[2, 1], [1, 3]]) ได้ผลลัพธ์เป็น [[0.6, -0.2], [-0.2, 0.4]]det([[1, 2], [2, 4]]) ได้ผลลัพธ์เป็น 0rank([[1, 2, 3], [2, 4, 6]]) ได้ผลลัพธ์เป็น 1det, inverse และ trace (ผลรวมสมาชิกบนเส้นทแยงมุมหลัก) ต้องใช้เมทริกซ์จัตุรัส ดีเทอร์มิแนนต์เป็นศูนย์หมายความว่าเมทริกซ์เป็นเมทริกซ์เอกฐาน แถวไม่เป็นอิสระเชิงเส้น จึงไม่มีเมทริกซ์ผกผัน และ inverse([[1, 2], [2, 4]]) จะเกิดข้อผิดพลาด ส่วน rank นับจำนวนแถวที่เป็นอิสระเชิงเส้น และใช้กับเมทริกซ์ที่ไม่เป็นจัตุรัสได้ด้วย ในบรรทัดสุดท้าย แถวที่สองเป็นสองเท่าของแถวแรก อันดับจึงเป็น 1
ฟังก์ชันทั้งสี่ใช้เศษส่วนแบบแม่นตรงแทนทศนิยม ดังนั้น M * inverse(M) จึงได้เมทริกซ์เอกลักษณ์อย่างแม่นตรง
แก้ระบบสมการเชิงเส้น
สมมติว่ากาแฟสามแก้วและชาสองแก้วราคา 13.50 ปอนด์ และกาแฟหนึ่งแก้วและชาสี่แก้วราคา 11.50 ปอนด์ ใส่จํานวนเครื่องดื่มแต่ละชนิดในแถวต่อสมการ โดยมีคอลัมน์อยู่ในลําดับคงที่ (กาแฟ ชา) และยอดรวมในรายการจับคู่:
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 จากผลรวม การแก้สมการ และแคลคูลัส
ค่าเฉพาะ
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
การแยกตัวประกอบแต่ละแบบคืนรายการเมทริกซ์ ใช้ดัชนีดึงแต่ละส่วนออกมา:
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 ในรายการและเมทริกซ์ แต่ค่าที่เก็บไว้ยังมีทุกหลัก จึงควรตรวจผลการแยกตัวประกอบด้วยสายตาหรือดูผลต่าง แทนการใช้ ==
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 ก่อน
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 รองรับ ไม่มีการปัดค่าตอนรับข้อมูลหรือส่งผลไปคำนวณต่อ เมื่อนำเมทริกซ์ผกผันคูณกลับจึงได้เมทริกซ์เอกลักษณ์อย่างแม่นตรง:
[[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]]) ได้ผลลัพธ์เป็น -2inverse([[1, 2], [3, 4]]) ได้ผลลัพธ์เป็น [[-2, 1], [1.5, -0.5]]inverse([[1, 2], [3, 4]]) * [[1, 2], [3, 4]] ได้ผลลัพธ์เป็น [[1, 0], [0, 1]]ทุกเงื่อนไขจะถูกตรวจสอบก่อนที่คําตอบจะปรากฏขึ้น และข้อความจะบอกว่าข้อใดล้มเหลว:
det([[1, 2, 3], [4, 5, 6]]) ได้ผลลัพธ์เป็น Unsupported: Expected a square matrixinverse([[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สมาชิกเมทริกซ์ต้องเป็นตัวเลขที่ไม่มีหน่วย หากสมาชิกใดมีหน่วย เป็นค่าเงิน หรือเป็นจำนวนเชิงซ้อน ระบบจะหยุดการคำนวณแทนการคำนวณต่อ เพราะการคำนวณเมทริกซ์ไม่สามารถรักษาข้อมูลเหล่านั้นไว้ได้:
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]] เรียกว่าเมทริกซ์ที่มีสภาพไม่ดี ความคลาดเคลื่อนจากการปัดเพียงเล็กน้อยอาจขยายมากเมื่อคำนวณ จึงทำให้การแยกตัวประกอบและค่าเฉพาะของเมทริกซ์เหล่านี้แม่นยำน้อยลง และในกรณีรุนแรงอาจเกินขีดจำกัดเชิงตัวเลขจนเกิดข้อผิดพลาด
อ่านข้อกำหนดทั้งหมดได้ในเอกสารอ้างอิงคณิตศาสตร์ขั้นสูง
ตัวอย่างการใช้ร่วมกัน
ใบเสร็จสามใบจากแผงขายของในตลาดระบุจํานวนแอปเปิ้ล กล้วย และส้มที่ซื้อและจ่ายทั้งหมด แต่ไม่ใช่ราคาแต่ละรายการ:
# Each row: apples, bananas, orangesbaskets = [[2, 3, 1], [1, 2, 3], [4, 1, 2]]paid = [2.15, 2.70, 3.05]det(baskets) ได้ผลลัพธ์เป็น 25prices = solve_system(baskets, paid) ได้ผลลัพธ์เป็น [0.4, 0.25, 0.6]# Check the prices against every receiptbaskets * 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