הפתרון הקרוב ביותר
מתמטיקה שימושית ו־AᵀA
Applied Mathematics and AᵀA
הביטוי AᵀA מופיע בכל מקום שבו מודדים שגיאה, אנרגיה או שינוי. נתחיל מנתונים שאינם יושבים בדיוק על קו, נבנה את ההקרנה הקרובה ביותר, נפרק מטריצה בעזרת SVD, ונראה כיצד אותה תבנית הופכת נגזרת להפרשים, תנאי שפה למערכת, ומשוואת לפלס לרשת של מאזנים.
מפת הפרק
5 תחנות בדרך
5 יחידות לימוד עצמאיות · כ־6 שעות ו־10 דקות לשיעורים ולתרגול
- 7.1יחידת לימוד70 דקות
ריבועים פחותים כהקרנה
שאלה 1: מה ננסה להבין?כאשר Ax=b אינה פתירה, מחליפים את b בהיטל p=Ax̂ הקרוב ביותר בתוך C(A). השארית e=b−p מאונכת לכל עמודה, ומכאן נובעות המשוואות הנורמליות.
לשיעור ← - 7.2יחידת לימוד85 דקות
SVD — מארבע תנועות אל אנרגיה
שאלה 2: מה ננסה להבין?מתחילים ממטריצות מלבניות ומעבר בין ממדים, מפרקים כל פעולה לסיבוב–מתיחה–שינוי ממד–סיבוב, ורק אז מחברים את התמונה ל־AᵀA, לאנרגיה, לדרגה ולרגישות.
לשיעור ← - 7.3יחידת לימוד70 דקות
תנאי שפה והבדלים סופיים
שאלה 3: מה ננסה להבין?בבעיית שפה שני ערכים בקצות התחום מחליפים את נתוני ההתחלה. מטריצת הפרשים ראשונים A יוצרת את K=AᵀA, קירוב סימטרי ל־−u″.
לשיעור ← - 7.4יחידת לימוד70 דקות
משוואת לפלס על רשת
שאלה 4: מה ננסה להבין?המשוואה uₓₓ+uᵧᵧ=0 הופכת לכלל ממוצע: כל צומת פנימי שווה לממוצע ארבעת שכניו. ערכי השפה הם שמניעים פתרון לא־קבוע.
לשיעור ← - 7.5יחידת לימוד75 דקות
לפלסיאן, הארקה ורשתות
שאלה 5: מה ננסה להבין?מטריצת incidence מחשבת הפרשי פוטנציאל; L=AᵀCA מחבר אותם למאזן זרימות. L סינגולרית עד שמקבעים פוטנציאל אחד בכל רכיב קשיר.
לשיעור ←
ביד, שלב אחר שלב
דוגמת עוגן: מנתונים לא עקביים אל הקרנה
התאימו את הקו C+Dx למדידות (0,4),(1,1),(2,0),(3,1), ופרשו את התוצאה כהקרנה של b על C(A).
- 1
קו C+Dx היה דורש ארבע משוואות בשני נעלמים. בונים A=[[1,0],[1,1],[1,2],[1,3]] ו־b=(4,1,0,1).
- 2
המערכת Ax=b אינה עקבית: שום קו ישר אינו עובר דרך ארבע הנקודות. לכן מחפשים p=Ax̂ הקרוב ביותר ל־b.
- 3
השארית e=b−Ax̂ צריכה להיות מאונכת לשתי עמודות A, ולכן Aᵀe=0.
- 4
מציבים e=b−Ax̂ ומקבלים את המשוואות הנורמליות AᵀA x̂=Aᵀb.
- 5
כאן AᵀA=[[4,6],[6,14]] ו־Aᵀb=(6,4). פתרון המערכת נותן x̂=(C,D)=(3,−1).
- 6
הקו הוא 3−x, ולכן p=(3,2,1,0) והשארית e=(1,−1,−1,1).
- 7
בודקים: סכום השאריות הוא 0 וגם 0·1+1·(−1)+2·(−1)+3·1=0. אלה בדיוק שני רכיבי Aᵀe.
x̂=(3,−1), p=(3,2,1,0), e=(1,−1,−1,1), Aᵀe=0, ‖e‖²=4ניבוי, ניסוי והסבר
מעבדת חקר: מהתאמה וה־SVD אל תנאי שפה ולפלסיאן של רשת
התחילו מתחנה אחת, נבאו את התוצאה ורק אז שנו פרמטר. בכל תחנה תקבלו משוב וקישור לשיעור שעליו היא בנויה.
פרק 7 · ארבע תחנות חקר
מהקרנה ואנרגיה אל שדות ורשתות
נבאו, בדקו והסבירו: התאמה לנתונים, אנרגיה ו־SVD, תנאי שפה ומשוואת לפלס, ומאזן זרימות בגרף.
מעבדת פרק 7 מוכנה. תחנה 1 פעילה.
המעבדה עוקבת אחרי AᵀA בארבע הופעות: התאמה לנתונים, אנרגיה ומתיחות, הפרשים על רשת, ומאזן זרימות בגרף. בכל תחנה מנבאים לפני שינוי הפרמטר.
תחנה 1 מתוך 4
מתי קו הוא באמת הקרוב ביותר?
- המטרה
- לראות את Aᵀe=0 ולא רק את צורת הקו: השאריות צריכות להיות מאונכות לשני כיווני המודל.
- המשימה
- נבאו, הזיזו שיפוע וחיתוך, והשוו SSE ואת שני רכיבי Aᵀe לקו האופטימלי.
- SSE נוכחי
- 5.5
- SSE מינימלי
- 4
- Aᵀe נוכחי
- (1, −1)
- (C,D) מיטביים
- (3, −1)
עכשיו בקוד
אותו רעיון, כאלגוריתם
הקוד קצר בכוונה: כל שורה מקבילה לצעד בחישוב הידני.
מהרעיון אל הקוד
מימוש חישובי
function fitLine(points) {
const meanX = points.reduce((sum, [x]) => sum + x, 0) / points.length;
const meanY = points.reduce((sum, [, y]) => sum + y, 0) / points.length;
const denominator = points.reduce((sum, [x]) => sum + (x-meanX)**2, 0);
if (denominator === 0) throw new Error("x values must not all be equal");
const slope = points.reduce(
(sum, [x, y]) => sum + (x-meanX)*(y-meanY), 0,
) / denominator;
const intercept = meanY-slope*meanX;
const predicted = points.map(([x]) => intercept+slope*x);
const residuals = points.map(([, y], i) => y-predicted[i]);
const normalResidual = [
residuals.reduce((sum, value) => sum+value, 0),
residuals.reduce((sum, value, i) => sum+points[i][0]*value, 0),
];
return { intercept, slope, predicted, residuals, normalResidual,
sse: residuals.reduce((sum, value) => sum+value**2, 0) };
}
const answer = fitLine([[0,4],[1,1],[2,0],[3,1]]);
console.log(answer);def fit_line(points):
mean_x = sum(x for x, _ in points) / len(points)
mean_y = sum(y for _, y in points) / len(points)
denominator = sum((x-mean_x)**2 for x, _ in points)
if denominator == 0:
raise ValueError("x values must not all be equal")
slope = sum((x-mean_x)*(y-mean_y) for x, y in points) / denominator
intercept = mean_y-slope*mean_x
predicted = [intercept+slope*x for x, _ in points]
residuals = [y-predicted[i] for i, (_, y) in enumerate(points)]
normal_residual = [
sum(residuals),
sum(points[i][0]*value for i, value in enumerate(residuals)),
]
return {"intercept": intercept, "slope": slope,
"predicted": predicted, "residuals": residuals,
"normal_residual": normal_residual,
"sse": sum(value**2 for value in residuals)}
print(fit_line([(0,4),(1,1),(2,0),(3,1)]))בדיקת שליטה מצטברת
האם כל פרק 7 יושב במקום?
חמש שאלות קצרות בודקות את מסלול הפרק: הקרנה, אנרגיה ו־SVD, הבדלים סופיים, לפלס ורשתות. לאחר הבדיקה תקבלו הסבר וקישור לשיעור המתאים.
מקורות להעמקה בלבד — הפרק באתר עומד בפני עצמו
מדריך המרצים: עמ׳ 191–215. הפניות מדויקות לספר מופיעות בתחתית כל שיעור.