המטרה שלנו היא להראות כי כל מטריצה A ניתנת לפירוק של מטריצה משולשת עליונה כפול מטריצה משולשת תחתונה. לפירוק הזה נקרא LU.
פירוק זה יעיל משום שהוא מאפשר פתרון מערכת משוואות, חישוב דטרמיננט של מטריצה וקביעת דרגתה של מטריצה הרבה יותר בקלות.
תזכורות
אלימינצית גאוס
אנו עושים שימוש בפעולות בסיסיות כדי לפתור ממ"ל ע"י פעולות על המטריצה המורחבת [A,b] של הבעיה.
נביט שוב במטריצות האלו. נשים לב כי הן בעל מבנה מיוחד:
כל איברי אלכסונן הם 1-ים. (זאת כי לכל שורה פעולתנו משמרת את השורה ומוסיפה/מחסירה לה שורה אחרת המוכפלת בסקלר)
אלה מטריצות משולשות תחתונות (כי תמיד אנו מצרים לשורה שורות מעליה)
מטריצות אלו נקראות מטריצות משולשות תחתונות בסיסיות.
הערה
נשים לב כי לכל מטריצה שכזו במקרה הזה בלבד יש רק שינוי אחד ל-I וזו בגלל שכל מטריצה פה בלבד טיפלה בנושא אחד בלבד.
נסתכל שוב על המטריצה הזו ונחשב את Ei−1 לכל אחת מהן. במקום ללכת בדרך הרגילה, נוכל לראות טריק: מכיוון שהמטריצה הזו היא בעצם אפקט, אנחנו הופכים את ההאפקט ומקבלים את ההפיכה.
נשים לב כי גם הן משולשות תחתונות בסיסיות כמו המטריצות ממקודם.
עד כה, לקחנו ממ"ל Ax=b והמרנו אותה במערכת השקולה לה E3E2E1Ax=E3E2E1b.
מה קרה למטריצה בסוף? קיבלנו מטריצה משולשת עליונה 1002201−12.5 כפול מטריצות משולשות תחתונות בסיסיות. נסמן אותה ב-U (כן, זה אותו U של ה-LU)
הערה (מדוע המערכות שקולות)
כיוון שהמטריצות שהכפלנו ריבועיות והפיכות.
E3E2E1Ax=E3E2E1b⇓Ux=E3E2E1b⇓b=(E3E2E1)−1Ux↓לפי משפט מאלגברה=L1L2L3Ux
הערה
המכפלה L=L1L2L3 מתקבלת ללא חישובים כלל(מדוע??)
נשים לב כי כפל של כל המטריצות המשולשות תחתונות בסיסיות נותן לנו עוד מטריצה משולשת תחתונה בסיסית:
האם יכול להיות מצב שלמערכת משוואות זו אין פתרון? לא! זאת מכיוון ש-∣A∣=1 ולכן, לפי משפט, המטריצה הפיכה ולכן קיים פתרון.
למערכת זו קל למצוא פתרון ולכן מאוד קל למצוא את מה שצריך. כעת, נמצא את מה שאנחנו צריכים ע"י פתירה בהחלפה אחורית - מתחילים בחישוב xn ואז ממשיכים עד ל-x1.
כל איברי האלכסון שונים מאפס(מכיוון שהמטריצה רגילה) ולכן הדטרמיננטה אינה אפס ולכן המטריצה הפיכה ובטוח קיים פתרון.
מסקנה (לסיכום)
בהינתן מערכת משוואת Ax=b עם מטריצה A רגילה נוכל לבחור באחת משתי האפשרויות הבאות:
חישוב פירוק A=UL ואז חישוב הפתרון עי"י החלפה קדמית ואז אחורית.
חישוב המטריצה ההפיכה A−1 ואז חישוב הפתרון ע"י A−1b.
הפתרון הראשון עדיף בהרבה שכן הוא הרבה יותר קל והרבה פחות פרוץ לטעויות.
כמות החישובים בפירוק UL
חישוב המכפלה הסופית:
כמות החישובים הנדרשים לחישוב המכפלה של מטריצה בגודל n×n בוקטור היא n2 פעולות.
כמות החישובים הנדרשים לתהליך החלפה קדמי/אחורי הוא 21n2 כאשר אנו סופרים רק מכפלות וחלוקות כשווי מעמד
כשמחשבים רואים שמציאת הפתרון אחרי חישוב A−1 זהה לחישוב הפתרון לאחר שמוצאים פירוק LU. לכן, ההבדל ביעילות יבוא בהכרח ממציאת LU ומציאת A−1.
מספר הפעולות הנדרש לפעולות LU הוא 3n3 פעולות. (אולי נקבל את זה בתרגיל בית להוכחה)
כמה חישובים נדרשים לחישוב A−1?
נדרש לפתור את כל המערכות הללו על מנת למצוא את A−1. נשים לב שכדי לעשות את זה נוכל לעשות:
לקחת את A ולבצע לו פירוק LU וזה 3n3 פעולות
לכל אחת מ-n המערכות נבצע תהליך החלפה אחורית/קדמית - n3
ולכן, בסה"כ חישוב הפתרון הוא 43n3.
הוא עובד בעצם פי 4 יותר קשה מאשר פירוק ה-LU לבדו.
הערה
אמנם הסיבוכיות זהה Θ(n3) אבל בעולם האמיתי יש הבדל עצום בזמן.
בנוסף, יותר כדאי לפתור עם LU מכיוון שיש יותר יציבות אלגברית או משהו כזה שהוא לא הסביר ואמר שקשה להבין.
פרמוטציות
דוגמה
תהי A=021360114∈R3×3. נשים לב כי היא לא רגילה מכיוון שלא קיימת L כנדרש.
נדרש לשנות מעט את המטריצה שכן איבר האפס a11 לא יכול לשמש כאיבר ציר ולכן התהליך נתקע.
כל מה שעלינו לעשות הוא לשנות את סדר השורות וזאת ע"י פעולת הפרמוטציה:
PA=010100001021360114=201630114
יש פה מקום להתלבט האם להחליף עם השנייה או עם השלישית את השורה הראשונה. נשים לב כי נקבל פתרון שונה לכל אחת מהאופציות.
כעת נמשיך כרגיל:
כעת נמצא את L. נתחיל מהתכונות שאותן אנו יודעים: 1□□01□001
כעת, נמלא את שאר התאים:
L=102101−1001
נשים לב כי לבסוף קיבלנו פה PA=LU.
במקרה הכללי, תהליך הפירוק "יזרום" כרגיל, ובכל פעם שנתקל באיבר ציר בעייתי(מאופס), נחליף את השורה בה הוא נמצא באחת השורות מתחתיו.
אנו לא רוצים לשתול באמצע המטריצות הבסיסיות איזו P שכזו, מה נוכל לעשות מבלי לעשות את הפירוק פעמיים? הוא אמר שהוא לא נכנס לזה ושעושים את זה עם שמירת פוינטר לכל שורה.
הערה
בשל החופש באיזו שורה להחליף, אין יותר יחידות בבנית הפירוק
מהתיאור הנ"ל נדמה שהפעולות הבסיסיות והפרמוטציות יתערבבו ללא סדר. בפועל, יש לגלות את כל ההחלפות הנחוצות ולבצען בתחילת התהליך בלבד!
הגדרה 2 (מטריצת פרמוטציה)
מטריצת פרמוטציה היא מטריצת יחידה ששורותיה עורבלו.
בכל עמודה במטריצה זו איבר אחד שונה מאפס וערכו 1 וכנ"ל לגבי השורות.
דוגמה (מציאת פירוק UL)
נמצא כעת פירוק UL למטריצה A=0242214231524162.
הצעד הראשון שנעשה יהיה פרמוטציה שכן 0 לא יכול להיות איבר מוביל. P1A=01001000001000010242214231524162=2042124213521462
כעת, נוכל לבצע עליה פעולות אלמנטריות באמצעות מטריצות בסיסיות:
נשים לב כי פה הגענו לבעיה - יש לנו שתי שורות זהות. מה שיגרום לכך שלא נוכל להפוך את המטריצה למשולשת.
מה שאנחנו צריכים לעשות עכשיו זה לכאורה להתחיל מהתחלה כך:
נשים לב כי הפעולות שעשינו הן בדיוק אותן פעולות כמו מקודם - רק מוזזות בין השורות לפי הפרמוטציה החדשה שעשינו.
איך זה יעזור לנו?
כשנכתוב את האלגוריטם שלנו, אנחנו נחזיק מערכת עם מצביעים לשורות. ומאתה והילך אנחנו נעבוד עם פוינטרים לשורות. ותוך כדי ריצה נוכל לבצע את הפרמוטציות האלו.
הערה
אין אנו נדרש לכתוב את הקוד הזה לכן זה בגדר העשרה חלקית.
כל מטריצה ריבועית A ניתנת לפירוק מהצורה PA=LU כאשר
P מטריצת פרמוטציה המחליפה סדר שורות
L מטריצה משולשת תחתונה בסיסית
U מטריצה משולשת עליונה כלשהי
הערה (האם העובדה שאין יחידות משפיעה על הפתרון?)
ברמה המתמטית תיאורתית זה לא אמור להשפיע. אבל בפועל, יכול להיות שיהיו קצת סטיות אחרות ולכן הפתרון יהיה קצת שונה.
בהינתן המערכת Ax=b והפירוק PA=LU, כיצד יחושב x?
PAx=PbLUx=Pb
נפתור מערכת משוואות באמצעות החלפה קדמית: Ly=Pb ואז נפתור באמצעות החלפה אחורית Ux=y.
חישוב דטטרמיננט בעזרת פירוק LU
נזכר שפירוק UL נראה כך:
PA=LU
נוכל לקחת את הדטרמיננט לשני האגפים:
∣P∣∣A∣=∣PA∣=∣LU∣=∣U∣∣L∣
לפי משפט מאלגברה: הדרטרמיננטה של מטריצה משולשת היא מכפלת איברי האלכסון.
⎩⎨⎧∣P∣=±1∣L∣=1∣U∣=∏k=1nukk⟹∣A∣=±u11u22…unn
משפט
עבור מטריצה ריבועית A עם הפירוק PA=LU, אם כל איברי האלכסון הראשי של U שונים מאפס, אזי A הפיכה.
באמצעות פירוק LU ניתן לחשב את הדטרמיננט של מטריצה בסיבוכיות 3n3 (כאשר הזמן מגיע ממציאת הפירוק ולא מהחישוב שלאחריו)
החלופה היא נוסחת המינורים של קרמר שדורשת n! פעולות ולכן פירוק LU עדיף מאוד.
פירוק LU למטריצות לא ריבועיות
טענה
כל מטריצה ניתנת לפירוק LU (עם פרמוטציה), גם אם אינה ריבועית
כעת, נחקור ונראה כי הטענה הזו נכונה.
נתחיל ממטריצה לא ריבועית בלי צורך בפרמוטציות. נכפיל אותה במטריצות בסיסיות כך:
כעת, נתחיל למצוא את הבסיסיות שלב אחר שלב:
נמשיך כך ולבסוף נגיע ליצור הזה:
נוכל כעת לחלק את המטריצות הללו לשני בלוקים ולהתייחס לכפל ככה:
נשים לב כי U2 היא מטריצת האפס ולכן:
A=L1U1+L2⋅0=L1U2
כעת, נסתכל גם על מטריצה עם פרמוטציות:
PA=L1U2
(סליחה, לא היה לי כח לצייר עוד מלא מטריצות)
משפט
כל מטריצה ניתנת לפירוק LU (עם פרמוטציה) גם אם אינה ריבועית
הערה
נראה איך נראת מטריצה שהינה רחבה יותר מאשר ארוכה:
שיטות לבחירת Pivot מוצלח
ישנם הרבה מצבים שבהם נרצה להחליף את הסדר השורות בחוכמה. נתחיל בדוגמה:
שוב פעם יש בעיה. למה זה קרה? כי בפנים יש מספר ענק נוסף.
הערה (אלגוריתם fullpivoting)
במקום לבדוק רק למטה, אנחנו נבדוק למטה וימינה בכל הבלוק. נבדוק מה המספר הכי גדול בבלוק ואז נזיז אותו לשורה והעמודה שצריך כדי שהוא יהיה ה-pivot.
במקום לבדוק רק למטה, אנחנו נבדוק למטה וימינה בכל הבלוק. נבדוק מה המספר הכי גדול בבלוק ואז נזיז אותו לשורה והעמודה שצריך כדי שהוא יהיה ה-pivot.
PAQ=LU
כאשר P היא פרמוטציה לשורות ו-Q היא פרמוטציה לעמודות.
הערה (להערה)
זה אלוגריתם לא מומלץ שכן יש לו מחיר עצום!
פירוק LDLT ו-Cholesky
פירוק LDV
ראינו כי כל מטריצה A ניתנת לפירוק מהצורה PA=LU. כאשר אנו עוסקים במטריצות ריבועיות, אם כל איברי האלכסון של U שונים מאפס, אנו יודעים כי המטריצה הפיכה(כי הדטרמיננטה שלה שונה מ-0).
משתי עובדות אלו נובע הפירוק הבא:
משפט
כל מטריצה A ריבועית והפיכה ניתנת לפירוק מהצורה PA=LDV כאשר
P היא מטריצת פרמוטציה המחליפה סדר שורות
L מטריצה משולשת תחתונה בסיסית
V מטריצה משולשת עליונה בסיסית
D מטריצה אלכסונית בה כל איברי האלכסון שונים מאפס.
דוגמה
ראינו בתחילת ההרצאה את הדוגמה הזו:
A=LU=12101−210011002201−12.5
כעת, נרצה שגם המשולשת העליונה תהיה בסיסית. לכת, נבצע את זה:
איך נוכל להחזיר את ה-−1 שהיה שם ממקודם? לא משנה איזה איבר נשים באלכסון, לא נוכל לקבל גם 0 באלכסון וגם −1 כפי שהיה במקור. זאת מכיוון שנדרש להכפיל משהו ב-0 ולקבל −1 מה שלא אפשרי.
משפט
דטרמיננט המטריצה הוא כפולת איברי האלכסון של המטריצה האלכסונית D עם סימן שנקבע ע"י הפרמוטציות.
מטריצות סימטריות
הגדרה 3 (מטריצה סימטרית)
מטריצה סימטרית היא מטריצה ריבועית המקיימת A=At.
משפט
כל מטריצה ניתנת לפירוק כסכום של מטריצה סימטרית ומטריצה אנטי-סימטרית:
A=2A+At+2A−At
כעת, נלך למטריצות סימטריות והפיכות ונמצא להם פירוק LDV חכם ויפה. נוכל לפרק אותה בדרך הרגילה כך:
PA=LDV
אך במטריצות, סימטריות היא נכס שאנחנו לא רוצים להפסיד. אנחנו נרצה משהו חדש ומרגש כדי שהסימטריות תשמר.
נוכל לדוגמה, כל פעם שאנחנו מחליפים שורה בפרמוטציה, נחליף גם עמודה כדי שהסימטריות תישאר. במילים אחרות זה יהיה:
PAPt=LDV
בואו נראה למה זה משמר סימטריה:
(PAPt)t=(Pt)tAtPt↓At=A=PAPt
ולכן, לפי הגדרה PAPt סימטרית. לכן, זה מה שנעשה.
כאן היינו רוצים לטעון כי כל מטריצה סימטרית והפיכה מקיימת PAPt=LDLt אך זה לא נכון, למה?
דוגמה
A=(0110)⟹PtAP=(0110)(0110)(0110)=(0110)
נשים לב כי פה, עם P ו-Pt הגענו בדיוק לאותה מטריצה ואין לנו דרך גם לשמור על הסימטריות וגם להחליף בין השורות ולכן לא נוכל לפרק.
לכן, לא כל מטריצה סימטרית והפיכה תאפשר פירוק שכזה.
הערה
פירוק שניתן לעשות בתצורה PAPt=LDLt אמור להיות זול פי 2 מפירוק UL רגיל בשל הסימטריה.
כלומר, נדרשות רק 6n3 פעולות. עם זאת, על מנת להשיג רווח חישובי זה, יש לפעול בדרך אלגוריתמית שונה שנראה בתרגול.
עד כה עבדנו עם כמה סוגי מטריצות:
תחילה ראינו כי לכל המטריצות האפשריות קיים פירוק PA=UL.
לאחר מכן ראינו כי למטריצות ריבועיות מתקיים כי U משולשת עליונה.
הקטנו את התחום שלנו והסתכלנו רק על מטריצות הפיכות, בהן האלכסון שונה מאפס.
לאחר מכן, הקטנו עוד יותר את התחום וניסינו להסתכל על מטריצות שלהן קיים פירוק PAPt=LDLt.
כעת, נעבור לדון במטריצות חיוביות חצי מוגדרות שהינן סימטריות. עבורן פירוק הנ"ל מובטח.
מטריצות חיוביות מוגדרות
הגדרה 4 (מטריצה חיובית מוגדרת)
מטריצה ריבועית וסימטרית K הינה חיובית מוגדרת אם היא מקיימת:
∀x=0:xtKx>0
נסמן תכונה זו ע"י K≻0.
דוגמה
נרצה לדעת האם המטריצה K=111111111 היא חיובית מוגדרת. איך נגלה זאת?
עבור הוקטור −110 יתקיים כי 111111111−110=000 ואז יתקבל (−110)111111111−110=0 ולכן התכונה לא מתקיימת.
משפט
מטריצה ריבועית, סימטרית וחיובית מוגדרת K הינה בהרכח הפיכה.
הוכחה:
נניח בשלילה כי קיימת מטריצה חיובית מוגדרת לא הפיכה.
אזי, קיים וקטור x שאינו טריויאלי שמאפס את המכפלה Kx. אזי, ברור שיתקיים xtKx=0
⇐ המטריצה אינה חיובית מוגדרת - סתירה.
⇐ המטריצה הפיכה. ∎
הגדרה 5 (מטריצה חיובית חצי מוגדרת)
מטריצה ריבועית וסימטרית K הינה חיובית חצי מוגדרת אם היא מקיימת
ולכן המטריצה היא חיובית חצי מוגדרת. כך גם עבור a=−1.
עבור a=21 אז הדרך לאפס את החלק השני היא לאפס את x2 ואז, כדי לאפס את החלק הראשון צריך שגם x1 יהיה אפס ולכן, המטריצה היא חיובית מוגדרת.
נשים לב כי המטריצה הזו היא:
חיובית מוגדרת עבור כל ∣a∣<1 שכן לא ימצא וקטור שיביא את הביטוי הנל ל-0.
חיובית חצי מוגדרת עבור ∣a∣=1 כי ניתן לאפס את הביטוי אך לא ניתן להגיע לערך שלילי
עבור ∣a∣>1 המטריצה אינה חיובית מוגדרת או חצי מוגדרת.
דוגמה
d1000d2000d3
נרצה לראות מתי המטריצה הנ"ל חיובית מוגדרת/חצי מוגדרת: