พิมพ์คำที่ต้องการค้นหา ทั้งภาษาไทยและอังกฤษ

  1. หน้าแรก
  2. คลังความรู้
  3. พีชคณิตเชิงเส้น
  4. ผลเฉลยเชิงตัวเลข

// บทที่ 7.11 · พีชคณิตเชิงเส้น · Numerical Solution of Linear Systems

การหาผลเฉลยเชิงตัวเลขของระบบสมการเชิงเส้นด้วยเมทริกซ์: เกาส์ การสลับแถว LU โชเลสกี โทมัส จาโคบี เกาส์-ไซเดล SOR และเลขเงื่อนไข

โปรแกรมจำลองวงจร ซอฟต์แวร์วิเคราะห์โครงสร้าง และเกมฟิสิกส์ล้วนแก้ Ax=bA\mathbf x = \mathbf b ที่มีตัวแปรหลักพันถึงหลักล้านตัว วิธีที่ใช้ในห้องเรียนอย่างคราเมอร์จึงใช้ไม่ได้ หน้านี้อธิบายว่าคอมพิวเตอร์แก้ระบบสมการอย่างไรให้เร็วและไม่เพี้ยน ทั้งวิธีตรง (เกาส์ LU โชเลสกี โทมัส) และวิธีทำซ้ำ (จาโคบี เกาส์-ไซเดล SOR) พร้อมเครื่องมือวัดว่าคำตอบเชื่อได้แค่ไหน สูตรใช้รหัส N

เขียนโดย อาจารย์มดอัปเดต
สรุปใน 30 วินาที
  • วิธีตรง ทำจำนวนขั้นแน่นอน: เกาส์ ≈23n3\approx \tfrac23 n^3 flops ต้องสลับแถวให้ตัวหลักใหญ่สุดเสมอ · LU แยกครั้งเดียวใช้ได้กับ b\mathbf b หลายตัว · โชเลสกีสำหรับเมทริกซ์สมมาตรบวกแน่นอน · โทมัสสำหรับสามแนวทแยง O(n)O(n)
  • วิธีทำซ้ำ เริ่มจากค่าเดา แล้วปรับทีละรอบ: จาโคบีใช้ค่าเก่าทั้งหมด เกาส์-ไซเดลใช้ค่าใหม่ทันที SOR เร่งด้วย ω\omega เหมาะกับระบบใหญ่และเบาบาง
  • ลู่เข้าแน่นอนถ้าทแยงเด่น เงื่อนไขแท้คือ ρ(T)<1\rho(T) \lt 1 และยิ่ง ρ\rho เล็กยิ่งเร็ว
  • เลขเงื่อนไข κ(A)=∥A∥∥A−1∥\kappa(A) = \lVert A\rVert\lVert A^{-1}\rVert บอกว่าความคลาดเคลื่อนถูกขยายกี่เท่า เสียความแม่นยำราว log⁡10κ\log_{10}\kappa หลัก
ระดับพื้นฐาน ปี 1 · เริ่มเรียนวิธีเชิงตัวเลขกลาง ป.ตรี วิศวกรรม (Numerical Methods)ขั้นสูง ป.โท · งานจำลองจริง

ทำไมต้องวิธีเชิงตัวเลข: ขนาดของปัญหาจริง พื้นฐาน

ในห้องเรียนเราแก้ระบบ 2–3 ตัวแปรด้วย คราเมอร์ หรือ อินเวอร์ส ได้สบาย แต่วงจรรวมหนึ่งชิปมีโนดนับหมื่น แบบจำลองไฟไนต์เอลิเมนต์ของสะพานมีตัวแปรนับล้าน คำถามจึงเปลี่ยนจาก “หาได้ไหม” เป็น “หาได้เร็วแค่ไหน และคำตอบเพี้ยนเพราะการปัดเศษหรือเปล่า”

A x = bวิธีตรง (direct)จำนวนขั้นแน่นอนวิธีทำซ้ำ (iterative)ปรับค่าเดาทีละรอบเกาส์ + สลับแถว / LUหนาแน่น ทั่วไป · ⅔n³โชเลสกี A = LLᵀสมมาตรบวกแน่นอนโทมัส (TDMA)สามแนวทแยง · O(n)จาโคบีใช้ค่าเก่า · ขนานได้เกาส์-ไซเดลใช้ค่าใหม่ทันทีSOR (ω) · CGระบบใหญ่และเบาบางก่อนเชื่อคำตอบ: เลขเงื่อนไข κ(A) บอกหลักที่อาจเสียวิธีทำซ้ำลู่เข้าเมื่อทแยงเด่น หรือ ρ(T) < 1
แผนที่วิธีแก้ Ax=bA\mathbf x = \mathbf b: วิธีตรงให้คำตอบในจำนวนขั้นที่แน่นอน วิธีทำซ้ำค่อย ๆ เข้าใกล้คำตอบ เลือกตามขนาด ความเบาบาง และโครงสร้างของเมทริกซ์

N1 Operation counts จำนวนการคำนวณ (ระบบ n×nn\times n หนาแน่น)

เกาส์ / LU≈23n3 flops,แทนค่าย้อนกลับ≈n2,เกาส์-จอร์แดน≈n3,คราเมอร์ (โคแฟกเตอร์)≈(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)!

