חזור לתיקייה: 02340125 - אלגוריתמים נומריים

1 - פירוק LU

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • תזכורות
  • אלימינצית גאוס
  • הפירוק באופן כללי
  • כמות החישובים בפירוק UL
  • פרמוטציות
  • חישוב דטטרמיננט בעזרת פירוק LU
  • פירוק LU למטריצות לא ריבועיות
  • שיטות לבחירת Pivot מוצלח
  • אלגוריתם partial; pivoting
  • פירוק LDL^T ו-Cholesky
  • פירוק LDV
  • מטריצות סימטריות
  • מטריצות חיוביות מוגדרות
  • מטריצות Gram
  • פירוק Cholesky

1 - פירוק LU

02340125

אלגוריתמים נומריים

רשימות הרצאה לקריאה בשבת

פירוק LU

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

המטרה שלנו היא להראות כי כל מטריצה AAA ניתנת לפירוק של מטריצה משולשת עליונה כפול מטריצה משולשת תחתונה. לפירוק הזה נקרא LULULU.
פירוק זה יעיל משום שהוא מאפשר פתרון מערכת משוואות, חישוב דטרמיננט של מטריצה וקביעת דרגתה של מטריצה הרבה יותר בקלות.

תזכורות

אלימינצית גאוס

אנו עושים שימוש בפעולות בסיסיות כדי לפתור ממ"ל ע"י פעולות על המטריצה המורחבת [A,b‾][A,\underline{b}][A,b​] של הבעיה.

(121261114)(xyz)=(273)  ⟹  (A∣b‾)=(121226171143)\begin{pmatrix} 1 & 2 & 1 \\ 2 & 6 & 1 \\ 1 & 1 & 4 \end{pmatrix}\begin{pmatrix} x \\ y \\ z \end{pmatrix}=\begin{pmatrix} 2 \\ 7 \\ 3 \end{pmatrix}\implies (A|\underline{b})=\left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 2 & 6 & 1 & 7 \\ 1 & 1 & 4 & 3 \end{array}\right)​121​261​114​​​xyz​​=​273​​⟹(A∣b​)=​121​261​114​273​​

נפעיל סדרת פעולות בסיסיות:

  ⟹  (121202−130−131)  ⟹  (121202−13002.52.5)  ⟹  z=1  ⟹  y=2  ⟹  x=−3\implies \left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 0 & 2 & -1 & 3 \\ 0 & -1 & 3 & 1 \end{array}\right)\implies \left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 0 & 2 & -1 & 3 \\ 0 & 0 & 2.5 & 2.5 \end{array}\right)\implies z=1 \implies y=2 \implies x=-3⟹​100​22−1​1−13​231​​⟹​100​220​1−12.5​232.5​​⟹z=1⟹y=2⟹x=−3

נסתכל כעת באופן מעט שונה על התהליך.

(100−210001)(121226171143)=(121202−131143)\begin{pmatrix} 1 & 0 & 0 \\ -2 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 2 & 6 & 1 & 7 \\ 1 & 1 & 4 & 3 \end{array}\right)=\left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 0 & 2 & -1 & 3 \\ 1 & 1 & 4 & 3 \end{array}\right)​1−20​010​001​​​121​261​114​273​​=​101​221​1−14​233​​

נשים לב שזוהי בעצם מטריצה אלמנטרית. אפשר להמשיך ולהכפיל מטריצות ובסוף להגיע לאותה התוצאה.

(100−210001)E1(100010−101)E2(1000100121)E3⋅(121226171143)=(121202−13002.52.5)\underbracket{\begin{pmatrix} 1 & 0 & 0 \\ -2 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}}_{E_{1}}\underbracket{\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -1 & 0 & 1 \end{pmatrix}}_{E_{2}}\underbracket{\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & \frac{1}{2} & 1 \end{pmatrix}}_{E_{3}}\cdot \left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 2 & 6 & 1 & 7 \\ 1 & 1 & 4 & 3 \end{array}\right)=\left(\begin{array}{ccc|c} 1 & 2 & 1 & 2 \\ 0 & 2 & -1 & 3 \\ 0 & 0 & 2.5 & 2.5 \end{array}\right)E1​​1−20​010​001​​​E2​​10−1​010​001​​​E3​​100​0121​​001​​​⋅​121​261​114​273​​=​100​220​1−12.5​232.5​​

נביט שוב במטריצות האלו. נשים לב כי הן בעל מבנה מיוחד:

  • כל איברי אלכסונן הם 111-ים. (זאת כי לכל שורה פעולתנו משמרת את השורה ומוסיפה/מחסירה לה שורה אחרת המוכפלת בסקלר)
  • אלה מטריצות משולשות תחתונות (כי תמיד אנו מצרים לשורה שורות מעליה)

מטריצות אלו נקראות מטריצות משולשות תחתונות בסיסיות.

הערה

נשים לב כי לכל מטריצה שכזו במקרה הזה בלבד יש רק שינוי אחד ל-III וזו בגלל שכל מטריצה פה בלבד טיפלה בנושא אחד בלבד.

נסתכל שוב על המטריצה הזו ונחשב את Ei−1E_{i}^{-1}Ei−1​ לכל אחת מהן. במקום ללכת בדרך הרגילה, נוכל לראות טריק: מכיוון שהמטריצה הזו היא בעצם אפקט, אנחנו הופכים את ההאפקט ומקבלים את ההפיכה.

E1−1=L1=(100210001)E2−1=L2=(100010101)E3−1=L3=(1000100−121)E_{1}^{-1}=L_{1}=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} \qquad E_{2}^{-1}=L_{2}=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{pmatrix} \qquad E_{3}^{-1}=L_{3}=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -\frac{1}{2} & 1 \end{pmatrix}E1−1​=L1​=​120​010​001​​E2−1​=L2​=​101​010​001​​E3−1​=L3​=​100​01−21​​001​​

נשים לב כי גם הן משולשות תחתונות בסיסיות כמו המטריצות ממקודם.

עד כה, לקחנו ממ"ל Ax‾=b‾A\underline{x}=\underline{b}Ax​=b​ והמרנו אותה במערכת השקולה לה E3E2E1Ax‾=E3E2E1b‾E_{3}E_{2}E_{1}A\underline{x}=E_{3}E_{2}E_{1}\underline{b}E3​E2​E1​Ax​=E3​E2​E1​b​.
מה קרה למטריצה בסוף? קיבלנו מטריצה משולשת עליונה (12102−1002.5)\begin{pmatrix}1&2&1\\0&2&-1\\0&0&2.5\end{pmatrix}​100​220​1−12.5​​ כפול מטריצות משולשות תחתונות בסיסיות. נסמן אותה ב-UUU (כן, זה אותו UUU של ה-LULULU)

הערה (מדוע המערכות שקולות)

כיוון שהמטריצות שהכפלנו ריבועיות והפיכות.

E3E2E1Ax‾=E3E2E1b‾⇓Ux‾=E3E2E1b‾⇓b‾=(E3E2E1)−1Ux‾=↓לפי משפט מאלגברהL1L2L3Ux‾\begin{matrix} E_{3}E_{2}E_{1}A\underline{x}=E_{3}E_{2}E_{1}\underline{b} \\ \Downarrow \\ U\underline{x}=E_{3}E_{2}E_{1}\underline{b} \\ \Downarrow \\ \underline{b}=(E_{3}E_{2}E_{1})^{-1}U\underline{x}\underset{\begin{matrix} \downarrow \\ \R{\text{לפי משפט מאלגברה}} \end{matrix}}{=} L_{1}L_{2}L_{3}U\underline{x} \end{matrix}E3​E2​E1​Ax​=E3​E2​E1​b​⇓Ux​=E3​E2​E1​b​⇓b​=(E3​E2​E1​)−1Ux​↓לפי משפט מאלגברה​=​L1​L2​L3​Ux​​
הערה

המכפלה L=L1L2L3L=L_{1}L_{2}L_{3}L=L1​L2​L3​ מתקבלת ללא חישובים כלל(מדוע??)

נשים לב כי כפל של כל המטריצות המשולשות תחתונות בסיסיות נותן לנו עוד מטריצה משולשת תחתונה בסיסית:

L=L1L2L3=(100210001)(100010101)(1000100−121)=(1002101−121)L=L_{1}L_{2}L_{3}=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -\frac{1}{2} & 1 \end{pmatrix}=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}L=L1​L2​L3​=​120​010​001​​​101​010​001​​​100​01−21​​001​​=​121​01−21​​001​​

ואז:

b‾=LUx‾\underline{b}=LU\underline{x}b​=LUx​

מערכת המשוואות המקורית הפכה למערכת משוואת של כפולה של מטריצה משולשת עליונה(UUU) במטריצה משולשת תחתונה(LLL). כעת, נגלה עוד דבר מעניין ביותר:

b‾=Ax‾=LUx‾\underline{b}=A\underline{x}=LU\underline{x}b​=Ax​=LUx​ ⇓\Downarrow⇓ A=LU=(1002101−121)(12102−1002.5)A=LU=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 2 & -1 \\ 0 & 0 & 2.5 \end{pmatrix}A=LU=​121​01−21​​001​​​100​220​1−12.5​​
הערה

פירוק זה לא תלוי ב-bbb כלל וכולו נובע מ-AAA עצמה.

לא כל מטריצה ריבועית ניתנת לפירוק LULULU. עוד מעט נראה גרסה למשפט שיפתור לנו את כל הבעיות.

הפירוק באופן כללי

הגדרה 1 (מטריצה רגילה)

מטריצה AAA נקראת מטריצה רגילה אם היא ריבועית וניתן לפרקה למכפלה מהצורה A=LUA=LUA=LU כאשר

  • LLL מטריצה משולשת תחתונה בסיסית.
  • UUU מטריצה משולשת עליונה כלשהי עם איברי אלכסון ראשי שונים מאפס.

משפט

הפירוק הנ"ל עבור מטריצה רגילה הינו יחיד!

כרגע, נביט רק על מטריצות רגילות ובהמשך נראה מה קורה כשהפירוק נכשל.
השימוש המרכזי לפירוק LULULU הוא לטובת פתרון ממ"לים.

b‾=Ax‾=LUx‾=L(Ux‾)=Ly‾\underline{b}=A\underline{x}=LU\underline{x}=L(U\underline{x})=L\underline{y}b​=Ax​=LUx​=L(Ux​)=Ly​

כצעד ראשון עלינו לפתור את המערכת הבאה ע"י החלפה קדמית - זהו תהליך סדרתי שיתחיל בחישוב y1y_{1}y1​ ויעבור ל-y2y_{2}y2​ וכך עד yny_{n}yn​:

(1000…0ℓ12100…0ℓ31ℓ3210…0ℓ41ℓ42ℓ431…0⋮⋮⋮⋮⋱⋮ℓn1ℓn2ℓn3ℓn4…1)(y1y2y3y4⋮yn)=(b1b2b3b4⋮bn)\begin{pmatrix} 1 & 0 & 0 & 0 & \dots & 0 \\ \ell_{12} & 1 & 0 & 0 & \dots & 0 \\ \ell_{31} & \ell_{32} & 1 & 0 & \dots & 0 \\ \ell_{41} & \ell_{42} & \ell_{43} & 1 & \dots & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\ \ell_{n1} & \ell_{n2} & \ell_{n3} & \ell_{n4} & \dots & 1 \end{pmatrix}\begin{pmatrix} y_{1} \\ y_{2} \\ y_{3} \\ y_{4} \\ \vdots \\ y_{n} \end{pmatrix}=\begin{pmatrix} b_{1} \\ b_{2} \\ b_{3} \\ b_{4} \\ \vdots \\ b_{n} \end{pmatrix}​1ℓ12​ℓ31​ℓ41​⋮ℓn1​​01ℓ32​ℓ42​⋮ℓn2​​001ℓ43​⋮ℓn3​​0001⋮ℓn4​​…………⋱…​0000⋮1​​​y1​y2​y3​y4​⋮yn​​​=​b1​b2​b3​b4​⋮bn​​​

האם יכול להיות מצב שלמערכת משוואות זו אין פתרון? לא! זאת מכיוון ש-∣A∣=1|A|=1∣A∣=1 ולכן, לפי משפט, המטריצה הפיכה ולכן קיים פתרון.
למערכת זו קל למצוא פתרון ולכן מאוד קל למצוא את מה שצריך. כעת, נמצא את מה שאנחנו צריכים ע"י פתירה בהחלפה אחורית - מתחילים בחישוב xnx_{n}xn​ ואז ממשיכים עד ל-x1x_{1}x1​.

(u11u12u13u14…u1n0u22u23u24…u2n00u33u34…u3n000u44…u4n⋮⋮⋮⋮⋱⋮0000…unn)(x1x2x3x4⋮xn)=(y1y2y3y4⋮yn)\begin{pmatrix} u_{11} & u_{12} & u_{13} & u_{14} & \dots & u_{1n} \\ 0 & u_{22} & u_{23} & u_{24} & \dots & u_{2n} \\ 0 & 0 & u_{33} & u_{34} & \dots & u_{3n} \\ 0 & 0 & 0 & u_{44} & \dots & u_{4n} \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & 0 & \dots & u_{nn} \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \\ \vdots \\ x_{n} \end{pmatrix}=\begin{pmatrix} y_{1} \\ y_{2} \\ y_{3} \\ y_{4} \\ \vdots \\ y_{n} \end{pmatrix}​u11​000⋮0​u12​u22​00⋮0​u13​u23​u33​0⋮0​u14​u24​u34​u44​⋮0​…………⋱…​u1n​u2n​u3n​u4n​⋮unn​​​​x1​x2​x3​x4​⋮xn​​​=​y1​y2​y3​y4​⋮yn​​​

כל איברי האלכסון שונים מאפס(מכיוון שהמטריצה רגילה) ולכן הדטרמיננטה אינה אפס ולכן המטריצה הפיכה ובטוח קיים פתרון.

מסקנה (לסיכום)

בהינתן מערכת משוואת Ax‾=b‾A\underline{x}=\underline{b}Ax​=b​ עם מטריצה AAA רגילה נוכל לבחור באחת משתי האפשרויות הבאות:

  1. חישוב פירוק A=ULA=ULA=UL ואז חישוב הפתרון עי"י החלפה קדמית ואז אחורית.
  2. חישוב המטריצה ההפיכה A−1A^{-1}A−1 ואז חישוב הפתרון ע"י A−1b‾A^{-1}\underline{b}A−1b​.

הפתרון הראשון עדיף בהרבה שכן הוא הרבה יותר קל והרבה פחות פרוץ לטעויות.

כמות החישובים בפירוק ULULUL

חישוב המכפלה הסופית:
כמות החישובים הנדרשים לחישוב המכפלה של מטריצה בגודל n×nn\times nn×n בוקטור היא n2n^2n2 פעולות.
כמות החישובים הנדרשים לתהליך החלפה קדמי/אחורי הוא 12n2\frac{1}{2}n^221​n2 כאשר אנו סופרים רק מכפלות וחלוקות כשווי מעמד

כשמחשבים רואים שמציאת הפתרון אחרי חישוב A−1A^{-1}A−1 זהה לחישוב הפתרון לאחר שמוצאים פירוק LULULU. לכן, ההבדל ביעילות יבוא בהכרח ממציאת LULULU ומציאת A−1A^{-1}A−1.

מספר הפעולות הנדרש לפעולות LULULU הוא n33\frac{n^3}{3}3n3​ פעולות. (אולי נקבל את זה בתרגיל בית להוכחה)
כמה חישובים נדרשים לחישוב A−1A^{-1}A−1?

AX=IAX=IAX=I

מתקבלות nnn מערכות משוואות שיש לפתור:

A(x11x21x31x41⋮xn1)=(1000⋮0)A(x12x22x32x42⋮xn2)=(0100⋮0)…A(x1nx2nx3nx4n⋮xnn)=(0000⋮1)\begin{matrix} A\begin{pmatrix} x_{11} \\ x_{21} \\ x_{31} \\ x_{41} \\ \vdots \\ x_{n1} \end{pmatrix}=\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 0 \end{pmatrix} & A\begin{pmatrix} x_{12} \\ x_{22} \\ x_{32} \\ x_{42} \\ \vdots \\ x_{n2} \end{pmatrix}=\begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \\ \vdots \\ 0 \end{pmatrix} & \dots & A\begin{pmatrix} x_{1n} \\ x_{2n} \\ x_{3n} \\ x_{4n} \\ \vdots \\ x_{nn} \end{pmatrix}=\begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 1 \end{pmatrix} \end{matrix}A​x11​x21​x31​x41​⋮xn1​​​=​1000⋮0​​​A​x12​x22​x32​x42​⋮xn2​​​=​0100⋮0​​​…​A​x1n​x2n​x3n​x4n​⋮xnn​​​=​0000⋮1​​​

נדרש לפתור את כל המערכות הללו על מנת למצוא את A−1A^{-1}A−1. נשים לב שכדי לעשות את זה נוכל לעשות:

  1. לקחת את AAA ולבצע לו פירוק LULULU וזה n33\frac{n^3}{3}3n3​ פעולות
  2. לכל אחת מ-nnn המערכות נבצע תהליך החלפה אחורית/קדמית - n3n^3n3

ולכן, בסה"כ חישוב הפתרון הוא 4n334 \frac{n^3}{3}43n3​.
הוא עובד בעצם פי 4 יותר קשה מאשר פירוק ה-LULULU לבדו.

הערה

אמנם הסיבוכיות זהה Θ(n3)\Theta(n^3)Θ(n3) אבל בעולם האמיתי יש הבדל עצום בזמן.

בנוסף, יותר כדאי לפתור עם LULULU מכיוון שיש יותר יציבות אלגברית או משהו כזה שהוא לא הסביר ואמר שקשה להבין.

פרמוטציות

דוגמה

תהי A=(031261104)∈R3×3A=\begin{pmatrix}0&3&1\\2&6&1\\1&0&4\end{pmatrix}\in \mathbb{R}^{3\times3}A=​021​360​114​​∈R3×3. נשים לב כי היא לא רגילה מכיוון שלא קיימת LLL כנדרש.
נדרש לשנות מעט את המטריצה שכן איבר האפס a11a_{11}a11​ לא יכול לשמש כאיבר ציר ולכן התהליך נתקע.
כל מה שעלינו לעשות הוא לשנות את סדר השורות וזאת ע"י פעולת הפרמוטציה:

PA=(010100001)(031261104)=(261031104)PA=\begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 0 & 3 & 1 \\ 2 & 6 & 1 \\ 1 & 0 & 4 \end{pmatrix}=\begin{pmatrix} 2 & 6 & 1 \\ 0 & 3 & 1 \\ 1 & 0 & 4 \end{pmatrix}PA=​010​100​001​​​021​360​114​​=​201​630​114​​

יש פה מקום להתלבט האם להחליף עם השנייה או עם השלישית את השורה הראשונה. נשים לב כי נקבל פתרון שונה לכל אחת מהאופציות.
כעת נמשיך כרגיל:

E1PA=(100010−1201)(261031104)=(2610310−33.5)E_{1}PA=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -\frac{1}{2} & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 6 & 1 \\ 0 & 3 & 1 \\ 1 & 0 & 4 \end{pmatrix}=\begin{pmatrix} 2 & 6 & 1 \\ 0 & 3 & 1 \\ 0 & -3 & 3.5 \end{pmatrix}E1​PA=​10−21​​010​001​​​201​630​114​​=​200​63−3​113.5​​ E2E1PA=(100010011)(2610310−33.5)=(261031004.5)=UE_{2}E_{1}PA=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 1 & 1 \end{pmatrix}\begin{pmatrix} 2 & 6 & 1 \\ 0 & 3 & 1 \\ 0 & -3 & 3.5 \end{pmatrix}=\begin{pmatrix} 2 & 6 & 1 \\ 0 & 3 & 1 \\ 0 & 0 & 4.5 \end{pmatrix}=UE2​E1​PA=​100​011​001​​​200​63−3​113.5​​=​200​630​114.5​​=U

כעת נמצא את LLL. נתחיל מהתכונות שאותן אנו יודעים: (100□10□□1)\begin{pmatrix}1&0&0\\ \square & 1 & 0\\ \square & \square & 1\end{pmatrix}​1□□​01□​001​​
כעת, נמלא את שאר התאים:

L=(10001012−11)L=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ \frac{1}{2} & -1 & 1 \end{pmatrix}L=​1021​​01−1​001​​

נשים לב כי לבסוף קיבלנו פה PA=LUPA=LUPA=LU.

במקרה הכללי, תהליך הפירוק "יזרום" כרגיל, ובכל פעם שנתקל באיבר ציר בעייתי(מאופס), נחליף את השורה בה הוא נמצא באחת השורות מתחתיו.
אנו לא רוצים לשתול באמצע המטריצות הבסיסיות איזו PPP שכזו, מה נוכל לעשות מבלי לעשות את הפירוק פעמיים? הוא אמר שהוא לא נכנס לזה ושעושים את זה עם שמירת פוינטר לכל שורה.

הערה

  • בשל החופש באיזו שורה להחליף, אין יותר יחידות בבנית הפירוק
  • מהתיאור הנ"ל נדמה שהפעולות הבסיסיות והפרמוטציות יתערבבו ללא סדר. בפועל, יש לגלות את כל ההחלפות הנחוצות ולבצען בתחילת התהליך בלבד!
הגדרה 2 (מטריצת פרמוטציה)

מטריצת פרמוטציה היא מטריצת יחידה ששורותיה עורבלו.
בכל עמודה במטריצה זו איבר אחד שונה מאפס וערכו 111 וכנ"ל לגבי השורות.

דוגמה (מציאת פירוק ULULUL)

נמצא כעת פירוק ULULUL למטריצה A=(0234211144562222)A=\begin{pmatrix}0&2&3&4\\2&1&1&1\\4&4&5&6\\2&2&2&2\end{pmatrix}A=​0242​2142​3152​4162​​.
הצעד הראשון שנעשה יהיה פרמוטציה שכן 000 לא יכול להיות איבר מוביל. P1A=(0100100000100001)(0234211144562222)=(2111023444562222)P_{1}A=\begin{pmatrix}0 & 1 & 0 & 0\\1 & 0 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{pmatrix}\begin{pmatrix}0 & 2 & 3 & 4\\2 & 1 & 1 & 1\\4 & 4 & 5 & 6\\2 & 2 & 2 & 2\end{pmatrix}=\begin{pmatrix}2 & 1 & 1 & 1\\0 & 2 & 3 & 4\\4 & 4 & 5 & 6\\2 & 2 & 2 & 2\end{pmatrix}P1​A=​0100​1000​0010​0001​​​0242​2142​3152​4162​​=​2042​1242​1352​1462​​
כעת, נוכל לבצע עליה פעולות אלמנטריות באמצעות מטריצות בסיסיות:

E2E1P1A=(100001000010−1001)(10000100−20100001)(2111023444562222)=(2111023402340111)E_{2}E_{1}P_{1}A=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -1 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -2 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 4 & 4 & 5 & 6 \\ 2 & 2 & 2 & 2 \end{pmatrix}=\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 0 & 2 & 3 & 4 \\ 0 & 1 & 1 & 1 \end{pmatrix}E2​E1​P1​A=​100−1​0100​0010​0001​​​10−20​0100​0010​0001​​​2042​1242​1352​1462​​=​2000​1221​1331​1441​​

נשים לב כי פה הגענו לבעיה - יש לנו שתי שורות זהות. מה שיגרום לכך שלא נוכל להפוך את המטריצה למשולשת.
מה שאנחנו צריכים לעשות עכשיו זה לכאורה להתחיל מהתחלה כך:

P2P1A=(0100100000010010)(0234211144562222)=(2111023422224456)P_{2}P_{1}A=\begin{pmatrix} 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}\begin{pmatrix} 0 & 2 & 3 & 4 \\ 2 & 1 & 1 & 1 \\ 4 & 4 & 5 & 6 \\ 2 & 2 & 2 & 2 \end{pmatrix}=\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 2 & 2 & 2 & 2 \\ 4 & 4 & 5 & 6 \end{pmatrix}P2​P1​A=​0100​1000​0001​0010​​​0242​2142​3152​4162​​=​2024​1224​1325​1426​​

נפתור מחדש:

E2E1P2P1A=(10000100−10100001)(100001000010−2001)(2111023422224456)=(2111023401110234)E_{2}E_{1}P_{2}P_{1}A=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -2 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 2 & 2 & 2 & 2 \\ 4 & 4 & 5 & 6 \end{pmatrix}=\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 0 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \end{pmatrix}E2​E1​P2​P1​A=​10−10​0100​0010​0001​​​100−2​0100​0010​0001​​​2024​1224​1325​1426​​=​2000​1212​1313​1414​​

נשים לב כי הפעולות שעשינו הן בדיוק אותן פעולות כמו מקודם - רק מוזזות בין השורות לפי הפרמוטציה החדשה שעשינו.
איך זה יעזור לנו?
כשנכתוב את האלגוריטם שלנו, אנחנו נחזיק מערכת עם מצביעים לשורות. ומאתה והילך אנחנו נעבוד עם פוינטרים לשורות. ותוך כדי ריצה נוכל לבצע את הפרמוטציות האלו.

הערה

אין אנו נדרש לכתוב את הקוד הזה לכן זה בגדר העשרה חלקית.

כעת, נמשיך בפירוק:

E4E3E2E1P2P1A=(1000010000100−101)(100001000−12100001)(2111023401110234)=(2111023400−12−10000)E_{4}E_{3}E_{2}E_{1}P_{2}P_{1}A=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & -1 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & -\frac{1}{2} & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 0 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \end{pmatrix}=\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 0 & 0 & -\frac{1}{2} & -1 \\ 0 & 0 & 0 & 0 \end{pmatrix}E4​E3​E2​E1​P2​P1​A=​1000​010−1​0010​0001​​​1000​01−21​0​0010​0001​​​2000​1212​1313​1414​​=​2000​1200​13−21​0​14−10​​

כעת, נוכל לאגרן ולקבל:

PA=(10000100112102101)(2111023400−12−10000)=LUPA=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & \frac{1}{2} & 1 & 0 \\ 2 & 1 & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 1 & 1 & 1 \\ 0 & 2 & 3 & 4 \\ 0 & 0 & -\frac{1}{2} & -1 \\ 0 & 0 & 0 & 0 \end{pmatrix}=LUPA=​1012​0121​1​0010​0001​​​2000​1200​13−21​0​14−10​​=LU
הערה

אין דרך לצפות מראש את כל הפרמוטציות הנחוצות.

משפט

כל מטריצה ריבועית AAA ניתנת לפירוק מהצורה PA=LUPA=LUPA=LU כאשר

  • PPP מטריצת פרמוטציה המחליפה סדר שורות
  • LLL מטריצה משולשת תחתונה בסיסית
  • UUU מטריצה משולשת עליונה כלשהי
הערה (האם העובדה שאין יחידות משפיעה על הפתרון?)

ברמה המתמטית תיאורתית זה לא אמור להשפיע. אבל בפועל, יכול להיות שיהיו קצת סטיות אחרות ולכן הפתרון יהיה קצת שונה.

בהינתן המערכת Ax‾=b‾A\underline{x}=\underline{b}Ax​=b​ והפירוק PA=LUPA=LUPA=LU, כיצד יחושב x‾\underline{x}x​?

PAx=PbPAx=PbPAx=Pb LUx‾=PbLU\underline{x}=PbLUx​=Pb

נפתור מערכת משוואות באמצעות החלפה קדמית: Ly‾=Pb‾L\underline{y}=P\underline{b}Ly​=Pb​ ואז נפתור באמצעות החלפה אחורית Ux‾=y‾U\underline{x}=\underline{y}Ux​=y​.

חישוב דטטרמיננט בעזרת פירוק LULULU

נזכר שפירוק ULULUL נראה כך:

PA=LUPA=LUPA=LU

נוכל לקחת את הדטרמיננט לשני האגפים:

∣P∣∣A∣=∣PA∣=∣LU∣=∣U∣∣L∣|P||A|=|PA|=|LU|=|U||L|∣P∣∣A∣=∣PA∣=∣LU∣=∣U∣∣L∣

לפי משפט מאלגברה: הדרטרמיננטה של מטריצה משולשת היא מכפלת איברי האלכסון.

{∣P∣=±1∣L∣=1∣U∣=∏k=1nukk  ⟹  ∣A∣=±u11u22…unn\begin{cases} |P|=\pm1 \\ |L|=1 \\ |U|=\prod_{k=1}^n u_{kk} \end{cases} \implies |A|=\pm u_{11}u_{22}\dots u_{nn}⎩⎨⎧​∣P∣=±1∣L∣=1∣U∣=∏k=1n​ukk​​⟹∣A∣=±u11​u22​…unn​
משפט

עבור מטריצה ריבועית AAA עם הפירוק PA=LUPA=LUPA=LU, אם כל איברי האלכסון הראשי של UUU שונים מאפס, אזי AAA הפיכה.

באמצעות פירוק LULULU ניתן לחשב את הדטרמיננט של מטריצה בסיבוכיות n33\frac{n^3}{3}3n3​ (כאשר הזמן מגיע ממציאת הפירוק ולא מהחישוב שלאחריו)
החלופה היא נוסחת המינורים של קרמר שדורשת n!n!n! פעולות ולכן פירוק LULULU עדיף מאוד.

פירוק LULULU למטריצות לא ריבועיות

טענה

כל מטריצה ניתנת לפירוק LULULU (עם פרמוטציה), גם אם אינה ריבועית

כעת, נחקור ונראה כי הטענה הזו נכונה.
נתחיל ממטריצה לא ריבועית בלי צורך בפרמוטציות. נכפיל אותה במטריצות בסיסיות כך:
​1 - פירוק LU 2026-04-16 13.59.17.excalidraw.svg
כעת, נתחיל למצוא את הבסיסיות שלב אחר שלב:
​1 - פירוק LU 2026-04-16 14.06.43.excalidraw.svg
נמשיך כך ולבסוף נגיע ליצור הזה:
​1 - פירוק LU 2026-04-16 14.17.22.excalidraw.svg
נוכל כעת לחלק את המטריצות הללו לשני בלוקים ולהתייחס לכפל ככה:
​1 - פירוק LU 2026-04-16 14.19.04.excalidraw.svg
נשים לב כי U2U_{2}U2​ היא מטריצת האפס ולכן:

A=L1U1+L2⋅0=L1U2A=L_{1}U_{1}+L_{2}\cdot 0=L_{1}U_{2}A=L1​U1​+L2​⋅0=L1​U2​

כעת, נסתכל גם על מטריצה עם פרמוטציות:

PA=L1U2PA=L_{1}U_{2}PA=L1​U2​

(סליחה, לא היה לי כח לצייר עוד מלא מטריצות)

משפט

כל מטריצה ניתנת לפירוק LULULU (עם פרמוטציה) גם אם אינה ריבועית

הערה

נראה איך נראת מטריצה שהינה רחבה יותר מאשר ארוכה:
​1 - פירוק LU 2026-04-16 15.14.03.excalidraw.svg

שיטות לבחירת PivotPivotPivot מוצלח

ישנם הרבה מצבים שבהם נרצה להחליף את הסדר השורות בחוכמה. נתחיל בדוגמה:

דוגמה

(10−5111)(xy)=(10)\begin{pmatrix} 10^{-5} & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 \\ 0 \end{pmatrix}(10−51​11​)(xy​)=(10​)

נתחיל בלבצע פתרון מושלם בעזרת גאוס:

(10−1051)(10−5111)(xy)=(10−1051)(10)  ⟹  (10−5101−10−5)(xy)=(1−105)\begin{pmatrix} 1 & 0 \\ -10^{5} & 1 \end{pmatrix}\begin{pmatrix} 10^{-5} & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 & 0 \\ -10^5 & 1 \end{pmatrix}\begin{pmatrix} 1 \\ 0 \end{pmatrix}\implies \begin{pmatrix} 10^{-5} & 1 \\ 0 & 1-10^{-5} \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 \\ -10^5 \end{pmatrix}(1−105​01​)(10−51​11​)(xy​)=(1−105​01​)(10​)⟹(10−50​11−10−5​)(xy​)=(1−105​)

הפתרון למערכת זו הוא:

y=−1051−105  ⟹  x=1051−105y=-\frac{10^5}{1-10^5} \implies x=\frac{10^5}{1-10^{5}}y=−1−105105​⟹x=1−105105​

כעת נבצע את זה על מחשב שעובד עם 4 ספרות ונראה מה האי דיוק שיוצא לנו:

(10−1051)(10−5111)(xy)=(10−1051)(10)  ⟹  (10−5101−10−5)(xy)=(1−105)\begin{pmatrix} 1 & 0 \\ -10^{5} & 1 \end{pmatrix}\begin{pmatrix} 10^{-5} & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 & 0 \\ -10^5 & 1 \end{pmatrix}\begin{pmatrix} 1 \\ 0 \end{pmatrix}\implies \begin{pmatrix} 10^{-5} & 1 \\ 0 & {\color{orange} 1-10^{-5}} \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 \\ -10^5 \end{pmatrix}(1−105​01​)(10−51​11​)(xy​)=(1−105​01​)(10​)⟹(10−50​11−10−5​)(xy​)=(1−105​)

התוצאה של הביטוי הזה תעוגל קלות לאור מגבלות המחשב ואז:

y=−105−105  ⟹  x=110−5(1−1)=0y=\frac{-10^5}{-10^5}\implies x=\frac{1}{10^{-5}}(1-1)={\color{red} 0}y=−105−105​⟹x=10−51​(1−1)=0

המספר yyy יצא לא רחוק ממה שהוא יצא במקור, אבל ב-xxx קיבלנו כעת תוצאה שונה.
איך נתקן זאת? בעזרת פרמוטציות

כעת, נבצע את אותו הדבר אבל נחליף את סדר השורות:

(0110)(10−5111)(xy)=(0110)(10)  ⟹  (1110−51)(xy)=(01)\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\begin{pmatrix} 10^{-5} & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\begin{pmatrix} 1 \\ 0 \end{pmatrix}\implies \begin{pmatrix} 1 & 1 \\ 10^{-5} & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​10​)(10−51​11​)(xy​)=(01​10​)(10​)⟹(110−5​11​)(xy​)=(01​)

כעת, נכפיל ב-10−510^{-5}10−5 את השורה העליונה ומחסיר - בכך אנו מקטינים את המספר ולכן האי דיוק לא יתקיים:

(10−10−51)(1110−51)(xy)=(10−10−51)(01)\begin{pmatrix} 1 & 0 \\ -10^{-5} & 1 \end{pmatrix}\begin{pmatrix} 1 & 1 \\ 10^{-5} & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 & 0 \\ -10^{-5} & 1 \end{pmatrix}\begin{pmatrix} 0 \\ 1 \end{pmatrix}(1−10−5​01​)(110−5​11​)(xy​)=(1−10−5​01​)(01​) (1101)(xy)=(01)\begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 0 \\ 1 \end{pmatrix}(10​11​)(xy​)=(01​)

כעת, קיבלנו את התוצאות הרצויות.

אלגוריתם partial  pivotingpartial\; pivotingpartialpivoting

נניח וכעת אנחנו בעמודה nnn, נעבור על כל השורות שנמצאות באינדקס גדול מ-nnn ונבחר כ-pivotpivotpivot את המספר הכי גדול בערך מוחלט.

דוגמה

(10−5111)(xy)=(10)  ⟹  (110511)(xy)=(1050)\begin{pmatrix} 10^{-5} & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 \\ 0 \end{pmatrix}\implies \begin{pmatrix} 1 & 10^5 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 10^5 \\ 0 \end{pmatrix}(10−51​11​)(xy​)=(10​)⟹(11​1051​)(xy​)=(1050​)

כעת, לפי איך שהגדרנו אל האלגוריתם, אנחנו יכולים להתחיל לפתור, אז בואו ננסה לעשות זאת:

