หน้าแรก คลังความรู้ พีชคณิตเชิงเส้น ผลเฉลยเชิงตัวเลข
Linear Algebra
// บทที่ 7.11 · พีชคณิตเชิงเส้น · Numerical Solution of Linear Systems
การหาผลเฉลยเชิงตัวเลขของระบบสมการเชิงเส้นด้วยเมทริกซ์: เกาส์ การสลับแถว LU โชเลสกี โทมัส จาโคบี เกาส์-ไซเดล SOR และเลขเงื่อนไข
โปรแกรมจำลองวงจร ซอฟต์แวร์วิเคราะห์โครงสร้าง และเกมฟิสิกส์ล้วนแก้ A x = b A\mathbf x = \mathbf b A x = b ที่มีตัวแปรหลักพันถึงหลักล้านตัว วิธีที่ใช้ในห้องเรียนอย่างคราเมอร์จึงใช้ไม่ได้ หน้านี้อธิบายว่าคอมพิวเตอร์แก้ระบบสมการอย่างไรให้เร็วและไม่เพี้ยน ทั้งวิธีตรง (เกาส์ LU โชเลสกี โทมัส) และวิธีทำซ้ำ (จาโคบี เกาส์-ไซเดล SOR) พร้อมเครื่องมือวัดว่าคำตอบเชื่อได้แค่ไหน สูตรใช้รหัส N
สรุปใน 30 วินาที
วิธีตรง ทำจำนวนขั้นแน่นอน: เกาส์ ≈ 2 3 n 3 \approx \tfrac23 n^3 ≈ 3 2 n 3 flops ต้องสลับแถว ให้ตัวหลักใหญ่สุดเสมอ · LU แยกครั้งเดียวใช้ได้กับ b \mathbf b b หลายตัว · โชเลสกีสำหรับเมทริกซ์สมมาตรบวกแน่นอน · โทมัสสำหรับสามแนวทแยง O ( n ) O(n) O ( n )
วิธีทำซ้ำ เริ่มจากค่าเดา แล้วปรับทีละรอบ: จาโคบีใช้ค่าเก่าทั้งหมด เกาส์-ไซเดลใช้ค่าใหม่ทันที SOR เร่งด้วย ω \omega ω เหมาะกับระบบใหญ่และเบาบาง
ลู่เข้าแน่นอนถ้าทแยงเด่น เงื่อนไขแท้คือ ρ ( T ) < 1 \rho(T) \lt 1 ρ ( T ) < 1 และยิ่ง ρ \rho ρ เล็กยิ่งเร็ว
เลขเงื่อนไข κ ( A ) = ∥ A ∥ ∥ A − 1 ∥ \kappa(A) = \lVert A\rVert\lVert A^{-1}\rVert κ ( A ) = ∥ A ∥ ∥ A − 1 ∥ บอกว่าความคลาดเคลื่อนถูกขยายกี่เท่า เสียความแม่นยำราว log 10 κ \log_{10}\kappa log 10 κ หลัก
ระดับ พื้นฐาน ปี 1 · เริ่มเรียนวิธีเชิงตัวเลขกลาง ป.ตรี วิศวกรรม (Numerical Methods)ขั้นสูง ป.โท · งานจำลองจริง
ค้นหาสูตรในหน้านี้
โหมดฝึกทำ: ซ่อนวิธีทำ
ทำไมต้องวิธีเชิงตัวเลข: ขนาดของปัญหาจริง พื้นฐาน
ในห้องเรียนเราแก้ระบบ 2–3 ตัวแปรด้วย คราเมอร์ หรือ อินเวอร์ส ได้สบาย แต่วงจรรวมหนึ่งชิปมีโนดนับหมื่น แบบจำลองไฟไนต์เอลิเมนต์ของสะพานมีตัวแปรนับล้าน คำถามจึงเปลี่ยนจาก “หาได้ไหม” เป็น “หาได้เร็วแค่ไหน และคำตอบเพี้ยนเพราะการปัดเศษหรือเปล่า”
A x = b วิธีตรง (direct) จำนวนขั้นแน่นอน วิธีทำซ้ำ (iterative) ปรับค่าเดาทีละรอบ เกาส์ + สลับแถว / LU หนาแน่น ทั่วไป · ⅔n³ โชเลสกี A = LLᵀ สมมาตรบวกแน่นอน โทมัส (TDMA) สามแนวทแยง · O(n) จาโคบี ใช้ค่าเก่า · ขนานได้ เกาส์-ไซเดล ใช้ค่าใหม่ทันที SOR (ω) · CG ระบบใหญ่และเบาบาง ก่อนเชื่อคำตอบ: เลขเงื่อนไข κ(A) บอกหลักที่อาจเสีย วิธีทำซ้ำลู่เข้าเมื่อทแยงเด่น หรือ ρ(T) < 1 แผนที่วิธีแก้ A x = b A\mathbf x = \mathbf b A x = b : วิธีตรงให้คำตอบในจำนวนขั้นที่แน่นอน วิธีทำซ้ำค่อย ๆ เข้าใกล้คำตอบ เลือกตามขนาด ความเบาบาง และโครงสร้างของเมทริกซ์
N1 Operation counts จำนวนการคำนวณ (ระบบ n × n n\times n n × n หนาแน่น)
เกาส์ / LU ≈ 2 3 n 3 flops , แทนค่าย้อนกลับ ≈ n 2 , เกาส์-จอร์แดน ≈ n 3 , คราเมอร์ (โคแฟกเตอร์) ≈ ( n + 1 ) ! \text{เกาส์ / LU} \approx \tfrac23 n^3 \text{ flops},\quad \text{แทนค่าย้อนกลับ} \approx n^2,\quad \text{เกาส์-จอร์แดน} \approx n^3,\quad \text{คราเมอร์ (โคแฟกเตอร์)} \approx (n + 1)! เกาส์ / LU ≈ 3 2 n 3 flops , แทนค่าย้อนกลับ ≈ n 2 , เกาส์ - จอร์แดน ≈ n 3 , คราเมอร์ ( โคแฟกเตอร์ ) ≈ ( n + 1 )!
1 flop = การบวก/ลบ/คูณ/หารหนึ่งครั้งของเลขทศนิยม · การหาอินเวอร์สแล้วคูณ A − 1 b A^{-1}\mathbf b A − 1 b ใช้ราว 2 n 3 2n^3 2 n 3 จึงช้ากว่าและคลาดเคลื่อนมากกว่าการแก้ตรง
จำนวนตัวแปร n n n เกาส์ ≈ n 3 / 3 \approx n^3/3 ≈ n 3 /3 การคูณ คราเมอร์ด้วยโคแฟกเตอร์ ≈ ( n + 1 ) ! \approx (n+1)! ≈ ( n + 1 )! เวลาที่ 10 9 10^9 1 0 9 ครั้ง/วินาที (คราเมอร์)
3 9 24 ไม่ถึงไมโครวินาที
10 333 4.0 × 10 7 4.0\times10^{7} 4.0 × 1 0 7 0.04 วินาที
20 2,667 5.1 × 10 19 5.1\times10^{19} 5.1 × 1 0 19 ราว 1,600 ปี
100 3.3 × 10 5 3.3\times10^{5} 3.3 × 1 0 5 9.4 × 10 159 9.4\times10^{159} 9.4 × 1 0 159 นานกว่าอายุเอกภพมาก
1,000 3.3 × 10 8 3.3\times10^{8} 3.3 × 1 0 8 (≈ 0.3 วินาที)≈ 10 2570 \approx 10^{2570} ≈ 1 0 2570 —
N2 Machine epsilon ความละเอียดของเลขทศนิยม
ϵ mach = 2 − 52 ≈ 2.22 × 10 − 16 ( double, IEEE 754 ) \epsilon_{\text{mach}} = 2^{-52} \approx 2.22\times10^{-16} \ (\text{double, IEEE 754}) ϵ mach = 2 − 52 ≈ 2.22 × 1 0 − 16 ( double, IEEE 754 )
เลข double เก็บได้ราว 15–16 หลักนัยสำคัญ ทุกการคำนวณถูกปัดเศษ ความคลาดเคลื่อนสะสมได้ถ้าอัลกอริทึมไม่ดี
N3 Direct vs iterative วิธีตรงกับวิธีทำซ้ำ
ตรง: A = L U → x ( จำนวนขั้นแน่นอน ) , ทำซ้ำ: x ( k + 1 ) = T x ( k ) + c \text{ตรง: } A = LU \to \mathbf x \ (\text{จำนวนขั้นแน่นอน}),\qquad \text{ทำซ้ำ: } \mathbf x^{(k+1)} = T\mathbf x^{(k)} + \mathbf c ตรง : A = LU → x ( จำนวนขั้นแน่นอน ) , ทำซ้ำ : x ( k + 1 ) = T x ( k ) + c
วิธีตรงแม่นถึงระดับการปัดเศษ วิธีทำซ้ำหยุดเมื่อแม่นพอ ไม่ต้องเก็บเมทริกซ์เต็มและไม่เติมศูนย์ให้กลายเป็นตัวเลข (fill-in)
การกำจัดแบบเกาส์ในมุมของอัลกอริทึม กลาง
หลักการเหมือน การกำจัดแบบเกาส์ที่ทำมือ ทุกประการ แต่เขียนเป็นสูตรที่โปรแกรมทำซ้ำได้ แบ่งเป็นสองช่วง: กำจัดไปข้างหน้า (forward elimination) ให้ได้เมทริกซ์สามเหลี่ยมบน แล้วแทนค่าย้อนกลับ (back substitution) จากล่างขึ้นบน
N4 Forward elimination & back substitution กำจัดไปข้างหน้าและแทนค่าย้อนกลับ
m i k = a i k a k k , a i j ← a i j − m i k a k j , b i ← b i − m i k b k ( i > k ) m_{ik} = \frac{a_{ik}}{\hlP{a_{kk}}},\quad a_{ij} \leftarrow a_{ij} - m_{ik}a_{kj},\quad b_i \leftarrow b_i - m_{ik}b_k \qquad (i \gt k) m ik = a kk a ik , a ij ← a ij − m ik a kj , b i ← b i − m ik b k ( i > k )
x n = b n a n n , x i = 1 a i i ( b i − ∑ j = i + 1 n a i j x j ) , i = n − 1 , … , 1 x_n = \frac{b_n}{a_{nn}},\qquad x_i = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j=i+1}^{n} a_{ij}x_j\Bigr),\ i = n - 1, \dots, 1 x n = a nn b n , x i = a ii 1 ( b i − j = i + 1 ∑ n a ij x j ) , i = n − 1 , … , 1
for k = 1 … n−1 # หลักของตัวหลัก
(สลับแถว: หา p ที่ |a_pk| มากสุด แล้วสลับแถว p กับ k)
for i = k+1 … n
m = a[i][k] / a[k][k]
for j = k … n: a[i][j] -= m * a[k][j]
b[i] -= m * b[k]
for i = n … 1 # แทนค่าย้อนกลับ
x[i] = (b[i] − Σ_{j>i} a[i][j]·x[j]) / a[i][i]
การเลือกตัวหลัก (Pivoting): ทำไมต้องสลับแถวแม้ตัวหลักไม่เป็นศูนย์ กลาง
ถ้าตัวหลักเป็นศูนย์ การกำจัดหยุดทันที เรื่องนี้ทุกคนรู้ แต่อันตรายกว่าคือตัวหลักเล็กมาก ตัวคูณ m = a i k / a k k m = a_{ik}/a_{kk} m = a ik / a kk จะใหญ่มาก แล้วกลืนตัวเลขอื่นจนหายไปตอนปัดเศษ
N5 Partial pivoting การสลับแถวบางส่วน
p = arg max i ≥ k ∣ a i k ∣ , R k ↔ R p ⇒ ∣ m i k ∣ ≤ 1 p = \arg\max_{i \ge k}|a_{ik}|,\quad R_k \leftrightarrow R_p \ \Rightarrow\ |m_{ik}| \le 1 p = arg i ≥ k max ∣ a ik ∣ , R k ↔ R p ⇒ ∣ m ik ∣ ≤ 1
เป็นค่าเริ่มต้นของ LAPACK (numpy.linalg.solve, MATLAB A\b) ราคาถูกเพราะแค่เทียบค่าในหลักเดียว
N6 Scaled & complete pivoting ปรับสเกลและสลับเต็ม
s i = max j ∣ a i j ∣ , p = arg max i ≥ k ∣ a i k ∣ s i s_i = \max_j |a_{ij}|,\quad p = \arg\max_{i \ge k}\frac{|a_{ik}|}{s_i} s i = j max ∣ a ij ∣ , p = arg i ≥ k max s i ∣ a ik ∣
ใช้เมื่อแต่ละแถวมีหน่วยหรือขนาดต่างกันมาก · complete pivoting เลือกจากทั้งเมทริกซ์ย่อย (สลับหลักด้วย) เสถียรที่สุดแต่แพง จึงไม่ค่อยใช้
ตัวอย่าง N-1 · เครื่องคิดเลข 3 หลัก แก้ 0.0001 x + y = 1 x + y = 2 \begin{aligned} 0.0001x + y &= 1 \\ x + y &= 2 \end{aligned} 0.0001 x + y x + y = 1 = 2 โดยปัดทุกผลลัพธ์เหลือ 3 หลักนัยสำคัญ ทั้งแบบไม่สลับและสลับแถว (ค่าจริง x = 1.0001 … , y = 0.9998 … x = 1.0001\dots,\ y = 0.9998\dots x = 1.0001 … , y = 0.9998 … ) ลองในแล็บ
ไม่สลับ: m = 1 / 0.0001 = 10 4 m = 1/0.0001 = 10^4 m = 1/0.0001 = 1 0 4 แล้ว
a 22 = 1 − 10 4 = − 9999 → − 1.00 × 10 4 , b 2 = 2 − 10 4 = − 9998 → − 1.00 × 10 4 a_{22} = 1 - 10^4 = -9999 \to \hlF{-1.00\times10^4},\qquad b_2 = 2 - 10^4 = -9998 \to \hlF{-1.00\times10^4} a 22 = 1 − 1 0 4 = − 9999 → − 1.00 × 1 0 4 , b 2 = 2 − 1 0 4 = − 9998 → − 1.00 × 1 0 4
y = 1.00 y = 1.00 y = 1.00 แทนกลับ: x = 1 − 1.00 0.0001 = 0 x = \dfrac{1 - 1.00}{0.0001} = 0 x = 0.0001 1 − 1.00 = 0 — ผิดทั้งหมด (คลาดเคลื่อน 100%)
สลับแถว ให้ 1 1 1 เป็นตัวหลัก N5 : m = 0.0001 m = 0.0001 m = 0.0001
a 22 = 1 − 0.0001 = 0.9999 → 1.00 , b 2 = 1 − 0.0002 = 0.9998 → 1.00 a_{22} = 1 - 0.0001 = 0.9999 \to 1.00,\qquad b_2 = 1 - 0.0002 = 0.9998 \to 1.00 a 22 = 1 − 0.0001 = 0.9999 → 1.00 , b 2 = 1 − 0.0002 = 0.9998 → 1.00
y = 1.00 , x = 2 − 1.00 = 1.00 y = 1.00,\ x = 2 - 1.00 = 1.00 y = 1.00 , x = 2 − 1.00 = 1.00 — ถูกต้องตามจำนวนหลักที่มี
ไม่สลับ: ( x , y ) = ( 0 , 1.00 ) (x, y) = (0, 1.00) ( x , y ) = ( 0 , 1.00 ) ✗ · สลับแถว: ( 1.00 , 1.00 ) (1.00, 1.00) ( 1.00 , 1.00 ) ✓
ต้นเหตุ: ตัวคูณ 10 4 10^4 1 0 4 ทำให้เลข 1 ใน 1 − 10 4 1 - 10^4 1 − 1 0 4 หายไปตอนปัด ข้อมูลของสมการแรกจึงหายไปทั้งหมด · เครื่องจริงเก็บ 16 หลักก็เกิดเรื่องเดียวกันเมื่อ ε ≈ 10 − 17 \varepsilon \approx 10^{-17} ε ≈ 1 0 − 17
ในแล็บด้านล่าง เลื่อนขนาดตัวหลัก ε \varepsilon ε และจำนวนหลักที่เครื่องเก็บได้ แล้วดูว่าเมื่อไรวิธีไม่สลับแถวพัง กดดูตารางเทียบทุกจำนวนหลักด้านล่างแล็บ มีชุดตัวหลักเป็นศูนย์ 3×3 ให้ลองด้วย
การแยก LU: แยกครั้งเดียว ใช้ได้ทุก b \mathbf b b กลาง
การกำจัดแบบเกาส์คือการเขียน A = L U A = LU A = LU โดยไม่รู้ตัว: U U U คือเมทริกซ์สามเหลี่ยมบนที่ได้ และ L L L คือเมทริกซ์สามเหลี่ยมล่างที่เก็บตัวคูณ m i k m_{ik} m ik ไว้ใต้แนวทแยง (แนวทแยงเป็น 1) งานจริงที่ต้องแก้ระบบเดิมกับ b \mathbf b b หลายชุด เช่น วงจรเดียวกันที่แหล่งจ่ายเปลี่ยนตามเวลา จึงแยก LU ครั้งเดียว (≈ 2 3 n 3 \approx \tfrac23n^3 ≈ 3 2 n 3 ) แล้วแก้แต่ละ b \mathbf b b ด้วยการแทนค่าสองรอบ (≈ 2 n 2 \approx 2n^2 ≈ 2 n 2 )
N7 Doolittle factorisation การแยกแบบดูลิตเติล (ℓ i i = 1 \ell_{ii} = 1 ℓ ii = 1 )
u i j = a i j − ∑ k = 1 i − 1 ℓ i k u k j ( j ≥ i ) , ℓ i j = 1 u j j ( a i j − ∑ k = 1 j − 1 ℓ i k u k j ) ( i > j ) u_{ij} = a_{ij} - \sum_{k=1}^{i-1}\ell_{ik}u_{kj}\ (j \ge i),\qquad \ell_{ij} = \frac{1}{u_{jj}}\Bigl(a_{ij} - \sum_{k=1}^{j-1}\ell_{ik}u_{kj}\Bigr)\ (i \gt j) u ij = a ij − k = 1 ∑ i − 1 ℓ ik u kj ( j ≥ i ) , ℓ ij = u jj 1 ( a ij − k = 1 ∑ j − 1 ℓ ik u kj ) ( i > j )
แบบโครต์ (Crout) ให้ u i i = 1 u_{ii} = 1 u ii = 1 แทน ผลลัพธ์ต่างกันแค่การกระจายแนวทแยง
N8 Solving with LU แก้ระบบด้วย LU
A x = b ⟺ L y = b ( ไปข้างหน้า ) , U x = y ( ย้อนกลับ ) A\mathbf x = \mathbf b \iff L\mathbf y = \mathbf b \ (\text{ไปข้างหน้า}),\quad U\mathbf x = \mathbf y \ (\text{ย้อนกลับ}) A x = b ⟺ L y = b ( ไปข้างหน้า ) , U x = y ( ย้อนกลับ )
N9 LU with pivoting P A = L U PA = LU P A = LU
P A = L U , L y = P b , U x = y PA = LU,\qquad L\mathbf y = P\mathbf b,\quad U\mathbf x = \mathbf y P A = LU , L y = P b , U x = y
P P P คือเมทริกซ์เอกลักษณ์ที่สลับแถวตามที่ทำจริง ทุกเมทริกซ์จัตุรัสแยกได้ในรูปนี้
N10 Determinant from LU ดีเทอร์มิแนนต์ฟรีจาก LU
det A = ( − 1 ) จำนวนการสลับแถว ∏ i = 1 n u i i \det A = (-1)^{\text{จำนวนการสลับแถว}}\prod_{i=1}^{n}u_{ii} det A = ( − 1 ) จำนวนการสลับแถว i = 1 ∏ n u ii
นี่คือวิธีที่โปรแกรมหาดีเทอร์มิแนนต์จริง ไม่ใช่การกระจายโคแฟกเตอร์
ตัวอย่าง N-2 · LU แล้วแก้สอง b แยก A = ( 1 2 4 3 8 14 2 6 13 ) A = \begin{pmatrix} 1 & 2 & 4 \\ 3 & 8 & 14 \\ 2 & 6 & 13 \end{pmatrix} A = 1 3 2 2 8 6 4 14 13 เป็น LU แล้วแก้ A x = ( 3 , 13 , 4 ) T A\mathbf x = (3, 13, 4)^T A x = ( 3 , 13 , 4 ) T และ A x = ( 1 , 1 , 1 ) T A\mathbf x = (1, 1, 1)^T A x = ( 1 , 1 , 1 ) T ลองในแล็บ
หลักที่ 1: ℓ 21 = 3 , ℓ 31 = 2 \ell_{21} = 3,\ \ell_{31} = 2 ℓ 21 = 3 , ℓ 31 = 2 ได้แถวใหม่ ( 0 , 2 , 2 ) (0, 2, 2) ( 0 , 2 , 2 ) และ ( 0 , 2 , 5 ) (0, 2, 5) ( 0 , 2 , 5 ) · หลักที่ 2: ℓ 32 = 2 / 2 = 1 \ell_{32} = 2/2 = 1 ℓ 32 = 2/2 = 1 ได้ ( 0 , 0 , 3 ) (0, 0, 3) ( 0 , 0 , 3 )
L = ( 1 0 0 3 1 0 2 1 1 ) , U = ( 1 2 4 0 2 2 0 0 3 ) , det A = 1 ⋅ 2 ⋅ 3 = 6 L = \begin{pmatrix} 1 & 0 & 0 \\ \hlF{3} & 1 & 0 \\ \hlF{2} & \hlF{1} & 1 \end{pmatrix},\qquad U = \begin{pmatrix} \hlP{1} & 2 & 4 \\ 0 & \hlP{2} & 2 \\ 0 & 0 & \hlP{3} \end{pmatrix},\qquad \det A = 1\cdot2\cdot3 = 6 L = 1 3 2 0 1 1 0 0 1 , U = 1 0 0 2 2 0 4 2 3 , det A = 1 ⋅ 2 ⋅ 3 = 6
b = ( 3 , 13 , 4 ) \mathbf b = (3, 13, 4) b = ( 3 , 13 , 4 ) : ไปข้างหน้า y 1 = 3 , y 2 = 13 − 3 ( 3 ) = 4 , y 3 = 4 − 2 ( 3 ) − 1 ( 4 ) = − 6 y_1 = 3,\ y_2 = 13 - 3(3) = 4,\ y_3 = 4 - 2(3) - 1(4) = -6 y 1 = 3 , y 2 = 13 − 3 ( 3 ) = 4 , y 3 = 4 − 2 ( 3 ) − 1 ( 4 ) = − 6 N8
ย้อนกลับ x 3 = − 6 / 3 = − 2 , x 2 = ( 4 − 2 ( − 2 ) ) / 2 = 4 , x 1 = 3 − 2 ( 4 ) − 4 ( − 2 ) = 3 x_3 = -6/3 = -2,\ x_2 = (4 - 2(-2))/2 = 4,\ x_1 = 3 - 2(4) - 4(-2) = 3 x 3 = − 6/3 = − 2 , x 2 = ( 4 − 2 ( − 2 )) /2 = 4 , x 1 = 3 − 2 ( 4 ) − 4 ( − 2 ) = 3
b = ( 1 , 1 , 1 ) \mathbf b = (1, 1, 1) b = ( 1 , 1 , 1 ) ใช้ L , U L, U L , U เดิม: y = ( 1 , − 2 , 1 ) \mathbf y = (1, -2, 1) y = ( 1 , − 2 , 1 ) แล้ว x 3 = 1 3 , x 2 = − 2 − 2 / 3 2 = − 4 3 , x 1 = 1 − 2 ( − 4 3 ) − 4 ( 1 3 ) = 7 3 x_3 = \tfrac13,\ x_2 = \tfrac{-2 - 2/3}{2} = -\tfrac43,\ x_1 = 1 - 2(-\tfrac43) - 4(\tfrac13) = \tfrac73 x 3 = 3 1 , x 2 = 2 − 2 − 2/3 = − 3 4 , x 1 = 1 − 2 ( − 3 4 ) − 4 ( 3 1 ) = 3 7
x = ( 3 , 4 , − 2 ) \mathbf x = (3, 4, -2) x = ( 3 , 4 , − 2 ) และ x = ( 7 3 , − 4 3 , 1 3 ) \mathbf x = (\tfrac73, -\tfrac43, \tfrac13) x = ( 3 7 , − 3 4 , 3 1 )
ตรวจแถว 2 ของคำตอบแรก: 3 ( 3 ) + 8 ( 4 ) + 14 ( − 2 ) = 9 + 32 − 28 = 13 3(3) + 8(4) + 14(-2) = 9 + 32 - 28 = 13 3 ( 3 ) + 8 ( 4 ) + 14 ( − 2 ) = 9 + 32 − 28 = 13 ✓ · คำตอบที่สองไม่ต้องแยก LU ใหม่ ใช้แค่แทนค่าสองรอบ
ตัวอย่าง N-3 · PA = LU แยก A = ( 2 1 1 4 − 6 0 − 2 7 2 ) A = \begin{pmatrix} 2 & 1 & 1 \\ 4 & -6 & 0 \\ -2 & 7 & 2 \end{pmatrix} A = 2 4 − 2 1 − 6 7 1 0 2 แบบสลับแถว (partial pivoting) และหา det A \det A det A ลองในแล็บ
หลัก 1 ตัวใหญ่สุดคือ 4 (แถว 2) สลับ R 1 ↔ R 2 R_1 \leftrightarrow R_2 R 1 ↔ R 2 แล้ว ℓ 21 = 2 / 4 = 1 2 , ℓ 31 = − 2 / 4 = − 1 2 \ell_{21} = 2/4 = \tfrac12,\ \ell_{31} = -2/4 = -\tfrac12 ℓ 21 = 2/4 = 2 1 , ℓ 31 = − 2/4 = − 2 1
( 4 − 6 0 0 4 1 0 4 2 ) \begin{pmatrix} 4 & -6 & 0 \\ 0 & 4 & 1 \\ 0 & 4 & 2 \end{pmatrix} 4 0 0 − 6 4 4 0 1 2
หลัก 2 มี 4 สองตัวเท่ากัน คงแถว 2 ไว้ ℓ 32 = 1 \ell_{32} = 1 ℓ 32 = 1 ได้ u 33 = 2 − 1 = 1 u_{33} = 2 - 1 = 1 u 33 = 2 − 1 = 1
P = ( 0 1 0 1 0 0 0 0 1 ) , L = ( 1 0 0 1 2 1 0 − 1 2 1 1 ) , U = ( 4 − 6 0 0 4 1 0 0 1 ) , det A = − ( 4 ⋅ 4 ⋅ 1 ) = − 16 P = \begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix},\ L = \begin{pmatrix} 1 & 0 & 0 \\ \tfrac12 & 1 & 0 \\ -\tfrac12 & 1 & 1 \end{pmatrix},\ U = \begin{pmatrix} 4 & -6 & 0 \\ 0 & 4 & 1 \\ 0 & 0 & 1 \end{pmatrix},\ \det A = -(4\cdot4\cdot1) = -16 P = 0 1 0 1 0 0 0 0 1 , L = 1 2 1 − 2 1 0 1 1 0 0 1 , U = 4 0 0 − 6 4 0 0 1 1 , det A = − ( 4 ⋅ 4 ⋅ 1 ) = − 16
สลับแถวหนึ่งครั้ง เครื่องหมายจึงเป็นลบ N10 · ตรวจด้วยซาร์รัส: 2 ( − 12 ) − 1 ( 8 ) + 1 ( 28 − 12 ) = − 16 2(-12) - 1(8) + 1(28 - 12) = -16 2 ( − 12 ) − 1 ( 8 ) + 1 ( 28 − 12 ) = − 16 ✓
การแยกโชเลสกี (Cholesky) สำหรับเมทริกซ์สมมาตรบวกแน่นอน กลาง
เมทริกซ์ความนำ G G G ของวงจรตัวต้านทาน เมทริกซ์สติฟเนสของโครงสร้าง และ A T A A^TA A T A ของกำลังสองน้อยสุด ล้วนสมมาตรและบวกแน่นอน (symmetric positive definite, SPD) เขียนได้เป็น A = L L T A = LL^T A = L L T ใช้งานครึ่งหนึ่งของ LU และไม่ต้องสลับแถวเลย
N11 Cholesky factorisation A = L L T A = LL^T A = L L T
ℓ j j = a j j − ∑ k = 1 j − 1 ℓ j k 2 , ℓ i j = 1 ℓ j j ( a i j − ∑ k = 1 j − 1 ℓ i k ℓ j k ) ( i > j ) \ell_{jj} = \sqrt{a_{jj} - \sum_{k=1}^{j-1}\ell_{jk}^2},\qquad \ell_{ij} = \frac{1}{\ell_{jj}}\Bigl(a_{ij} - \sum_{k=1}^{j-1}\ell_{ik}\ell_{jk}\Bigr)\ (i \gt j) ℓ jj = a jj − k = 1 ∑ j − 1 ℓ jk 2 , ℓ ij = ℓ jj 1 ( a ij − k = 1 ∑ j − 1 ℓ ik ℓ jk ) ( i > j )
ถ้าค่าใต้รากติดลบหรือเป็นศูนย์ แปลว่าเมทริกซ์ไม่บวกแน่นอน (ใช้เป็นวิธีทดสอบ SPD ได้) · ต้นทุน ≈ 1 3 n 3 \approx \tfrac13n^3 ≈ 3 1 n 3 flops
ตัวอย่าง N-4 · วงจรสามโนด สมการโนด G v = i G\mathbf v = \mathbf i G v = i มี G = ( 4 2 2 2 5 3 2 3 6 ) G = \begin{pmatrix} 4 & 2 & 2 \\ 2 & 5 & 3 \\ 2 & 3 & 6 \end{pmatrix} G = 4 2 2 2 5 3 2 3 6 (S) และ i = ( 10 , 13 , 17 ) \mathbf i = (10, 13, 17) i = ( 10 , 13 , 17 ) (A) แก้ด้วยโชเลสกี ลองในแล็บ
หลัก 1: ℓ 11 = 4 = 2 , ℓ 21 = 2 / 2 = 1 , ℓ 31 = 2 / 2 = 1 \ell_{11} = \sqrt4 = 2,\ \ell_{21} = 2/2 = 1,\ \ell_{31} = 2/2 = 1 ℓ 11 = 4 = 2 , ℓ 21 = 2/2 = 1 , ℓ 31 = 2/2 = 1 N11
หลัก 2: ℓ 22 = 5 − 1 2 = 2 , ℓ 32 = ( 3 − 1 ⋅ 1 ) / 2 = 1 \ell_{22} = \sqrt{5 - 1^2} = 2,\ \ell_{32} = (3 - 1\cdot1)/2 = 1 ℓ 22 = 5 − 1 2 = 2 , ℓ 32 = ( 3 − 1 ⋅ 1 ) /2 = 1 · หลัก 3: ℓ 33 = 6 − 1 − 1 = 2 \ell_{33} = \sqrt{6 - 1 - 1} = 2 ℓ 33 = 6 − 1 − 1 = 2
L = ( 2 0 0 1 2 0 1 1 2 ) L = \begin{pmatrix} 2 & 0 & 0 \\ 1 & 2 & 0 \\ 1 & 1 & 2 \end{pmatrix} L = 2 1 1 0 2 1 0 0 2
L y = i L\mathbf y = \mathbf i L y = i : y 1 = 5 , y 2 = ( 13 − 5 ) / 2 = 4 , y 3 = ( 17 − 5 − 4 ) / 2 = 4 y_1 = 5,\ y_2 = (13 - 5)/2 = 4,\ y_3 = (17 - 5 - 4)/2 = 4 y 1 = 5 , y 2 = ( 13 − 5 ) /2 = 4 , y 3 = ( 17 − 5 − 4 ) /2 = 4 · L T v = y L^T\mathbf v = \mathbf y L T v = y : v 3 = 2 , v 2 = ( 4 − 2 ) / 2 = 1 , v 1 = ( 5 − 1 − 2 ) / 2 = 1 v_3 = 2,\ v_2 = (4 - 2)/2 = 1,\ v_1 = (5 - 1 - 2)/2 = 1 v 3 = 2 , v 2 = ( 4 − 2 ) /2 = 1 , v 1 = ( 5 − 1 − 2 ) /2 = 1
v = ( 1 , 1 , 2 ) \mathbf v = (1, 1, 2) v = ( 1 , 1 , 2 ) V
ตรวจ: 4 + 2 + 4 = 10 4 + 2 + 4 = 10 4 + 2 + 4 = 10 ✓ · 2 + 5 + 6 = 13 2 + 5 + 6 = 13 2 + 5 + 6 = 13 ✓ · 2 + 3 + 12 = 17 2 + 3 + 12 = 17 2 + 3 + 12 = 17 ✓
อัลกอริทึมโทมัส: ระบบสามแนวทแยงในเวลา O ( n ) O(n) O ( n ) กลาง
ปัญหาหนึ่งมิติ เช่น การนำความร้อนตามแท่งโลหะ แรงดันตามสายส่งแบบขั้นบันได (ladder network) และการทำเส้นโค้ง spline ให้เมทริกซ์ที่มีตัวเลขแค่บนแนวทแยงและข้าง ๆ การกำจัดแบบเกาส์จึงลดเหลือการวนลูปเดียว
N12 Thomas algorithm (TDMA) สำหรับ a i x i − 1 + b i x i + c i x i + 1 = d i a_ix_{i-1} + b_ix_i + c_ix_{i+1} = d_i a i x i − 1 + b i x i + c i x i + 1 = d i
c 1 ′ = c 1 b 1 , d 1 ′ = d 1 b 1 ; c i ′ = c i b i − a i c i − 1 ′ , d i ′ = d i − a i d i − 1 ′ b i − a i c i − 1 ′ ; x n = d n ′ , x i = d i ′ − c i ′ x i + 1 c_1' = \frac{c_1}{b_1},\ d_1' = \frac{d_1}{b_1};\quad c_i' = \frac{c_i}{b_i - a_ic_{i-1}'},\ d_i' = \frac{d_i - a_id_{i-1}'}{b_i - a_ic_{i-1}'};\quad x_n = d_n',\ x_i = d_i' - c_i'x_{i+1} c 1 ′ = b 1 c 1 , d 1 ′ = b 1 d 1 ; c i ′ = b i − a i c i − 1 ′ c i , d i ′ = b i − a i c i − 1 ′ d i − a i d i − 1 ′ ; x n = d n ′ , x i = d i ′ − c i ′ x i + 1
ราว 8 n 8n 8 n flops แทน 2 3 n 3 \tfrac23n^3 3 2 n 3 · ปลอดภัยเมื่อเมทริกซ์ทแยงเด่น (ไม่ต้องสลับแถว)
ตัวอย่าง N-5 · แท่งความร้อน 4 โหนด แท่งโลหะปลายซ้าย 100 °C ปลายขวา 0 °C แบ่ง 4 โหนดภายใน สมการสภาวะคงตัว − T i − 1 + 2 T i − T i + 1 = 0 -T_{i-1} + 2T_i - T_{i+1} = 0 − T i − 1 + 2 T i − T i + 1 = 0 หา T 1 , … , T 4 T_1, \dots, T_4 T 1 , … , T 4 ลองในแล็บ
ย้ายอุณหภูมิขอบไปทางขวา: a i = − 1 , b i = 2 , c i = − 1 , d = ( 100 , 0 , 0 , 0 ) a_i = -1,\ b_i = 2,\ c_i = -1,\ \mathbf d = (100, 0, 0, 0) a i = − 1 , b i = 2 , c i = − 1 , d = ( 100 , 0 , 0 , 0 )
กวาดไปข้างหน้า N12 : c ′ = ( − 1 2 , − 2 3 , − 3 4 ) , d ′ = ( 50 , 100 3 , 25 , 20 ) c' = (-\tfrac12, -\tfrac23, -\tfrac34),\quad d' = (50, \tfrac{100}{3}, 25, 20) c ′ = ( − 2 1 , − 3 2 , − 4 3 ) , d ′ = ( 50 , 3 100 , 25 , 20 )
ย้อนกลับ: T 4 = 20 , T 3 = 25 + 3 4 ( 20 ) = 40 , T 2 = 100 3 + 2 3 ( 40 ) = 60 , T 1 = 50 + 1 2 ( 60 ) = 80 T_4 = 20,\ T_3 = 25 + \tfrac34(20) = 40,\ T_2 = \tfrac{100}{3} + \tfrac23(40) = 60,\ T_1 = 50 + \tfrac12(60) = 80 T 4 = 20 , T 3 = 25 + 4 3 ( 20 ) = 40 , T 2 = 3 100 + 3 2 ( 40 ) = 60 , T 1 = 50 + 2 1 ( 60 ) = 80
( T 1 , T 2 , T 3 , T 4 ) = ( 80 , 60 , 40 , 20 ) (T_1, T_2, T_3, T_4) = (80, 60, 40, 20) ( T 1 , T 2 , T 3 , T 4 ) = ( 80 , 60 , 40 , 20 ) °C
ได้เส้นตรงพอดี ตรงกับฟิสิกส์ของการนำความร้อนสภาวะคงตัวที่ไม่มีแหล่งความร้อนภายใน
วิธีทำซ้ำ: จาโคบี เกาส์-ไซเดล และ SOR กลาง
แนวคิดง่ายมาก: แก้สมการที่ i i i หา x i x_i x i โดยใช้ค่าประมาณของตัวแปรอื่น แล้ววนทำซ้ำจนค่าไม่เปลี่ยน ไม่ต้องลดแถว ไม่ต้องเก็บเมทริกซ์เต็ม จึงเหมาะกับระบบใหญ่ที่ส่วนใหญ่เป็นศูนย์
N13 Jacobi method วิธีจาโคบี
x i ( k + 1 ) = 1 a i i ( b i − ∑ j ≠ i a i j x j ( k ) ) x_i^{(k+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \ne i} a_{ij}\,x_j^{(k)}\Bigr) x i ( k + 1 ) = a ii 1 ( b i − j = i ∑ a ij x j ( k ) )
ทุกตัวแปรในรอบใหม่คำนวณจากค่ารอบก่อนทั้งหมด ต้องเก็บเวกเตอร์สองชุด คำนวณขนานได้
N14 Gauss–Seidel method วิธีเกาส์-ไซเดล
x i ( k + 1 ) = 1 a i i ( b i − ∑ j < i a i j x j ( k + 1 ) − ∑ j > i a i j x j ( k ) ) x_i^{(k+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \lt i} a_{ij}\,\hlU{x_j^{(k+1)}} - \sum_{j \gt i} a_{ij}\,x_j^{(k)}\Bigr) x i ( k + 1 ) = a ii 1 ( b i − j < i ∑ a ij x j ( k + 1 ) − j > i ∑ a ij x j ( k ) )
ใช้ค่าที่เพิ่งได้ทันที มักลู่เข้าเร็วกว่าจาโคบีราวสองเท่า เก็บเวกเตอร์ชุดเดียว
N15 Successive over-relaxation (SOR) ผ่อนปรนเกินต่อเนื่อง
x i ( k + 1 ) = ( 1 − ω ) x i ( k ) + ω x ~ i GS , 0 < ω < 2 x_i^{(k+1)} = (1 - \omega)\,x_i^{(k)} + \omega\,\tilde x_i^{\text{GS}},\qquad 0 \lt \omega \lt 2 x i ( k + 1 ) = ( 1 − ω ) x i ( k ) + ω x ~ i GS , 0 < ω < 2
ω = 1 \omega = 1 ω = 1 คือเกาส์-ไซเดล · ω > 1 \omega \gt 1 ω > 1 ก้าวเลยไปทางเดิม (เร่ง) · ω < 1 \omega \lt 1 ω < 1 หน่วง (ใช้เมื่อแกว่ง)
N16 Matrix form รูปเมทริกซ์ A = D + L + U A = D + L + U A = D + L + U (ทแยง · ใต้ทแยง · เหนือทแยง)
T J = − D − 1 ( L + U ) , T G S = − ( D + L ) − 1 U , T ω = ( D + ω L ) − 1 [ ( 1 − ω ) D − ω U ] T_J = -D^{-1}(L + U),\qquad T_{GS} = -(D + L)^{-1}U,\qquad T_\omega = (D + \omega L)^{-1}\bigl[(1 - \omega)D - \omega U\bigr] T J = − D − 1 ( L + U ) , T GS = − ( D + L ) − 1 U , T ω = ( D + ω L ) − 1 [ ( 1 − ω ) D − ω U ]
ทุกวิธีเขียนได้เป็น x ( k + 1 ) = T x ( k ) + c \mathbf x^{(k+1)} = T\mathbf x^{(k)} + \mathbf c x ( k + 1 ) = T x ( k ) + c ความคลาดเคลื่อนจึงเป็น e ( k ) = T k e ( 0 ) \mathbf e^{(k)} = T^k\mathbf e^{(0)} e ( k ) = T k e ( 0 )
N17 Stopping criteria เกณฑ์หยุด
∥ x ( k + 1 ) − x ( k ) ∥ ∞ ∥ x ( k + 1 ) ∥ ∞ < ε หรือ ∣ ε a , i ∣ = ∣ x i ( k + 1 ) − x i ( k ) x i ( k + 1 ) ∣ × 100 % < ε s = ( 0.5 × 10 2 − n ) % \frac{\lVert\mathbf x^{(k+1)} - \mathbf x^{(k)}\rVert_\infty}{\lVert\mathbf x^{(k+1)}\rVert_\infty} \lt \varepsilon \quad\text{หรือ}\quad \lvert\varepsilon_{a,i}\rvert = \Bigl|\frac{x_i^{(k+1)} - x_i^{(k)}}{x_i^{(k+1)}}\Bigr|\times100\% \lt \varepsilon_s = (0.5\times10^{2-n})\% ∥ x ( k + 1 ) ∥ ∞ ∥ x ( k + 1 ) − x ( k ) ∥ ∞ < ε หรือ ∣ ε a , i ∣ = x i ( k + 1 ) x i ( k + 1 ) − x i ( k ) × 100% < ε s = ( 0.5 × 1 0 2 − n ) %
เกณฑ์ของสการ์โบโรห์รับประกันความถูกต้องอย่างน้อย n n n หลักนัยสำคัญ · ควรตรวจส่วนเหลือ ∥ b − A x ( k ) ∥ \lVert\mathbf b - A\mathbf x^{(k)}\rVert ∥ b − A x ( k ) ∥ ด้วย และกำหนดจำนวนรอบสูงสุดกันวนไม่จบ
ตัวอย่าง N-6 · จาโคบีเทียบเกาส์-ไซเดล แก้ 4 x − y + z = 7 4 x − 8 y + z = − 21 − 2 x + y + 5 z = 15 \begin{aligned} 4x - y + z &= 7 \\ 4x - 8y + z &= -21 \\ -2x + y + 5z &= 15 \end{aligned} 4 x − y + z 4 x − 8 y + z − 2 x + y + 5 z = 7 = − 21 = 15 เริ่มที่ x ( 0 ) = ( 1 , 2 , 2 ) \mathbf x^{(0)} = (1, 2, 2) x ( 0 ) = ( 1 , 2 , 2 ) (คำตอบจริง ( 2 , 4 , 3 ) (2, 4, 3) ( 2 , 4 , 3 ) ) ลองในแล็บ
เมทริกซ์ทแยงเด่นแท้: 4 > 1 + 1 , 8 > 4 + 1 , 5 > 2 + 1 4 \gt 1 + 1,\ 8 \gt 4 + 1,\ 5 \gt 2 + 1 4 > 1 + 1 , 8 > 4 + 1 , 5 > 2 + 1 จึงลู่เข้าแน่นอน N18 · จัดรูปสูตรทำซ้ำ
x = 7 + y − z 4 , y = 21 + 4 x + z 8 , z = 15 + 2 x − y 5 x = \frac{7 + y - z}{4},\qquad y = \frac{21 + 4x + z}{8},\qquad z = \frac{15 + 2x - y}{5} x = 4 7 + y − z , y = 8 21 + 4 x + z , z = 5 15 + 2 x − y
จาโคบีรอบที่ 1 (ใช้ ( 1 , 2 , 2 ) (1, 2, 2) ( 1 , 2 , 2 ) ทั้งหมด) N13
x = 7 + 2 − 2 4 = 1.75 , y = 21 + 4 + 2 8 = 3.375 , z = 15 + 2 − 2 5 = 3.000 x = \tfrac{7 + 2 - 2}{4} = 1.75,\quad y = \tfrac{21 + 4 + 2}{8} = 3.375,\quad z = \tfrac{15 + 2 - 2}{5} = 3.000 x = 4 7 + 2 − 2 = 1.75 , y = 8 21 + 4 + 2 = 3.375 , z = 5 15 + 2 − 2 = 3.000
เกาส์-ไซเดลรอบที่ 1 (ใช้ x x x ใหม่ทันที) N14
x = 1.75 , y = 21 + 4 ( 1.75 ) + 2 8 = 3.75 , z = 15 + 2 ( 1.75 ) − 3.75 5 = 2.95 x = 1.75,\quad y = \tfrac{21 + 4(\hlU{1.75}) + 2}{8} = 3.75,\quad z = \tfrac{15 + 2(\hlU{1.75}) - \hlU{3.75}}{5} = 2.95 x = 1.75 , y = 8 21 + 4 ( 1.75 ) + 2 = 3.75 , z = 5 15 + 2 ( 1.75 ) − 3.75 = 2.95
k จาโคบี ( x , y , z ) (x, y, z) ( x , y , z ) เกาส์-ไซเดล ( x , y , z ) (x, y, z) ( x , y , z )
0 1, 2, 2 1, 2, 2
1 1.750, 3.375, 3.000 1.750, 3.750, 2.950
2 1.844, 3.875, 3.025 1.950, 3.969, 2.986
3 1.963, 3.925, 2.963 1.996, 3.996, 2.999
4 1.991, 3.977, 3.000 1.9993, 3.9995, 2.9998
5 1.994, 3.995, 3.001 1.99993, 3.99994, 2.99998
ทั้งสองวิธีเข้าใกล้ ( 2 , 4 , 3 ) (2, 4, 3) ( 2 , 4 , 3 ) · เกาส์-ไซเดลคลาดเคลื่อนไม่ถึง 0.001 ตั้งแต่รอบที่ 4 ส่วนจาโคบีต้องใช้ 7 รอบ
รัศมีสเปกตรัม ρ ( T J ) ≈ 0.335 \rho(T_J) \approx 0.335 ρ ( T J ) ≈ 0.335 และ ρ ( T G S ) ≈ 0.125 \rho(T_{GS}) \approx 0.125 ρ ( T GS ) ≈ 0.125 ความคลาดเคลื่อนจึงลดลงราว 3 เท่าต่อรอบสำหรับจาโคบี และ 8 เท่าต่อรอบสำหรับเกาส์-ไซเดล N20
ลู่เข้าเมื่อไร และเร็วแค่ไหน กลาง → ขั้นสูง
N18 Diagonal dominance ทแยงเด่นแท้ (เงื่อนไขพอเพียง)
∣ a i i ∣ > ∑ j ≠ i ∣ a i j ∣ ทุกแถว ⇒ จาโคบีและเกาส์-ไซเดลลู่เข้าทุกค่าเริ่มต้น |a_{ii}| \gt \sum_{j \ne i}|a_{ij}|\ \ \text{ทุกแถว} \ \Rightarrow\ \text{จาโคบีและเกาส์-ไซเดลลู่เข้าทุกค่าเริ่มต้น} ∣ a ii ∣ > j = i ∑ ∣ a ij ∣ ทุกแถว ⇒ จาโคบีและเกาส์ - ไซเดลลู่เข้าทุกค่าเริ่มต้น
ถ้าไม่ทแยงเด่น ลองสลับลำดับสมการ ก่อน (แล็บด้านล่าง ชุด “สลับสมการ” ลู่ออก) · สมมาตรบวกแน่นอนก็ทำให้เกาส์-ไซเดลลู่เข้าเช่นกัน
N19 Spectral radius test เงื่อนไขจำเป็นและพอเพียง
x ( k ) → x ทุก x ( 0 ) ⟺ ρ ( T ) = max i ∣ λ i ( T ) ∣ < 1 \mathbf x^{(k)} \to \mathbf x \ \text{ทุก } \mathbf x^{(0)} \iff \rho(T) = \max_i|\lambda_i(T)| \lt 1 x ( k ) → x ทุก x ( 0 ) ⟺ ρ ( T ) = i max ∣ λ i ( T ) ∣ < 1
λ i \lambda_i λ i คือ ค่าเฉพาะ ของเมทริกซ์การทำซ้ำ · SOR ลู่ออกเสมอถ้า ω ∉ ( 0 , 2 ) \omega \notin (0, 2) ω ∈ / ( 0 , 2 ) (คาฮาน)
N20 Rate of convergence จำนวนรอบที่ต้องใช้
∥ e ( k ) ∥ ≈ ρ k ∥ e ( 0 ) ∥ ⇒ k ≈ d − log 10 ρ รอบ เพื่อเพิ่มความแม่น d หลัก \lVert\mathbf e^{(k)}\rVert \approx \rho^k\lVert\mathbf e^{(0)}\rVert \ \Rightarrow\ k \approx \frac{d}{-\log_{10}\rho} \ \text{รอบ เพื่อเพิ่มความแม่น } d \text{ หลัก} ∥ e ( k ) ∥ ≈ ρ k ∥ e ( 0 ) ∥ ⇒ k ≈ − log 10 ρ d รอบ เพื่อเพิ่มความแม่น d หลัก
N21 Optimal ω (Young) ω \omega ω ที่ดีที่สุด
ρ G S = ρ J 2 , ω ∗ = 2 1 + 1 − ρ J 2 , ρ ( T ω ∗ ) = ω ∗ − 1 \rho_{GS} = \rho_J^2,\qquad \omega^* = \frac{2}{1 + \sqrt{1 - \rho_J^2}},\qquad \rho(T_{\omega^*}) = \omega^* - 1 ρ GS = ρ J 2 , ω ∗ = 1 + 1 − ρ J 2 2 , ρ ( T ω ∗ ) = ω ∗ − 1
ใช้ได้กับเมทริกซ์ “เรียงลำดับสอดคล้อง” เช่น สามแนวทแยง · สำหรับ tridiag ( − 1 , 2 , − 1 ) \operatorname{tridiag}(-1, 2, -1) tridiag ( − 1 , 2 , − 1 ) ขนาด n n n : ρ J = cos π n + 1 \rho_J = \cos\frac{\pi}{n + 1} ρ J = cos n + 1 π
ตัวอย่าง N-7 · ทำไมต้อง SOR ระบบแท่งความร้อน tridiag ( − 1 , 2 , − 1 ) \operatorname{tridiag}(-1, 2, -1) tridiag ( − 1 , 2 , − 1 ) ขนาด 10×10 ต้องใช้กี่รอบเพื่อลดความคลาดเคลื่อน 10 6 10^6 1 0 6 เท่า สำหรับจาโคบี เกาส์-ไซเดล และ SOR ที่ ω ∗ \omega^* ω ∗ ลองในแล็บ
ρ J = cos π 11 ≈ 0.9595 \rho_J = \cos\frac{\pi}{11} \approx 0.9595 ρ J = cos 11 π ≈ 0.9595 และ ρ G S = ρ J 2 ≈ 0.9206 \rho_{GS} = \rho_J^2 \approx 0.9206 ρ GS = ρ J 2 ≈ 0.9206 N21
ω ∗ = 2 1 + sin ( π / 11 ) ≈ 1.560 \omega^* = \dfrac{2}{1 + \sin(\pi/11)} \approx 1.560 ω ∗ = 1 + sin ( π /11 ) 2 ≈ 1.560 ได้ ρ S O R = ω ∗ − 1 ≈ 0.560 \rho_{SOR} = \omega^* - 1 \approx 0.560 ρ SOR = ω ∗ − 1 ≈ 0.560
k ≈ 6 / ( − log 10 ρ ) k \approx 6/(-\log_{10}\rho) k ≈ 6/ ( − log 10 ρ ) N20 : จาโคบี 6 / 0.018 ≈ 334 6/0.018 \approx 334 6/0.018 ≈ 334 · เกาส์-ไซเดล ≈ 167 \approx 167 ≈ 167 · SOR 6 / 0.252 ≈ 24 6/0.252 \approx 24 6/0.252 ≈ 24
ราว 334, 167 และ 24 รอบ — SOR เร็วกว่าเกาส์-ไซเดลเกือบ 7 เท่าโดยแทบไม่เพิ่มงานต่อรอบ
ในแล็บ กดดู “สแกนหา ω ที่ดีที่สุด” จะเห็นจำนวนรอบต่ำสุดใกล้ ω ≈ 1.55 \omega \approx 1.55 ω ≈ 1.55 –1.6 1.6 1.6 (จำนวนรอบในแล็บต่างเล็กน้อยเพราะใช้เกณฑ์หยุด N17)
ซิมูเลเตอร์วิธีทำซ้ำ: จาโคบี · เกาส์-ไซเดล · SOR
เลือกชุดระบบ วิธี และ ω \omega ω กราฟแสดงความคลาดเคลื่อนของทั้งสามวิธีเทียบกัน (แตะกราฟเพื่อดูค่าแต่ละรอบ) ชุด 2×2 แสดงเส้นทางของค่าประมาณบนภาพเส้นตรงสองเส้น ลองชุด “สลับสมการ” เพื่อดูการลู่ออก
เลขเงื่อนไข: คำตอบเชื่อได้แค่ไหน กลาง → ขั้นสูง
อัลกอริทึมดีแค่ไหนก็แก้ปัญหาที่ “ป่วยโดยกำเนิด” ไม่ได้ ระบบที่สมการเกือบขนานกัน ข้อมูลผิดนิดเดียวคำตอบเปลี่ยนมาก เราวัดความป่วยนี้ด้วยเลขเงื่อนไข (condition number) ต่อยอดจาก ระบบป่วยในหน้าระบบสมการ
N22 Vector & matrix norms นอร์ม
∥ x ∥ ∞ = max i ∣ x i ∣ , ∥ x ∥ 1 = ∑ ∣ x i ∣ , ∥ x ∥ 2 = ∑ x i 2 ; ∥ A ∥ ∞ = max i ∑ j ∣ a i j ∣ , ∥ A ∥ 1 = max j ∑ i ∣ a i j ∣ , ∥ A ∥ 2 = σ max \lVert\mathbf x\rVert_\infty = \max_i|x_i|,\quad \lVert\mathbf x\rVert_1 = \sum|x_i|,\quad \lVert\mathbf x\rVert_2 = \sqrt{\textstyle\sum x_i^2};\qquad \lVert A\rVert_\infty = \max_i\sum_j|a_{ij}|,\quad \lVert A\rVert_1 = \max_j\sum_i|a_{ij}|,\quad \lVert A\rVert_2 = \sigma_{\max} ∥ x ∥ ∞ = i max ∣ x i ∣ , ∥ x ∥ 1 = ∑ ∣ x i ∣ , ∥ x ∥ 2 = ∑ x i 2 ; ∥ A ∥ ∞ = i max j ∑ ∣ a ij ∣ , ∥ A ∥ 1 = j max i ∑ ∣ a ij ∣ , ∥ A ∥ 2 = σ m a x
N23 Condition number เลขเงื่อนไข
κ ( A ) = ∥ A ∥ ∥ A − 1 ∥ ≥ 1 , κ 2 ( A ) = σ max σ min \kappa(A) = \lVert A\rVert\,\lVert A^{-1}\rVert \ge 1,\qquad \kappa_2(A) = \frac{\sigma_{\max}}{\sigma_{\min}} κ ( A ) = ∥ A ∥ ∥ A − 1 ∥ ≥ 1 , κ 2 ( A ) = σ m i n σ m a x
κ ≈ 1 \kappa \approx 1 κ ≈ 1 ดีมาก · κ → ∞ \kappa \to \infty κ → ∞ เมื่อ A A A ใกล้เอกฐาน · det \det det เล็กไม่ได้แปลว่าป่วย (0.1 I 10 0.1I_{10} 0.1 I 10 มี det = 10 − 10 \det = 10^{-10} det = 1 0 − 10 แต่ κ = 1 \kappa = 1 κ = 1 )
N24 Error amplification ขยายความคลาดเคลื่อน
∥ δ x ∥ ∥ x ∥ ≤ κ ( A ) ∥ δ b ∥ ∥ b ∥ , หลักที่เสีย ≈ log 10 κ ( A ) \frac{\lVert\delta\mathbf x\rVert}{\lVert\mathbf x\rVert} \le \kappa(A)\frac{\lVert\delta\mathbf b\rVert}{\lVert\mathbf b\rVert},\qquad \text{หลักที่เสีย} \approx \log_{10}\kappa(A) ∥ x ∥ ∥ δ x ∥ ≤ κ ( A ) ∥ b ∥ ∥ δ b ∥ , หลักที่เสีย ≈ log 10 κ ( A )
ถ้า A A A คลาดเคลื่อนด้วย: ∥ δ x ∥ ∥ x ∥ ≤ κ 1 − κ ∥ δ A ∥ ∥ A ∥ ( ∥ δ A ∥ ∥ A ∥ + ∥ δ b ∥ ∥ b ∥ ) \dfrac{\lVert\delta\mathbf x\rVert}{\lVert\mathbf x\rVert} \le \dfrac{\kappa}{1 - \kappa\frac{\lVert\delta A\rVert}{\lVert A\rVert}}\Bigl(\dfrac{\lVert\delta A\rVert}{\lVert A\rVert} + \dfrac{\lVert\delta\mathbf b\rVert}{\lVert\mathbf b\rVert}\Bigr) ∥ x ∥ ∥ δ x ∥ ≤ 1 − κ ∥ A ∥ ∥ δ A ∥ κ ( ∥ A ∥ ∥ δ A ∥ + ∥ b ∥ ∥ δ b ∥ )
N25 Residual vs error ส่วนเหลือไม่ใช่ความคลาดเคลื่อน
r = b − A x ~ , ∥ x − x ~ ∥ ∥ x ∥ ≤ κ ( A ) ∥ r ∥ ∥ b ∥ \mathbf r = \mathbf b - A\tilde{\mathbf x},\qquad \frac{\lVert\mathbf x - \tilde{\mathbf x}\rVert}{\lVert\mathbf x\rVert} \le \kappa(A)\frac{\lVert\mathbf r\rVert}{\lVert\mathbf b\rVert} r = b − A x ~ , ∥ x ∥ ∥ x − x ~ ∥ ≤ κ ( A ) ∥ b ∥ ∥ r ∥
ส่วนเหลือเล็กรับประกันคำตอบแม่นก็ต่อเมื่อ κ \kappa κ ไม่ใหญ่
N26 Iterative refinement ปรับปรุงผลเฉลยซ้ำ
r = b − A x ~ ( ความละเอียดสูงขึ้น ) , L U δ = r , x ~ ← x ~ + δ \mathbf r = \mathbf b - A\tilde{\mathbf x}\ (\text{ความละเอียดสูงขึ้น}),\quad LU\,\boldsymbol\delta = \mathbf r,\quad \tilde{\mathbf x} \leftarrow \tilde{\mathbf x} + \boldsymbol\delta r = b − A x ~ ( ความละเอียดสูงขึ้น ) , LU δ = r , x ~ ← x ~ + δ
ใช้ LU เดิม ต้นทุนรอบละ ≈ n 2 \approx n^2 ≈ n 2 ได้หลักคืนมาเมื่อ κ ϵ mach < 1 \kappa\,\epsilon_{\text{mach}} \lt 1 κ ϵ mach < 1
ตัวอย่าง N-8 · ระบบป่วย x + y = 2 x + 1.0001 y = 2.0001 \begin{aligned} x + y &= 2 \\ x + 1.0001y &= 2.0001 \end{aligned} x + y x + 1.0001 y = 2 = 2.0001 มีคำตอบ ( 1 , 1 ) (1, 1) ( 1 , 1 ) ถ้าค่าทางขวาของสมการที่ 2 คลาดเป็น 2.0002 2.0002 2.0002 คำตอบเปลี่ยนเท่าไร เทียบกับ κ ∞ ( A ) \kappa_\infty(A) κ ∞ ( A )
แก้ใหม่: ลบสมการ 0.0001 y = 0.0002 ⇒ y = 2 , x = 0 0.0001y = 0.0002 \Rightarrow y = 2,\ x = 0 0.0001 y = 0.0002 ⇒ y = 2 , x = 0 — เปลี่ยนจาก ( 1 , 1 ) (1, 1) ( 1 , 1 ) เป็น ( 0 , 2 ) (0, 2) ( 0 , 2 )
A − 1 = 1 0.0001 ( 1.0001 − 1 − 1 1 ) A^{-1} = \dfrac{1}{0.0001}\begin{pmatrix} 1.0001 & -1 \\ -1 & 1 \end{pmatrix} A − 1 = 0.0001 1 ( 1.0001 − 1 − 1 1 ) ได้ ∥ A ∥ ∞ = 2.0001 , ∥ A − 1 ∥ ∞ = 20001 \lVert A\rVert_\infty = 2.0001,\ \lVert A^{-1}\rVert_\infty = 20001 ∥ A ∥ ∞ = 2.0001 , ∥ A − 1 ∥ ∞ = 20001 N22
κ ∞ ( A ) = 2.0001 × 20001 ≈ 4.0 × 10 4 \kappa_\infty(A) = 2.0001 \times 20001 \approx 4.0\times10^{4} κ ∞ ( A ) = 2.0001 × 20001 ≈ 4.0 × 1 0 4
ข้อมูลเปลี่ยน 0.0001 2.0001 ≈ 5 × 10 − 5 \dfrac{0.0001}{2.0001} \approx 5\times10^{-5} 2.0001 0.0001 ≈ 5 × 1 0 − 5 แต่คำตอบเปลี่ยน ∥ ( − 1 , 1 ) ∥ ∞ ∥ ( 1 , 1 ) ∥ ∞ = 1 \dfrac{\lVert(-1, 1)\rVert_\infty}{\lVert(1, 1)\rVert_\infty} = 1 ∥( 1 , 1 ) ∥ ∞ ∥( − 1 , 1 ) ∥ ∞ = 1 (100%) ขยาย 2 × 10 4 2\times10^4 2 × 1 0 4 เท่า ไม่เกิน κ \kappa κ ตาม N24
คำตอบเปลี่ยน 100% จากข้อมูลที่เปลี่ยน 0.005% · κ ∞ ≈ 4 × 10 4 \kappa_\infty \approx 4\times10^4 κ ∞ ≈ 4 × 1 0 4 เสียความแม่นราว 4–5 หลัก
ส่วนเหลือของ ( 0 , 2 ) (0, 2) ( 0 , 2 ) ในระบบเดิมคือ r = ( 0 , − 0.0001 ) \mathbf r = (0, -0.0001) r = ( 0 , − 0.0001 ) เล็กมาก แต่คำตอบผิดทั้งหมด ยืนยัน N25
งานจริง: แผ่นความร้อนและสนามศักย์ด้วยวิธีผ่อนคลาย (relaxation) กลาง
อุณหภูมิในแผ่นโลหะสภาวะคงตัว และศักย์ไฟฟ้าในบริเวณที่ไม่มีประจุ เป็นไปตามสมการลาปลาซ ∇ 2 T = 0 \nabla^2T = 0 ∇ 2 T = 0 เมื่อแบ่งเป็นตาราง สมการของแต่ละโหนดคือ “ค่าที่โหนด = ค่าเฉลี่ยของสี่โหนดรอบตัว” ได้ระบบสมการเชิงเส้นหนึ่งสมการต่อโหนด แผ่น 100×100 โหนดมีหนึ่งหมื่นตัวแปร แต่แต่ละสมการมีตัวแปรแค่ 5 ตัว เป็นงานของวิธีทำซ้ำโดยแท้
ตัวอย่าง N-9 · แผ่น 2×2 โหนด แผ่นสี่เหลี่ยมขอบบน 100 °C ขอบอื่น 0 °C มีโหนดภายใน T 1 , T 2 T_1, T_2 T 1 , T 2 (แถวบน) และ T 3 , T 4 T_3, T_4 T 3 , T 4 (แถวล่าง) หาอุณหภูมิทุกโหนด
สมการค่าเฉลี่ย เช่นที่ T 1 T_1 T 1 : 4 T 1 = 100 + 0 + T 2 + T 3 4T_1 = 100 + 0 + T_2 + T_3 4 T 1 = 100 + 0 + T 2 + T 3 เขียนครบสี่โหนด
( 4 − 1 − 1 0 − 1 4 0 − 1 − 1 0 4 − 1 0 − 1 − 1 4 ) ( T 1 T 2 T 3 T 4 ) = ( 100 100 0 0 ) \begin{pmatrix} 4 & -1 & -1 & 0 \\ -1 & 4 & 0 & -1 \\ -1 & 0 & 4 & -1 \\ 0 & -1 & -1 & 4 \end{pmatrix}\begin{pmatrix} T_1 \\ T_2 \\ T_3 \\ T_4 \end{pmatrix} = \begin{pmatrix} 100 \\ 100 \\ 0 \\ 0 \end{pmatrix} 4 − 1 − 1 0 − 1 4 0 − 1 − 1 0 4 − 1 0 − 1 − 1 4 T 1 T 2 T 3 T 4 = 100 100 0 0
สมมาตรซ้าย-ขวา T 1 = T 2 , T 3 = T 4 T_1 = T_2,\ T_3 = T_4 T 1 = T 2 , T 3 = T 4 เหลือ 3 T 1 − T 3 = 100 3T_1 - T_3 = 100 3 T 1 − T 3 = 100 และ 3 T 3 − T 1 = 0 3T_3 - T_1 = 0 3 T 3 − T 1 = 0 ได้ T 1 = 3 T 3 T_1 = 3T_3 T 1 = 3 T 3
T 1 = T 2 = 37.5 T_1 = T_2 = 37.5 T 1 = T 2 = 37.5 °C, T 3 = T 4 = 12.5 T_3 = T_4 = 12.5 T 3 = T 4 = 12.5 °C
เมทริกซ์ทแยงเด่น (4 ≥ 1 + 1 4 \ge 1 + 1 4 ≥ 1 + 1 และสมมาตรบวกแน่นอน) เกาส์-ไซเดลจึงลู่เข้าแน่นอน ลองตารางที่ละเอียดขึ้นในแล็บด้านล่าง
ตั้งอุณหภูมิขอบ กด ▶ เริ่ม แล้วดูความร้อนค่อย ๆ แผ่เข้าไปทีละรอบ เปลี่ยนวิธีและ ω \omega ω เพื่อเทียบความเร็ว ตารางด้านข้างบอกจำนวนรอบที่แต่ละวิธีต้องใช้ วางนิ้วหรือเมาส์บนช่องเพื่ออ่านอุณหภูมิ
เลือกวิธีอย่างไร และใช้ในโปรแกรมจริง กลาง
ลักษณะของระบบ วิธีที่เหมาะ เหตุผล
2–3 ตัวแปร ทำมือ ถามตัวแปรเดียว คราเมอร์ ดีเทอร์มิแนนต์สองตัวก็ได้คำตอบ
หนาแน่น n n n ถึงราวหมื่น LU + partial pivoting เสถียร ใช้ซ้ำกับหลาย b \mathbf b b ได้
สมมาตรบวกแน่นอน (วงจร R, โครงสร้าง) โชเลสกี เร็วกว่า LU สองเท่า ไม่ต้องสลับแถว
สามแนวทแยง (แท่ง สายส่ง spline) โทมัส O ( n ) O(n) O ( n )
ใหญ่และเบาบาง ทแยงเด่น เกาส์-ไซเดล / SOR ไม่ต้องเก็บเมทริกซ์เต็ม
ใหญ่มากและ SPD (FEM, วงจรชิป) Conjugate Gradient + preconditioner มาตรฐานของงานจำลองสมัยใหม่
κ \kappa κ ใหญ่ หรือเกือบเอกฐานปรับสเกล + refinement หรือ SVD / QR ลดผลการปัดเศษ แยกส่วนที่เป็นสัญญาณรบกวน
# Python (NumPy / SciPy)
import numpy as np
from scipy.linalg import lu_factor, lu_solve, cho_factor, cho_solve, solve_banded
A = np.array([[1, 2, 4], [3, 8, 14], [2, 6, 13]], float)
x = np.linalg.solve(A, [3, 13, 4]) # LAPACK: PA = LU + partial pivoting → [ 3. 4. -2.]
lu, piv = lu_factor(A) # แยกครั้งเดียว
x2 = lu_solve((lu, piv), [1, 1, 1]) # แก้ b ใหม่: [ 2.333 -1.333 0.333]
G = np.array([[4, 2, 2], [2, 5, 3], [2, 3, 6]], float)
v = cho_solve(cho_factor(G), [10, 13, 17]) # โชเลสกี → [1. 1. 2.]
print(np.linalg.cond(A, np.inf), np.linalg.matrix_rank(A))
% MATLAB / Octave
x = A \ [3; 13; 4]; [L, U, P] = lu(A); R = chol(G); cond(A, inf)
v = pcg(G, [10; 13; 17], 1e-10, 100); % conjugate gradient สำหรับระบบใหญ่
ข้อผิดพลาดที่พบบ่อย
กับดักในข้อสอบและในงานจริง
จาโคบีรอบเดียวกันเผลอใช้ค่าใหม่ — กลายเป็นเกาส์-ไซเดลโดยไม่ตั้งใจ ข้อสอบมักถามค่ารอบที่ 2 ซึ่งต่างกันชัด
สรุปว่า “ไม่ทแยงเด่น = ลู่ออก” — ทแยงเด่นเป็นเงื่อนไขพอเพียงเท่านั้น ต้องดู ρ ( T ) \rho(T) ρ ( T ) N19
หยุดเมื่อค่าเปลี่ยนน้อย แต่ไม่ตรวจส่วนเหลือ — ระบบที่ลู่เข้าช้ามากอาจเปลี่ยนน้อยทั้งที่ยังห่างคำตอบ
หา A − 1 A^{-1} A − 1 แล้วคูณ b \mathbf b b ในโปรแกรม — ช้ากว่าและคลาดเคลื่อนมากกว่าใช้ solve
เชื่อว่า det \det det ใกล้ศูนย์แปลว่าระบบป่วย — ให้ดู κ \kappa κ ไม่ใช่ det \det det N23
คำถามที่พบบ่อย ทำไมคอมพิวเตอร์ไม่ใช้กฎของคราเมอร์แก้ระบบสมการใหญ่? เพราะต้นทุนโตแบบแฟกทอเรียล ถ้าหาดีเทอร์มิแนนต์ด้วยการกระจายโคแฟกเตอร์ ระบบ 20 ตัวแปรต้องคูณราว 21! ≈ 5 × 10¹⁹ ครั้ง เครื่องที่คูณได้พันล้านครั้งต่อวินาทีต้องใช้ราว 1,600 ปี ขณะที่การกำจัดแบบเกาส์ใช้ราว n³/3 ≈ 2,700 ครั้ง และยังแม่นยำเชิงตัวเลขกว่า
Partial pivoting คืออะไร และทำไมต้องทำ? คือการสลับแถวในแต่ละหลักให้ตัวหลักเป็นตัวที่มีค่าสัมบูรณ์มากที่สุดในหลักนั้น ทำให้ตัวคูณ |m| ≤ 1 ความคลาดเคลื่อนจากการปัดเศษจึงไม่ถูกขยาย ถ้าไม่สลับและตัวหลักเล็กมาก เช่น 0.0001x + y = 1, x + y = 2 กับเครื่องที่เก็บ 3 หลัก จะได้ x = 0 แทนที่จะเป็น 1
จาโคบีกับเกาส์-ไซเดลต่างกันอย่างไร? จาโคบีใช้ค่ารอบก่อนทั้งหมดในการคำนวณรอบใหม่ ส่วนเกาส์-ไซเดลนำค่าที่เพิ่งคำนวณได้ในรอบเดียวกันมาใช้ทันที เกาส์-ไซเดลจึงมักลู่เข้าเร็วกว่าราวสองเท่าและใช้หน่วยความจำน้อยกว่า แต่จาโคบีคำนวณแบบขนานได้ง่ายกว่า
จะรู้ได้อย่างไรว่าวิธีทำซ้ำจะลู่เข้า? เงื่อนไขพอเพียงที่ตรวจง่ายคือเมทริกซ์ทแยงเด่นแท้ (ค่าสัมบูรณ์บนแนวทแยงมากกว่าผลรวมค่าสัมบูรณ์ของตัวอื่นในแถวเดียวกันทุกแถว) เงื่อนไขจำเป็นและพอเพียงคือรัศมีสเปกตรัมของเมทริกซ์การทำซ้ำ ρ(T) < 1 ยิ่ง ρ เล็กยิ่งลู่เข้าเร็ว
เลขเงื่อนไข (condition number) บอกอะไร? บอกว่าความคลาดเคลื่อนในข้อมูลถูกขยายในคำตอบได้มากสุดกี่เท่า ‖δx‖/‖x‖ ≤ κ(A)‖δb‖/‖b‖ โดยประมาณจะเสียความแม่นยำราว log₁₀ κ หลัก ถ้า κ ≈ 10¹² บนคอมพิวเตอร์ double ที่เก็บราว 16 หลัก จะเหลือหลักที่เชื่อได้เพียงราว 4 หลัก
มด
อาจารย์มด · ธีรวุฒิ แสวงบุญ อาจารย์สาขาวิชาวิศวกรรมไฟฟ้า มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ · ดูโปรไฟล์
บทความอ่านง่ายเกี่ยวกับหัวข้อนี้
ดูบทความทั้งหมด →