1 flop = การบวก/ลบ/คูณ/หารหนึ่งครั้งของเลขทศนิยม · การหาอินเวอร์สแล้วคูณ A−1bA^{-1}\mathbf b ใช้ราว 2n32n^3 จึงช้ากว่าและคลาดเคลื่อนมากกว่าการแก้ตรง

จำนวนตัวแปร nnเกาส์ ≈n3/3\approx n^3/3 การคูณคราเมอร์ด้วยโคแฟกเตอร์ ≈(n+1)!\approx (n+1)!เวลาที่ 10910^9 ครั้ง/วินาที (คราเมอร์)
3924ไม่ถึงไมโครวินาที
103334.0×1074.0\times10^{7}0.04 วินาที
202,6675.1×10195.1\times10^{19}ราว 1,600 ปี
1003.3×1053.3\times10^{5}9.4×101599.4\times10^{159}นานกว่าอายุเอกภพมาก
1,0003.3×1083.3\times10^{8} (≈ 0.3 วินาที)≈102570\approx 10^{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})

เลข double เก็บได้ราว 15–16 หลักนัยสำคัญ ทุกการคำนวณถูกปัดเศษ ความคลาดเคลื่อนสะสมได้ถ้าอัลกอริทึมไม่ดี

N3 Direct vs iterative วิธีตรงกับวิธีทำซ้ำ

ตรง: A=LU→x (จำนวนขั้นแน่นอน),ทำซ้ำ: x(k+1)=Tx(k)+c\text{ตรง: } A = LU \to \mathbf x \ (\text{จำนวนขั้นแน่นอน}),\qquad \text{ทำซ้ำ: } \mathbf x^{(k+1)} = T\mathbf x^{(k)} + \mathbf c

วิธีตรงแม่นถึงระดับการปัดเศษ วิธีทำซ้ำหยุดเมื่อแม่นพอ ไม่ต้องเก็บเมทริกซ์เต็มและไม่เติมศูนย์ให้กลายเป็นตัวเลข (fill-in)

การกำจัดแบบเกาส์ในมุมของอัลกอริทึม กลาง

หลักการเหมือน การกำจัดแบบเกาส์ที่ทำมือ ทุกประการ แต่เขียนเป็นสูตรที่โปรแกรมทำซ้ำได้ แบ่งเป็นสองช่วง: กำจัดไปข้างหน้า (forward elimination) ให้ได้เมทริกซ์สามเหลี่ยมบน แล้วแทนค่าย้อนกลับ (back substitution) จากล่างขึ้นบน

N4 Forward elimination & back substitution กำจัดไปข้างหน้าและแทนค่าย้อนกลับ

mik=aikakk,aij←aij−mikakj,bi←bi−mikbk(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) xn=bnann,xi=1aii(bi−∑j=i+1naijxj), i=n−1,…,1x_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
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=aik/akkm = a_{ik}/a_{kk} จะใหญ่มาก แล้วกลืนตัวเลขอื่นจนหายไปตอนปัดเศษ

N5 Partial pivoting การสลับแถวบางส่วน

p=arg⁡max⁡i≥k∣aik∣,Rk↔Rp ⇒ ∣mik∣≤1p = \arg\max_{i \ge k}|a_{ik}|,\quad R_k \leftrightarrow R_p \ \Rightarrow\ |m_{ik}| \le 1

เป็นค่าเริ่มต้นของ LAPACK (numpy.linalg.solve, MATLAB A\b) ราคาถูกเพราะแค่เทียบค่าในหลักเดียว

N6 Scaled & complete pivoting ปรับสเกลและสลับเต็ม

si=max⁡j∣aij∣,p=arg⁡max⁡i≥k∣aik∣sis_i = \max_j |a_{ij}|,\quad p = \arg\max_{i \ge k}\frac{|a_{ik}|}{s_i}

ใช้เมื่อแต่ละแถวมีหน่วยหรือขนาดต่างกันมาก · complete pivoting เลือกจากทั้งเมทริกซ์ย่อย (สลับหลักด้วย) เสถียรที่สุดแต่แพง จึงไม่ค่อยใช้

ตัวอย่าง N-1 · เครื่องคิดเลข 3 หลัก

แก้ 0.0001x+y=1x+y=2\begin{aligned} 0.0001x + y &= 1 \\ x + y &= 2 \end{aligned} โดยปัดทุกผลลัพธ์เหลือ 3 หลักนัยสำคัญ ทั้งแบบไม่สลับและสลับแถว (ค่าจริง x=1.0001…, y=0.9998…x = 1.0001\dots,\ y = 0.9998\dots)

  1. ไม่สลับ: m=1/0.0001=104m = 1/0.0001 = 10^4 แล้ว

    a22=1−104=−9999→−1.00×104,b2=2−104=−9998→−1.00×104a_{22} = 1 - 10^4 = -9999 \to \hlF{-1.00\times10^4},\qquad b_2 = 2 - 10^4 = -9998 \to \hlF{-1.00\times10^4}
  2. y=1.00y = 1.00 แทนกลับ: x=1−1.000.0001=0x = \dfrac{1 - 1.00}{0.0001} = 0 — ผิดทั้งหมด (คลาดเคลื่อน 100%)

  3. สลับแถว ให้ 11 เป็นตัวหลัก N5: m=0.0001m = 0.0001

    a22=1−0.0001=0.9999→1.00,b2=1−0.0002=0.9998→1.00a_{22} = 1 - 0.0001 = 0.9999 \to 1.00,\qquad b_2 = 1 - 0.0002 = 0.9998 \to 1.00
  4. y=1.00, x=2−1.00=1.00y = 1.00,\ x = 2 - 1.00 = 1.00 — ถูกต้องตามจำนวนหลักที่มี