(10−11)(110511)(xy)=(10−11)(1050)\begin{pmatrix} 1 & 0 \\ -1 & 1 \end{pmatrix}\begin{pmatrix} 1 & 10^5 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 1 & 0 \\ -1 & 1 \end{pmatrix}\begin{pmatrix} 10^5 \\ 0 \end{pmatrix}(1−1​01​)(11​1051​)(xy​)=(1−1​01​)(1050​) (11050−105)(xy)=(105−105)  ⟹  {y=1x=105−105=0\begin{pmatrix} 1 & 10^5 \\ 0 & -10^5 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} 10^5 \\ -10^5 \end{pmatrix}\implies \begin{cases} y=1 \\ x=10^5-10^5={\color{red} 0} \end{cases}(10​105−105​)(xy​)=(105−105​)⟹{y=1x=105−105=0​

שוב פעם יש בעיה. למה זה קרה? כי בפנים יש מספר ענק נוסף.

הערה (אלגוריתם full  pivotingfull\; pivotingfullpivoting)

במקום לבדוק רק למטה, אנחנו נבדוק למטה וימינה בכל הבלוק. נבדוק מה המספר הכי גדול בבלוק ואז נזיז אותו לשורה והעמודה שצריך כדי שהוא יהיה ה-pivotpivotpivot.
במקום לבדוק רק למטה, אנחנו נבדוק למטה וימינה בכל הבלוק. נבדוק מה המספר הכי גדול בבלוק ואז נזיז אותו לשורה והעמודה שצריך כדי שהוא יהיה ה-pivotpivotpivot.

PAQ=LUPAQ=LUPAQ=LU

כאשר PPP היא פרמוטציה לשורות ו-QQQ היא פרמוטציה לעמודות.

הערה (להערה)

זה אלוגריתם לא מומלץ שכן יש לו מחיר עצום!

פירוק LDLTLDL^TLDLT ו-CholeskyCholeskyCholesky

פירוק LDVLDVLDV

ראינו כי כל מטריצה AAA ניתנת לפירוק מהצורה PA=LUPA=LUPA=LU. כאשר אנו עוסקים במטריצות ריבועיות, אם כל איברי האלכסון של UUU שונים מאפס, אנו יודעים כי המטריצה הפיכה(כי הדטרמיננטה שלה שונה מ-000).
משתי עובדות אלו נובע הפירוק הבא:

משפט

כל מטריצה AAA ריבועית והפיכה ניתנת לפירוק מהצורה PA=LDVPA=LDVPA=LDV כאשר

  • PPP היא מטריצת פרמוטציה המחליפה סדר שורות
  • LLL מטריצה משולשת תחתונה בסיסית
  • VVV מטריצה משולשת עליונה בסיסית
  • DDD מטריצה אלכסונית בה כל איברי האלכסון שונים מאפס.
דוגמה

ראינו בתחילת ההרצאה את הדוגמה הזו:

A=LU=(1002101−121)(12102−1002.5)A=LU=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 2 & -1 \\ 0 & 0 & 2.5 \end{pmatrix}A=LU=​121​01−21​​001​​​100​220​1−12.5​​

כעת, נרצה שגם המשולשת העליונה תהיה בסיסית. לכת, נבצע את זה:

A=LU=(1002101−121)(100020002.5)(12101−12001)A=LU=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 2.5 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 1 & -\frac{1}{2} \\ 0 & 0 & 1 \end{pmatrix}A=LU=​121​01−21​​001​​​100​020​002.5​​​100​210​1−21​1​​
הערה

כשמטריצה אלכסונית מכפילה מטריצה כלשהי משמאל, איברי האלכסון מכפילים את השורות.

דוגמה (למה הגבלנו את הדיון למטריצות הפיכות?)

A=LU=(1002101−121)(12102−1000)=(1002101−121)(100020000)(12101−12001)A=LU=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 2 & -1 \\ 0 & 0 & 0 \end{pmatrix}=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 0 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 1 & -\frac{1}{2} \\ 0 & 0 & 1 \end{pmatrix}A=LU=​121​01−21​​001​​​100​220​1−10​​=​121​01−21​​001​​​100​020​000​​​100​210​1−21​1​​

פה נראה כי אין שום בעיה אם המטריצה אינה הפיכה. אך פה נוכל לראות בעיה:

A=LU=(1002101−121)(12100−1000)=(1002101−121)(100000000)(12101?001)A=LU=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 0 & -1 \\ 0 & 0 & 0 \end{pmatrix}=\begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 1 & -\frac{1}{2} & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix}\begin{pmatrix} 1 & 2 & 1 \\ 0 & 1 & {\color{orange}?} \\ 0 & 0 & 1 \end{pmatrix}A=LU=​121​01−21​​001​​​100​200​1−10​​=​121​01−21​​001​​​100​000​000​​​100​210​1?1​​

איך נוכל להחזיר את ה-−1-1−1 שהיה שם ממקודם? לא משנה איזה איבר נשים באלכסון, לא נוכל לקבל גם 000 באלכסון וגם −1-1−1 כפי שהיה במקור. זאת מכיוון שנדרש להכפיל משהו ב-000 ולקבל −1-1−1 מה שלא אפשרי.

משפט

דטרמיננט המטריצה הוא כפולת איברי האלכסון של המטריצה האלכסונית DDD עם סימן שנקבע ע"י הפרמוטציות.

מטריצות סימטריות

הגדרה 3 (מטריצה סימטרית)

מטריצה סימטרית היא מטריצה ריבועית המקיימת A=AtA=A^{t}A=At.

משפט

כל מטריצה ניתנת לפירוק כסכום של מטריצה סימטרית ומטריצה אנטי-סימטרית:

A=A+At2+A−At2A=\frac{A+A^t}{2}+\frac{A-A^t}{2}A=2A+At​+2A−At​

כעת, נלך למטריצות סימטריות והפיכות ונמצא להם פירוק LDVLDVLDV חכם ויפה. נוכל לפרק אותה בדרך הרגילה כך:

PA=LDVPA=LDVPA=LDV

אך במטריצות, סימטריות היא נכס שאנחנו לא רוצים להפסיד. אנחנו נרצה משהו חדש ומרגש כדי שהסימטריות תשמר.
נוכל לדוגמה, כל פעם שאנחנו מחליפים שורה בפרמוטציה, נחליף גם עמודה כדי שהסימטריות תישאר. במילים אחרות זה יהיה:

PAPt=LDVPAP^{t}=LDVPAPt=LDV

בואו נראה למה זה משמר סימטריה:

(PAPt)t=(Pt)tAtPt=↓At=APAPt(PAP^t)^t=(P^t)^tA^tP^t \underset{\begin{matrix} \downarrow \\ A^t=A \end{matrix}}{=}PAP^t(PAPt)t=(Pt)tAtPt↓At=A​=​PAPt

ולכן, לפי הגדרה PAPtPAP^tPAPt סימטרית. לכן, זה מה שנעשה.
כאן היינו רוצים לטעון כי כל מטריצה סימטרית והפיכה מקיימת PAPt=LDLtPAP^t=LDL^tPAPt=LDLt אך זה לא נכון, למה?

דוגמה

A=(0110)  ⟹  PtAP=(0110)(0110)(0110)=(0110)A=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\implies P^tAP=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}A=(01​10​)⟹PtAP=(01​10​)(01​10​)(01​10​)=(01​10​)

נשים לב כי פה, עם PPP ו-PtP^tPt הגענו בדיוק לאותה מטריצה ואין לנו דרך גם לשמור על הסימטריות וגם להחליף בין השורות ולכן לא נוכל לפרק.
לכן, לא כל מטריצה סימטרית והפיכה תאפשר פירוק שכזה.

הערה

פירוק שניתן לעשות בתצורה PAPt=LDLtPAP^t=LDL^tPAPt=LDLt אמור להיות זול פי 2 מפירוק ULULUL רגיל בשל הסימטריה.
כלומר, נדרשות רק n36\frac{n^3}{6}6n3​ פעולות. עם זאת, על מנת להשיג רווח חישובי זה, יש לפעול בדרך אלגוריתמית שונה שנראה בתרגול.

עד כה עבדנו עם כמה סוגי מטריצות:

  • תחילה ראינו כי לכל המטריצות האפשריות קיים פירוק PA=ULPA=ULPA=UL.
  • לאחר מכן ראינו כי למטריצות ריבועיות מתקיים כי UUU משולשת עליונה.
  • הקטנו את התחום שלנו והסתכלנו רק על מטריצות הפיכות, בהן האלכסון שונה מאפס.
  • לאחר מכן, הקטנו עוד יותר את התחום וניסינו להסתכל על מטריצות שלהן קיים פירוק PAPt=LDLtPAP^t=LDL^tPAPt=LDLt.
  • כעת, נעבור לדון במטריצות חיוביות חצי מוגדרות שהינן סימטריות. עבורן פירוק הנ"ל מובטח.

מטריצות חיוביות מוגדרות

הגדרה 4 (מטריצה חיובית מוגדרת)

מטריצה ריבועית וסימטרית KKK הינה חיובית מוגדרת אם היא מקיימת:

∀x‾≠0:  x‾tKx‾>0\forall \underline{x}\neq0:\; \underline{x}^tK\underline{x}>0∀x​=0:x​tKx​>0

נסמן תכונה זו ע"י K≻0K \succ0K≻0.

דוגמה

נרצה לדעת האם המטריצה K=(111111111)K=\begin{pmatrix}1 & 1 & 1\\1 & 1 & 1\\1 & 1 & 1\end{pmatrix}K=​111​111​111​​ היא חיובית מוגדרת. איך נגלה זאת?
עבור הוקטור (−110)\begin{pmatrix}-1\\1\\0\end{pmatrix}​−110​​ יתקיים כי (111111111)(−110)=(000)\begin{pmatrix}1 & 1 & 1\\1 & 1 & 1\\1 & 1 & 1\end{pmatrix}\begin{pmatrix}-1\\1\\0\end{pmatrix}=\begin{pmatrix}0\\0\\0\end{pmatrix}​111​111​111​​​−110​​=​000​​ ואז יתקבל (−110)(111111111)(−110)=0\begin{pmatrix}-1 & 1 & 0\end{pmatrix}\begin{pmatrix}1 & 1 & 1\\1 & 1 & 1\\1 & 1 & 1\end{pmatrix}\begin{pmatrix}-1\\1\\0\end{pmatrix}=0(−1​1​0​)​111​111​111​​​−110​​=0 ולכן התכונה לא מתקיימת.

משפט

מטריצה ריבועית, סימטרית וחיובית מוגדרת KKK הינה בהרכח הפיכה.

הוכחה:
נניח בשלילה כי קיימת מטריצה חיובית מוגדרת לא הפיכה.
אזי, קיים וקטור x‾\underline{x}x​ שאינו טריויאלי שמאפס את המכפלה Kx‾K\underline{x}Kx​. אזי, ברור שיתקיים x‾tKx‾=0\underline{x}^tK\underline{x}=0x​tKx​=0
⇐ המטריצה אינה חיובית מוגדרת - סתירה.
⇐ המטריצה הפיכה.
∎

הגדרה 5 (מטריצה חיובית חצי מוגדרת)

מטריצה ריבועית וסימטרית KKK הינה חיובית חצי מוגדרת אם היא מקיימת

∀x‾≠0:  x‾tKx‾≥0\forall \underline{x}\neq0:\; \underline{x}^tK\underline{x}\geq 0∀x​=0:x​tKx​≥0

נשים לב כי נוכל להציג את התנאי בתצורה אחרת:

(x1x2x3)(111111111)(x1x2x3)=(x1x2x3)(111)(111)(x1x2x3)=((111)(x1x2x3))2≥0\begin{pmatrix} x_{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix}=\begin{pmatrix} x_{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} 1 \\ 1 \\ 1 \end{pmatrix}\begin{pmatrix} 1 & 1 & 1 \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix}=\left(\begin{pmatrix} 1 & 1 & 1 \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix}\right)^2\geq 0(x1​​x2​​x3​​)​111​111​111​​​x1​x2​x3​​​=(x1​​x2​​x3​​)​111​​(1​1​1​)​x1​x2​x3​​​=​(1​1​1​)​x1​x2​x3​​​​2≥0

לכן, מטריצה זו היא חיובית חצי מוגדרת.

דוגמה

עבור אילו ערכי aaa יתקיים כי המטריצה KKK תהיה חיובית מוגדרת או חצי מוגדרת?

K=(1aa1)K=\begin{pmatrix} 1 & a \\ a & 1 \end{pmatrix}K=(1a​a1​)

נתחיל בלפתח את הביטוי הנובע מההגדרה:

(x1x2)(1aa1)(x1x2)=(x1x2)(x1+ax2ax1+x2)=x12+2ax1x2+x22=(x1+ax2)2+(1−a2)x22\begin{pmatrix} x_{1} & x_{2} \end{pmatrix}\begin{pmatrix} 1 & a \\ a & 1 \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \end{pmatrix}=\begin{pmatrix} x_{1} & x_{2} \end{pmatrix}\begin{pmatrix} x_{1}+ax_{2} \\ ax_{1}+x_{2} \end{pmatrix}=x_{1}^2+2ax_{1}x_{2}+x_{2}^2=(x_{1}+ax_{2})^2+(1-a^2)x_{2}^2(x1​​x2​​)(1a​a1​)(x1​x2​​)=(x1​​x2​​)(x1​+ax2​ax1​+x2​​)=x12​+2ax1​x2​+x22​=(x1​+ax2​)2+(1−a2)x22​

עבור a=1a=1a=1 מתקיים:

{(1−a2)x22=0∀x1=−x2:  (x1+ax2)2=0\begin{cases} (1-a^2)x_{2}^2=0 \\ \forall x_{1}=-x_{2}:\; (x_{1}+ax_{2})^2=0 \end{cases}{(1−a2)x22​=0∀x1​=−x2​:(x1​+ax2​)2=0​

ולכן המטריצה היא חיובית חצי מוגדרת. כך גם עבור a=−1a=-1a=−1.
עבור a=12a=\frac{1}{2}a=21​ אז הדרך לאפס את החלק השני היא לאפס את x2x_{2}x2​ ואז, כדי לאפס את החלק הראשון צריך שגם x1x_{1}x1​ יהיה אפס ולכן, המטריצה היא חיובית מוגדרת.

נשים לב כי המטריצה הזו היא:

  • חיובית מוגדרת עבור כל ∣a∣<1|a|<1∣a∣<1 שכן לא ימצא וקטור שיביא את הביטוי הנל ל-000.
  • חיובית חצי מוגדרת עבור ∣a∣=1|a|=1∣a∣=1 כי ניתן לאפס את הביטוי אך לא ניתן להגיע לערך שלילי
  • עבור ∣a∣>1|a|>1∣a∣>1 המטריצה אינה חיובית מוגדרת או חצי מוגדרת.
דוגמה

(d1000d2000d3)\begin{pmatrix} d_{1} & 0 & 0 \\ 0 & d_{2} & 0 \\ 0 & 0 & d_{3} \end{pmatrix}​d1​00​0d2​0​00d3​​​

נרצה לראות מתי המטריצה הנ"ל חיובית מוגדרת/חצי מוגדרת:

(x1x2x3)(d1000d2000d3)(x1x2x3)=(x1x2x3)(d1x1d2x2d3x3)=d1x12+d2x22+d3x32\begin{pmatrix} x_{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} d_{1} & 0 & 0 \\ 0 & d_{2} & 0 \\ 0 & 0 & d_{3} \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix}=\begin{pmatrix} x_{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} d_{1}x_{1} \\ d_{2}x_{2} \\ d_{3}x_{3} \end{pmatrix}=d_{1}x_{1}^2+d_{2}x_{2}^2+d_{3}x_{3}^2(x1​​x2​​x3​​)​d1​00​0d2​0​00d3​​​​x1​x2​x3​​​=(x1​​x2​​x3​​)​d1​x1​d2​x2​d3​x3​​​=d1​x12​+d2​x22​+d3​x32​

נשים לב כי רק עבור d1,d2,d3>0d_{1},d_{2},d_{3}>0d1​,d2​,d3​>0 מתקיים כי המטריצה היא חיובית מוגדרת ואם d1,d2,d3≥0d_{1},d_{2},d_{3}\geq 0d1​,d2​,d3​≥0 המטריצה היא חיובית חצי מוגדרת.

עבור מטריצה אלכסונית מתקיים:

x‾tDx‾=(x1x2…xn)(d11d22⋱dnn)(x1x2⋮xn)=∑k=1ndkkxk2\underline{x}^tD\underline{x}=\begin{pmatrix} x_{1} & x_{2} & \dots & x_{n} \end{pmatrix}\begin{pmatrix} d_{11} \\ & d_{22} \\ & & \ddots \\ & & & d_{nn} \end{pmatrix}\begin{pmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{n} \end{pmatrix}=\sum_{k=1}^n d_{kk}x_{k}^2x​tDx​=(x1​​x2​​…​xn​​)​d11​​d22​​⋱​dnn​​​​x1​x2​⋮xn​​​=k=1∑n​dkk​xk2​
מסקנה

אם כל איברי האלכסון של מטריצה אלכסונית DDD חיוביים ממש, המטריצה תהיה חיובית מוגדרת.
אם האיברים באלכסון אי שליליים, המטריצה חיובית חצי מוגדרת.

הערה

תתכן מטריצה לא סימטרית אשר הינה חיובית מוגדרת.
דוגמה: K=(10a2)K=\begin{pmatrix}1 & 0\\a & 2\end{pmatrix}K=(1a​02​). נבדוק לפי הגדרה:

x‾tKx‾=(xy)(10a2)(xy)=(xy)(xax+2y)=x2+axy+2y2=(x+a2y)2+(2−a24)y2\underline{x}^tK\underline{x}=\begin{pmatrix} x & y \end{pmatrix}\begin{pmatrix} 1 & 0 \\ a & 2 \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}=\begin{pmatrix} x & y \end{pmatrix}\begin{pmatrix} x \\ ax+2y \end{pmatrix}=x^2+axy+2y^2=\left( x+\frac{a}{2}y \right)^2+\left( 2-\frac{a^2}{4} \right)y^2x​tKx​=(x​y​)(1a​02​)(xy​)=(x​y​)(xax+2y​)=x2+axy+2y2=(x+2a​y)2+(2−4a2​)y2   ⟹  ∀∣a∣<8:  K≻0\implies \forall |a|<\sqrt{ 8 }:\; K \succ0⟹∀∣a∣<8​:K≻0

בקורס אנחנו לרוב נדבר רק על מטריצות סימטריות בהקשר של חיוביות מוגדרות.

מטריצות GramGramGram

למטריצות חיוביות חצי מוגדרות יש קשר הדוק לאפיון של בעיות רבות בהנדסה - נראה זאת בהמשך.
נוכל להגדיר מטריצה חיובית חצי מוגדרת וסימטרית באופן הבא:

K=AtAK=A^tAK=AtA

כאשר AAA היא מטריצה כלשהי (לא חייבת להיות ריבועית או סימטרית)
הוכחת סימטריות: (AtA)t=At(At)t=AtA(A^tA)^t=A^t(A^t)^t=A^tA(AtA)t=At(At)t=AtA כנדרש.
נוכיח כי KKK חיובית חצי מוגדרת:

x‾t(AtA)x‾=xtAtAx‾=(Ax)t(Ax)≥↓כשמכפילים וקטורבטרנספוז של עצמומקבלים את סכוםריבועיו ולכן אי-שלילי0\underline{x}^t(A^tA)\underline{x}=x^tA^tA\underline{x}=(Ax)^t(Ax)\underset{\begin{matrix} \downarrow \\ \R{\text{כשמכפילים וקטור}} \\ \R{\text{בטרנספוז של עצמו}} \\ \R{\text{מקבלים את סכום}} \\ \R{\text{ריבועיו ולכן אי-שלילי}} \end{matrix}}{\geq} 0x​t(AtA)x​=xtAtAx​=(Ax)t(Ax)↓כשמכפילים וקטורבטרנספוז של עצמומקבלים את סכוםריבועיו ולכן אי-שלילי​≥​0

מבנה שכזה נקרא מטריצת גראם.

משפט

מטריצת גראם היא בהרכח חיובית חצי מוגדרת.

הוכחה: ראו הנ"ל.
בואו נכיר סימון חדש:

K=AtA  ⟹  x‾tAtAx‾=∣∣Ax‾∣∣22≥0K=A^tA\implies \underline{x}^tA^tA\underline{x}=||A\underline{x}||_{2}^2\geq 0K=AtA⟹x​tAtAx​=∣∣Ax​∣∣22​≥0
הערה

נורמה זו פעולה שלוקחת וקטור ומחזירה סקלר שערכו האורך של הווקטור.
הוא לעולם לא יהיה שלילי.

משפט

תהי K=AtAK=A^tAK=AtA מטריצת גראם כאשר AAA מטריצה כלשהי.
אם עמודותיה של AAA בת"ל, אזי KKK היא חיובית מוגדרת.

הוכחה:
אם עמודות AAA בת"ל, לא קיים וקטור שייתן כי Ax‾=0‾A\underline{x}=\underline{0}Ax​=0​ למעט הוקטור הטריויאלי.
לכן, הביטוי הנ"ל לא יתאפס לכל וקטור x‾≠0\underline{x}\neq0x​=0. לכן, המטריצה חיובית מוגדרת.
∎

משפט

אם CCC מטריצה חיובית מוגדרת ואם AAA מטריצה בעלת עמודות בת"ל, אזי AtCAA^tCAAtCA הינה מטריצה חיובית מוגדרת.

זוהי הכללה של מטריצת גראם שראינו קודם.
הוכחה:

K=AtCA  ⟹  ∀x≠0:  x‾tAtCAx‾z=z‾tCz‾>↓C≻00K=A^tCA\implies \forall x\neq 0:\; \underline{x}^tA^tC \underbracket{A\underline{x}}_{z}=\underline{z}^tC\underline{z} \underset{\begin{matrix} \downarrow \\ C \succ 0 \end{matrix}}{>} 0K=AtCA⟹∀x=0:x​tAtCzAx​​=z​tCz​↓C≻0​>​0

∎

פירוק CholeskyCholeskyCholesky

ראינו כי ניתן לנסות לפרק מטריצות סימטריות והפיכות לתצורה PAPt=LDLtPAP^t=LDL^tPAPt=LDLt וזה לא תמיד עובד.

משפט

מטריצה סימטרית וחיובית מוגדרת KKK היא בהרכח מטריצה רגילה וקיים לה הפירוק הבא ללא צורך בפרמטוציה:

K=LDLtK=LDL^tK=LDLt

ובפירוק זה אלכסון המטריצה DDD חיובי ממש.

הוכחה:

ברורסתאאאם... בקורס זה המשפט מובא ללא הוכחה\begin{matrix} \R{\text{ברור}} \\ \R{\text{סתאאאם... בקורס זה המשפט מובא ללא הוכחה}} \end{matrix}ברורסתאאאם... בקורס זה המשפט מובא ללא הוכחה​

∎

הערה

המשפט נכון גם כאשר מעורבות פרמוטציות, כי גם אז המטריצה נותרת PDPDPD.

בואו נוכיח כי האלכסון חיובי.
הוכחה:
תהי K≻0K \succ 0K≻0 ולכן, K=LDLtK=LDL^tK=LDLt. בנוסף, לפי הגדרה: ∀x≠0:  xtLDLtx>0\forall x\neq 0:\; x^tLDL^tx >0∀x=0:xtLDLtx>0. נסמן xtL=ztx^tL=z^txtL=zt ואז:

∀z≠0:  ztDZ>0\forall z\neq0:\; z^tDZ>0∀z=0:ztDZ>0

לכן, לפי הגדרה, DDD חיובית מוגדרת ולכן, האלכסון שלה חיובי.
∎

כעת, נסתכל על דבר מעניין. נקח תחילה את DDD ונפעיל שורש על כל איברי האלכסון. נסמן זאת D12D^{\frac{1}{2}}D21​ ואז:

K=LDLt=LD12D12LtK=LDL^t=LD^{\frac{1}{2}}D^{\frac{1}{2}}L^tK=LDLt=LD21​D21​Lt

נשים לב כי שתי המטריצות הראשונות הן השחלוף של שתי האחחרונות. נסמנן M,MtM,M^tM,Mt בהתאמה ואז:

K=M⋅MtK=M\cdot M^tK=M⋅Mt

נשים לב בנוסף, כי המטריצה MMM היא משולשת תחתונה. נקרא ל-MMM השורש של KKK.
זהו פירוק צ'ולסקי והוא מעין "הוצאת שורש" משולש למטריצה KKK בעלות של n36\frac{n^3}{6}6n3​ פעולות.