ไม่สลับ: (x,y)=(0,1.00)(x, y) = (0, 1.00) ✗ · สลับแถว: (1.00,1.00)(1.00, 1.00) ✓

ต้นเหตุ: ตัวคูณ 10410^4 ทำให้เลข 1 ใน 1−1041 - 10^4 หายไปตอนปัด ข้อมูลของสมการแรกจึงหายไปทั้งหมด · เครื่องจริงเก็บ 16 หลักก็เกิดเรื่องเดียวกันเมื่อ ε≈10−17\varepsilon \approx 10^{-17}

ในแล็บด้านล่าง เลื่อนขนาดตัวหลัก ε\varepsilon และจำนวนหลักที่เครื่องเก็บได้ แล้วดูว่าเมื่อไรวิธีไม่สลับแถวพัง กดดูตารางเทียบทุกจำนวนหลักด้านล่างแล็บ มีชุดตัวหลักเป็นศูนย์ 3×3 ให้ลองด้วย

การแยก LU: แยกครั้งเดียว ใช้ได้ทุก b\mathbf b กลาง

การกำจัดแบบเกาส์คือการเขียน A=LUA = LU โดยไม่รู้ตัว: UU คือเมทริกซ์สามเหลี่ยมบนที่ได้ และ LL คือเมทริกซ์สามเหลี่ยมล่างที่เก็บตัวคูณ mikm_{ik} ไว้ใต้แนวทแยง (แนวทแยงเป็น 1) งานจริงที่ต้องแก้ระบบเดิมกับ b\mathbf b หลายชุด เช่น วงจรเดียวกันที่แหล่งจ่ายเปลี่ยนตามเวลา จึงแยก LU ครั้งเดียว (≈23n3\approx \tfrac23n^3) แล้วแก้แต่ละ b\mathbf b ด้วยการแทนค่าสองรอบ (≈2n2\approx 2n^2)

N7 Doolittle factorisation การแยกแบบดูลิตเติล (ℓii=1\ell_{ii} = 1)

uij=aij−∑k=1i−1ℓikukj (j≥i),ℓij=1ujj(aij−∑k=1j−1ℓikukj) (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)

แบบโครต์ (Crout) ให้ uii=1u_{ii} = 1 แทน ผลลัพธ์ต่างกันแค่การกระจายแนวทแยง

N8 Solving with LU แก้ระบบด้วย LU

Ax=b  ⟺  Ly=b (ไปข้างหน้า),Ux=y (ย้อนกลับ)A\mathbf x = \mathbf b \iff L\mathbf y = \mathbf b \ (\text{ไปข้างหน้า}),\quad U\mathbf x = \mathbf y \ (\text{ย้อนกลับ})

N9 LU with pivoting PA=LUPA = LU

PA=LU,Ly=Pb,Ux=yPA = LU,\qquad L\mathbf y = P\mathbf b,\quad U\mathbf x = \mathbf y

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

N10 Determinant from LU ดีเทอร์มิแนนต์ฟรีจาก LU

det⁡A=(−1)จำนวนการสลับแถว∏i=1nuii\det A = (-1)^{\text{จำนวนการสลับแถว}}\prod_{i=1}^{n}u_{ii}

นี่คือวิธีที่โปรแกรมหาดีเทอร์มิแนนต์จริง ไม่ใช่การกระจายโคแฟกเตอร์

ตัวอย่าง N-2 · LU แล้วแก้สอง b

แยก A=(12438142613)A = \begin{pmatrix} 1 & 2 & 4 \\ 3 & 8 & 14 \\ 2 & 6 & 13 \end{pmatrix} เป็น LU แล้วแก้ Ax=(3,13,4)TA\mathbf x = (3, 13, 4)^T และ Ax=(1,1,1)TA\mathbf x = (1, 1, 1)^T

  1. หลักที่ 1: ℓ21=3, ℓ31=2\ell_{21} = 3,\ \ell_{31} = 2 ได้แถวใหม่ (0,2,2)(0, 2, 2) และ (0,2,5)(0, 2, 5) · หลักที่ 2: ℓ32=2/2=1\ell_{32} = 2/2 = 1 ได้ (0,0,3)(0, 0, 3)

    L=(100310211),U=(124022003),det⁡A=1⋅2⋅3=6L = \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
  2. b=(3,13,4)\mathbf b = (3, 13, 4): ไปข้างหน้า y1=3, y2=13−3(3)=4, y3=4−2(3)−1(4)=−6y_1 = 3,\ y_2 = 13 - 3(3) = 4,\ y_3 = 4 - 2(3) - 1(4) = -6 N8

  3. ย้อนกลับ x3=−6/3=−2, x2=(4−2(−2))/2=4, x1=3−2(4)−4(−2)=3x_3 = -6/3 = -2,\ x_2 = (4 - 2(-2))/2 = 4,\ x_1 = 3 - 2(4) - 4(-2) = 3

  4. b=(1,1,1)\mathbf b = (1, 1, 1) ใช้ L,UL, U เดิม: y=(1,−2,1)\mathbf y = (1, -2, 1) แล้ว x3=13, x2=−2−2/32=−43, x1=1−2(−43)−4(13)=73x_3 = \tfrac13,\ x_2 = \tfrac{-2 - 2/3}{2} = -\tfrac43,\ x_1 = 1 - 2(-\tfrac43) - 4(\tfrac13) = \tfrac73

x=(3,4,−2)\mathbf x = (3, 4, -2) และ x=(73,−43,13)\mathbf x = (\tfrac73, -\tfrac43, \tfrac13)

ตรวจแถว 2 ของคำตอบแรก: 3(3)+8(4)+14(−2)=9+32−28=133(3) + 8(4) + 14(-2) = 9 + 32 - 28 = 13 ✓ · คำตอบที่สองไม่ต้องแยก LU ใหม่ ใช้แค่แทนค่าสองรอบ

ตัวอย่าง N-3 · PA = LU

แยก A=(2114−60−272)A = \begin{pmatrix} 2 & 1 & 1 \\ 4 & -6 & 0 \\ -2 & 7 & 2 \end{pmatrix} แบบสลับแถว (partial pivoting) และหา det⁡A\det A

  1. หลัก 1 ตัวใหญ่สุดคือ 4 (แถว 2) สลับ R1↔R2R_1 \leftrightarrow R_2 แล้ว ℓ21=2/4=12, ℓ31=−2/4=−12\ell_{21} = 2/4 = \tfrac12,\ \ell_{31} = -2/4 = -\tfrac12

    (4−60041042)\begin{pmatrix} 4 & -6 & 0 \\ 0 & 4 & 1 \\ 0 & 4 & 2 \end{pmatrix}
  2. หลัก 2 มี 4 สองตัวเท่ากัน คงแถว 2 ไว้ ℓ32=1\ell_{32} = 1 ได้ u33=2−1=1u_{33} = 2 - 1 = 1

P=(010100001), L=(1001210−1211), U=(4−60041001), det⁡A=−(4⋅4⋅1)=−16P = \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

สลับแถวหนึ่งครั้ง เครื่องหมายจึงเป็นลบ N10 · ตรวจด้วยซาร์รัส: 2(−12)−1(8)+1(28−12)=−162(-12) - 1(8) + 1(28 - 12) = -16 ✓

การแยกโชเลสกี (Cholesky) สำหรับเมทริกซ์สมมาตรบวกแน่นอน กลาง

เมทริกซ์ความนำ GG ของวงจรตัวต้านทาน เมทริกซ์สติฟเนสของโครงสร้าง และ ATAA^TA ของกำลังสองน้อยสุด ล้วนสมมาตรและบวกแน่นอน (symmetric positive definite, SPD) เขียนได้เป็น A=LLTA = LL^T ใช้งานครึ่งหนึ่งของ LU และไม่ต้องสลับแถวเลย

N11 Cholesky factorisation A=LLTA = LL^T

ℓjj=ajj−∑k=1j−1ℓjk2,ℓij=1ℓjj(aij−∑k=1j−1ℓikℓjk) (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)

ถ้าค่าใต้รากติดลบหรือเป็นศูนย์ แปลว่าเมทริกซ์ไม่บวกแน่นอน (ใช้เป็นวิธีทดสอบ SPD ได้) · ต้นทุน ≈13n3\approx \tfrac13n^3 flops

ตัวอย่าง N-4 · วงจรสามโนด

สมการโนด Gv=iG\mathbf v = \mathbf i มี G=(422253236)G = \begin{pmatrix} 4 & 2 & 2 \\ 2 & 5 & 3 \\ 2 & 3 & 6 \end{pmatrix} (S) และ i=(10,13,17)\mathbf i = (10, 13, 17) (A) แก้ด้วยโชเลสกี

  1. หลัก 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 N11

  2. หลัก 2: ℓ22=5−12=2, ℓ32=(3−1⋅1)/2=1\ell_{22} = \sqrt{5 - 1^2} = 2,\ \ell_{32} = (3 - 1\cdot1)/2 = 1 · หลัก 3: ℓ33=6−1−1=2\ell_{33} = \sqrt{6 - 1 - 1} = 2

    L=(200120112)L = \begin{pmatrix} 2 & 0 & 0 \\ 1 & 2 & 0 \\ 1 & 1 & 2 \end{pmatrix}
  3. Ly=iL\mathbf y = \mathbf i: y1=5, y2=(13−5)/2=4, y3=(17−5−4)/2=4y_1 = 5,\ y_2 = (13 - 5)/2 = 4,\ y_3 = (17 - 5 - 4)/2 = 4 · LTv=yL^T\mathbf v = \mathbf y: v3=2, v2=(4−2)/2=1, v1=(5−1−2)/2=1v_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

ตรวจ: 4+2+4=104 + 2 + 4 = 10 ✓ · 2+5+6=132 + 5 + 6 = 13 ✓ · 2+3+12=172 + 3 + 12 = 17 ✓

อัลกอริทึมโทมัส: ระบบสามแนวทแยงในเวลา O(n)O(n) กลาง

ปัญหาหนึ่งมิติ เช่น การนำความร้อนตามแท่งโลหะ แรงดันตามสายส่งแบบขั้นบันได (ladder network) และการทำเส้นโค้ง spline ให้เมทริกซ์ที่มีตัวเลขแค่บนแนวทแยงและข้าง ๆ การกำจัดแบบเกาส์จึงลดเหลือการวนลูปเดียว

N12 Thomas algorithm (TDMA) สำหรับ aixi−1+bixi+cixi+1=dia_ix_{i-1} + b_ix_i + c_ix_{i+1} = d_i

c1′=c1b1, d1′=d1b1;ci′=cibi−aici−1′, di′=di−aidi−1′bi−aici−1′;xn=dn′, xi=di′−ci′xi+1c_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}

ราว 8n8n flops แทน 23n3\tfrac23n^3 · ปลอดภัยเมื่อเมทริกซ์ทแยงเด่น (ไม่ต้องสลับแถว)

ตัวอย่าง N-5 · แท่งความร้อน 4 โหนด

แท่งโลหะปลายซ้าย 100 °C ปลายขวา 0 °C แบ่ง 4 โหนดภายใน สมการสภาวะคงตัว −Ti−1+2Ti−Ti+1=0-T_{i-1} + 2T_i - T_{i+1} = 0 หา T1,…,T4T_1, \dots, T_4

  1. ย้ายอุณหภูมิขอบไปทางขวา: ai=−1, bi=2, ci=−1, d=(100,0,0,0)a_i = -1,\ b_i = 2,\ c_i = -1,\ \mathbf d = (100, 0, 0, 0)

  2. กวาดไปข้างหน้า N12: c′=(−12,−23,−34),d′=(50,1003,25,20)c' = (-\tfrac12, -\tfrac23, -\tfrac34),\quad d' = (50, \tfrac{100}{3}, 25, 20)

  3. ย้อนกลับ: T4=20, T3=25+34(20)=40, T2=1003+23(40)=60, T1=50+12(60)=80T_4 = 20,\ T_3 = 25 + \tfrac34(20) = 40,\ T_2 = \tfrac{100}{3} + \tfrac23(40) = 60,\ T_1 = 50 + \tfrac12(60) = 80

(T1,T2,T3,T4)=(80,60,40,20)(T_1, T_2, T_3, T_4) = (80, 60, 40, 20) °C

ได้เส้นตรงพอดี ตรงกับฟิสิกส์ของการนำความร้อนสภาวะคงตัวที่ไม่มีแหล่งความร้อนภายใน

วิธีทำซ้ำ: จาโคบี เกาส์-ไซเดล และ SOR กลาง

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

N13 Jacobi method วิธีจาโคบี

xi(k+1)=1aii(bi−∑j≠iaij xj(k))x_i^{(k+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \ne i} a_{ij}\,x_j^{(k)}\Bigr)

ทุกตัวแปรในรอบใหม่คำนวณจากค่ารอบก่อนทั้งหมด ต้องเก็บเวกเตอร์สองชุด คำนวณขนานได้

N14 Gauss–Seidel method วิธีเกาส์-ไซเดล

xi(k+1)=1aii(bi−∑j<iaij xj(k+1)−∑j>iaij xj(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)

ใช้ค่าที่เพิ่งได้ทันที มักลู่เข้าเร็วกว่าจาโคบีราวสองเท่า เก็บเวกเตอร์ชุดเดียว

N15 Successive over-relaxation (SOR) ผ่อนปรนเกินต่อเนื่อง

xi(k+1)=(1−ω) xi(k)+ω x~iGS,0<ω<2x_i^{(k+1)} = (1 - \omega)\,x_i^{(k)} + \omega\,\tilde x_i^{\text{GS}},\qquad 0 \lt \omega \lt 2

ω=1\omega = 1 คือเกาส์-ไซเดล · ω>1\omega \gt 1 ก้าวเลยไปทางเดิม (เร่ง) · ω<1\omega \lt 1 หน่วง (ใช้เมื่อแกว่ง)

N16 Matrix form รูปเมทริกซ์ A=D+L+UA = D + L + U (ทแยง · ใต้ทแยง · เหนือทแยง)

TJ=−D−1(L+U),TGS=−(D+L)−1U,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]

ทุกวิธีเขียนได้เป็น x(k+1)=Tx(k)+c\mathbf x^{(k+1)} = T\mathbf x^{(k)} + \mathbf c ความคลาดเคลื่อนจึงเป็น e(k)=Tke(0)\mathbf e^{(k)} = T^k\mathbf e^{(0)}

N17 Stopping criteria เกณฑ์หยุด

∥x(k+1)−x(k)∥∞∥x(k+1)∥∞<εหรือ∣εa,i∣=∣xi(k+1)−xi(k)xi(k+1)∣×100%<εs=(0.5×102−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})\%

เกณฑ์ของสการ์โบโรห์รับประกันความถูกต้องอย่างน้อย nn หลักนัยสำคัญ · ควรตรวจส่วนเหลือ ∥b−Ax(k)∥\lVert\mathbf b - A\mathbf x^{(k)}\rVert ด้วย และกำหนดจำนวนรอบสูงสุดกันวนไม่จบ

ตัวอย่าง N-6 · จาโคบีเทียบเกาส์-ไซเดล

แก้ 4x−y+z=74x−8y+z=−21−2x+y+5z=15\begin{aligned} 4x - y + z &= 7 \\ 4x - 8y + z &= -21 \\ -2x + y + 5z &= 15 \end{aligned} เริ่มที่ x(0)=(1,2,2)\mathbf x^{(0)} = (1, 2, 2) (คำตอบจริง (2,4,3)(2, 4, 3))

  1. เมทริกซ์ทแยงเด่นแท้: 4>1+1, 8>4+1, 5>2+14 \gt 1 + 1,\ 8 \gt 4 + 1,\ 5 \gt 2 + 1 จึงลู่เข้าแน่นอน N18 · จัดรูปสูตรทำซ้ำ

    x=7+y−z4,y=21+4x+z8,z=15+2x−y5x = \frac{7 + y - z}{4},\qquad y = \frac{21 + 4x + z}{8},\qquad z = \frac{15 + 2x - y}{5}
  2. จาโคบีรอบที่ 1 (ใช้ (1,2,2)(1, 2, 2) ทั้งหมด) N13

    x=7+2−24=1.75,y=21+4+28=3.375,z=15+2−25=3.000x = \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
  3. เกาส์-ไซเดลรอบที่ 1 (ใช้ xx ใหม่ทันที) N14

    x=1.75,y=21+4(1.75)+28=3.75,z=15+2(1.75)−3.755=2.95x = 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
kจาโคบี (x,y,z)(x, y, z)เกาส์-ไซเดล (x,y,z)(x, y, z)
01, 2, 21, 2, 2
11.750, 3.375, 3.0001.750, 3.750, 2.950
21.844, 3.875, 3.0251.950, 3.969, 2.986
31.963, 3.925, 2.9631.996, 3.996, 2.999
41.991, 3.977, 3.0001.9993, 3.9995, 2.9998
51.994, 3.995, 3.0011.99993, 3.99994, 2.99998

ทั้งสองวิธีเข้าใกล้ (2,4,3)(2, 4, 3) · เกาส์-ไซเดลคลาดเคลื่อนไม่ถึง 0.001 ตั้งแต่รอบที่ 4 ส่วนจาโคบีต้องใช้ 7 รอบ

รัศมีสเปกตรัม ρ(TJ)≈0.335\rho(T_J) \approx 0.335 และ ρ(TGS)≈0.125\rho(T_{GS}) \approx 0.125 ความคลาดเคลื่อนจึงลดลงราว 3 เท่าต่อรอบสำหรับจาโคบี และ 8 เท่าต่อรอบสำหรับเกาส์-ไซเดล N20

ลู่เข้าเมื่อไร และเร็วแค่ไหน กลาง → ขั้นสูง

N18 Diagonal dominance ทแยงเด่นแท้ (เงื่อนไขพอเพียง)

∣aii∣>∑j≠i∣aij∣  ทุกแถว ⇒ จาโคบีและเกาส์-ไซเดลลู่เข้าทุกค่าเริ่มต้น|a_{ii}| \gt \sum_{j \ne i}|a_{ij}|\ \ \text{ทุกแถว} \ \Rightarrow\ \text{จาโคบีและเกาส์-ไซเดลลู่เข้าทุกค่าเริ่มต้น}

ถ้าไม่ทแยงเด่น ลองสลับลำดับสมการก่อน (แล็บด้านล่าง ชุด “สลับสมการ” ลู่ออก) · สมมาตรบวกแน่นอนก็ทำให้เกาส์-ไซเดลลู่เข้าเช่นกัน

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

λi\lambda_i คือ ค่าเฉพาะ ของเมทริกซ์การทำซ้ำ · SOR ลู่ออกเสมอถ้า ω∉(0,2)\omega \notin (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{ หลัก}

N21 Optimal ω (Young) ω\omega ที่ดีที่สุด

ρGS=ρJ2,ω∗=21+1−ρJ2,ρ(Tω∗)=ω∗−1\rho_{GS} = \rho_J^2,\qquad \omega^* = \frac{2}{1 + \sqrt{1 - \rho_J^2}},\qquad \rho(T_{\omega^*}) = \omega^* - 1

ใช้ได้กับเมทริกซ์ “เรียงลำดับสอดคล้อง” เช่น สามแนวทแยง · สำหรับ tridiag⁡(−1,2,−1)\operatorname{tridiag}(-1, 2, -1) ขนาด nn: ρJ=cos⁡πn+1\rho_J = \cos\frac{\pi}{n + 1}

ตัวอย่าง N-7 · ทำไมต้อง SOR

ระบบแท่งความร้อน tridiag⁡(−1,2,−1)\operatorname{tridiag}(-1, 2, -1) ขนาด 10×10 ต้องใช้กี่รอบเพื่อลดความคลาดเคลื่อน 10610^6 เท่า สำหรับจาโคบี เกาส์-ไซเดล และ SOR ที่ ω∗\omega^*

  1. ρJ=cos⁡π11≈0.9595\rho_J = \cos\frac{\pi}{11} \approx 0.9595 และ ρGS=ρJ2≈0.9206\rho_{GS} = \rho_J^2 \approx 0.9206 N21

  2. ω∗=21+sin⁡(π/11)≈1.560\omega^* = \dfrac{2}{1 + \sin(\pi/11)} \approx 1.560 ได้ ρSOR=ω∗−1≈0.560\rho_{SOR} = \omega^* - 1 \approx 0.560

  3. k≈6/(−log⁡10ρ)k \approx 6/(-\log_{10}\rho) N20: จาโคบี 6/0.018≈3346/0.018 \approx 334 · เกาส์-ไซเดล ≈167\approx 167 · SOR 6/0.252≈246/0.252 \approx 24

ราว 334, 167 และ 24 รอบ — SOR เร็วกว่าเกาส์-ไซเดลเกือบ 7 เท่าโดยแทบไม่เพิ่มงานต่อรอบ

ในแล็บ กดดู “สแกนหา ω ที่ดีที่สุด” จะเห็นจำนวนรอบต่ำสุดใกล้ ω≈1.55\omega \approx 1.55–1.61.6 (จำนวนรอบในแล็บต่างเล็กน้อยเพราะใช้เกณฑ์หยุด N17)

ซิมูเลเตอร์วิธีทำซ้ำ: จาโคบี · เกาส์-ไซเดล · SOR

เลือกชุดระบบ วิธี และ ω\omega กราฟแสดงความคลาดเคลื่อนของทั้งสามวิธีเทียบกัน (แตะกราฟเพื่อดูค่าแต่ละรอบ) ชุด 2×2 แสดงเส้นทางของค่าประมาณบนภาพเส้นตรงสองเส้น ลองชุด “สลับสมการ” เพื่อดูการลู่ออก

เลขเงื่อนไข: คำตอบเชื่อได้แค่ไหน กลาง → ขั้นสูง

อัลกอริทึมดีแค่ไหนก็แก้ปัญหาที่ “ป่วยโดยกำเนิด” ไม่ได้ ระบบที่สมการเกือบขนานกัน ข้อมูลผิดนิดเดียวคำตอบเปลี่ยนมาก เราวัดความป่วยนี้ด้วยเลขเงื่อนไข (condition number) ต่อยอดจาก ระบบป่วยในหน้าระบบสมการ

N22 Vector & matrix norms นอร์ม

∥x∥∞=max⁡i∣xi∣,∥x∥1=∑∣xi∣,∥x∥2=∑xi2;∥A∥∞=max⁡i∑j∣aij∣,∥A∥1=max⁡j∑i∣aij∣,∥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}

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}}

κ≈1\kappa \approx 1 ดีมาก · κ→∞\kappa \to \infty เมื่อ AA ใกล้เอกฐาน · det⁡\det เล็กไม่ได้แปลว่าป่วย (0.1I100.1I_{10} มี det⁡=10−10\det = 10^{-10} แต่ κ=1\kappa = 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)

ถ้า AA คลาดเคลื่อนด้วย: ∥δ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)

N25 Residual vs error ส่วนเหลือไม่ใช่ความคลาดเคลื่อน

r=b−Ax~,∥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}

ส่วนเหลือเล็กรับประกันคำตอบแม่นก็ต่อเมื่อ κ\kappa ไม่ใหญ่

N26 Iterative refinement ปรับปรุงผลเฉลยซ้ำ

r=b−Ax~ (ความละเอียดสูงขึ้น),LU δ=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

ใช้ LU เดิม ต้นทุนรอบละ ≈n2\approx n^2 ได้หลักคืนมาเมื่อ κ ϵmach<1\kappa\,\epsilon_{\text{mach}} \lt 1

ตัวอย่าง N-8 · ระบบป่วย

x+y=2x+1.0001y=2.0001\begin{aligned} x + y &= 2 \\ x + 1.0001y &= 2.0001 \end{aligned} มีคำตอบ (1,1)(1, 1) ถ้าค่าทางขวาของสมการที่ 2 คลาดเป็น 2.00022.0002 คำตอบเปลี่ยนเท่าไร เทียบกับ κ∞(A)\kappa_\infty(A)

  1. แก้ใหม่: ลบสมการ 0.0001y=0.0002⇒y=2, x=00.0001y = 0.0002 \Rightarrow y = 2,\ x = 0 — เปลี่ยนจาก (1,1)(1, 1) เป็น (0,2)(0, 2)

  2. A−1=10.0001(1.0001−1−11)A^{-1} = \dfrac{1}{0.0001}\begin{pmatrix} 1.0001 & -1 \\ -1 & 1 \end{pmatrix} ได้ ∥A∥∞=2.0001, ∥A−1∥∞=20001\lVert A\rVert_\infty = 2.0001,\ \lVert A^{-1}\rVert_\infty = 20001 N22

    κ∞(A)=2.0001×20001≈4.0×104\kappa_\infty(A) = 2.0001 \times 20001 \approx 4.0\times10^{4}
  3. ข้อมูลเปลี่ยน 0.00012.0001≈5×10−5\dfrac{0.0001}{2.0001} \approx 5\times10^{-5} แต่คำตอบเปลี่ยน ∥(−1,1)∥∞∥(1,1)∥∞=1\dfrac{\lVert(-1, 1)\rVert_\infty}{\lVert(1, 1)\rVert_\infty} = 1 (100%) ขยาย 2×1042\times10^4 เท่า ไม่เกิน κ\kappa ตาม N24

คำตอบเปลี่ยน 100% จากข้อมูลที่เปลี่ยน 0.005% · κ∞≈4×104\kappa_\infty \approx 4\times10^4 เสียความแม่นราว 4–5 หลัก

ส่วนเหลือของ (0,2)(0, 2) ในระบบเดิมคือ r=(0,−0.0001)\mathbf r = (0, -0.0001) เล็กมาก แต่คำตอบผิดทั้งหมด ยืนยัน N25

งานจริง: แผ่นความร้อนและสนามศักย์ด้วยวิธีผ่อนคลาย (relaxation) กลาง

อุณหภูมิในแผ่นโลหะสภาวะคงตัว และศักย์ไฟฟ้าในบริเวณที่ไม่มีประจุ เป็นไปตามสมการลาปลาซ ∇2T=0\nabla^2T = 0 เมื่อแบ่งเป็นตาราง สมการของแต่ละโหนดคือ “ค่าที่โหนด = ค่าเฉลี่ยของสี่โหนดรอบตัว” ได้ระบบสมการเชิงเส้นหนึ่งสมการต่อโหนด แผ่น 100×100 โหนดมีหนึ่งหมื่นตัวแปร แต่แต่ละสมการมีตัวแปรแค่ 5 ตัว เป็นงานของวิธีทำซ้ำโดยแท้

ตัวอย่าง N-9 · แผ่น 2×2 โหนด

แผ่นสี่เหลี่ยมขอบบน 100 °C ขอบอื่น 0 °C มีโหนดภายใน T1,T2T_1, T_2 (แถวบน) และ T3,T4T_3, T_4 (แถวล่าง) หาอุณหภูมิทุกโหนด

  1. สมการค่าเฉลี่ย เช่นที่ T1T_1: 4T1=100+0+T2+T34T_1 = 100 + 0 + T_2 + T_3 เขียนครบสี่โหนด

    (4−1−10−140−1−104−10−1−14)(T1T2T3T4)=(10010000)\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}
  2. สมมาตรซ้าย-ขวา T1=T2, T3=T4T_1 = T_2,\ T_3 = T_4 เหลือ 3T1−T3=1003T_1 - T_3 = 100 และ 3T3−T1=03T_3 - T_1 = 0 ได้ T1=3T3T_1 = 3T_3

T1=T2=37.5T_1 = T_2 = 37.5 °C, T3=T4=12.5T_3 = T_4 = 12.5 °C

เมทริกซ์ทแยงเด่น (4≥1+14 \ge 1 + 1 และสมมาตรบวกแน่นอน) เกาส์-ไซเดลจึงลู่เข้าแน่นอน ลองตารางที่ละเอียดขึ้นในแล็บด้านล่าง

ตั้งอุณหภูมิขอบ กด ▶ เริ่ม แล้วดูความร้อนค่อย ๆ แผ่เข้าไปทีละรอบ เปลี่ยนวิธีและ ω\omega เพื่อเทียบความเร็ว ตารางด้านข้างบอกจำนวนรอบที่แต่ละวิธีต้องใช้ วางนิ้วหรือเมาส์บนช่องเพื่ออ่านอุณหภูมิ

เลือกวิธีอย่างไร และใช้ในโปรแกรมจริง กลาง

ลักษณะของระบบวิธีที่เหมาะเหตุผล
2–3 ตัวแปร ทำมือ ถามตัวแปรเดียวคราเมอร์ดีเทอร์มิแนนต์สองตัวก็ได้คำตอบ
หนาแน่น nn ถึงราวหมื่นLU + partial pivotingเสถียร ใช้ซ้ำกับหลาย b\mathbf b ได้
สมมาตรบวกแน่นอน (วงจร R, โครงสร้าง)โชเลสกีเร็วกว่า LU สองเท่า ไม่ต้องสลับแถว
สามแนวทแยง (แท่ง สายส่ง spline)โทมัส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) N19
  • หยุดเมื่อค่าเปลี่ยนน้อย แต่ไม่ตรวจส่วนเหลือ — ระบบที่ลู่เข้าช้ามากอาจเปลี่ยนน้อยทั้งที่ยังห่างคำตอบ
  • หา A−1A^{-1} แล้วคูณ b\mathbf b ในโปรแกรม — ช้ากว่าและคลาดเคลื่อนมากกว่าใช้ solve
  • เชื่อว่า det⁡\det ใกล้ศูนย์แปลว่าระบบป่วย — ให้ดู κ\kappa ไม่ใช่ det⁡\det N23

ต่อยอดไปหน้าถัดไป

รัศมีสเปกตรัมและ ω∗\omega^* มาจาก ค่าเฉพาะ ของเมทริกซ์การทำซ้ำ ส่วนการเลือกว่าระบบมีคำตอบหรือไม่มาจาก แรงก์ ทดสอบตัวเองด้วย แนวข้อสอบชุด C: วิธีเชิงตัวเลข และอ่านสรุปเปรียบเทียบที่บทความ เกาส์ LU จาโคบี เกาส์-ไซเดล เลือกวิธีไหน (English)

คำถามที่พบบ่อย

ทำไมคอมพิวเตอร์ไม่ใช้กฎของคราเมอร์แก้ระบบสมการใหญ่?

เพราะต้นทุนโตแบบแฟกทอเรียล ถ้าหาดีเทอร์มิแนนต์ด้วยการกระจายโคแฟกเตอร์ ระบบ 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 หลัก

อาจารย์มด · ธีรวุฒิ แสวงบุญ
อาจารย์สาขาวิชาวิศวกรรมไฟฟ้า มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ · ดูโปรไฟล์