מרחבים ותתי־מרחבים
אי־תלות, בסיס וממד
Independence, Basis and Dimension
מפרידים בין יצירה ללא יתירות לבין תלות לינארית, בוחרים בסיס ומוכיחים שמספר וקטורי הבסיס קבוע ושווה לממד.
- 1נקודת פתיחהמה כבר ידוע ומה השאלה?
- 2ניבוימה יקרה במקרה הפשוט?
- 3המחשהמה באמת משתנה בתמונה?
- 4ניסוח והצדקהשם, נוסחה ולמה היא נכונה
- 5בדיקהדוגמה, תרגול ומשוב
- 6העברהמקרה חדש והמשך המסלול
שאלה לפני נוסחה
מה אנחנו מנסים לראות?
להבחין בין יצירת מרחב לבין היעדר יתירות, להגדיר בסיס וממד, ולתרגם pivots לדרגה, לקואורדינטות יחידות ולבסיסים של מרחבי העמודות, השורות והאפס.
Span שואל אם יש מספיק כיוונים כדי להגיע לכל נקודה; independence שואל אם אף כיוון אינו משוכפל באמצעות האחרים. בסיס נמצא בדיוק באיזון: מספיק כיוונים כדי להגיע לכל מקום, אך אף כיוון אינו מיותר.
לפני ההמחשה: קראו רק את הכותרת “שני כיוונים מספיקים; השלישי משוכפל”. מה לדעתכם ישתנה, מה יישאר קבוע, ואיזה סימן בתמונה יוכל להפריך את הניבוי?
לראות לפני שמחשבים · המקרה הפשוט ביותר
שני כיוונים מספיקים; השלישי משוכפל
משמאל מופיעים שלושה וקטורים, ובהם a₃=a₁+a₂; מימין נשארים רק שני וקטורי ה־pivot. שני הצדדים פורשים אותו מישור.
מה כדאי לגלות: זהו את החץ המקווקו המיותר משמאל. הסרתו אינה משנה את ה־span, אבל מבטלת את האפשרות לפצות שינוי במקדם שלו באמצעות שני המקדמים האחרים — ולכן בבסיס הקואורדינטות יחידות.
אחרי שראינו
בסוף השיעור תוכלו
- לבדוק אם רשימת וקטורים בלתי תלויה באמצעות המשוואה Uc=0.
- להכריע אם רשימה היא בסיס על ידי בדיקת span ואי־תלות יחד.
- למצוא ממד ודרגה מתוך מספר ה־pivots ולחלץ בסיסים נכונים מ־A ומ־RREF(A).
- לחשב קואורדינטות יחידות ביחס לבסיס ולהבדיל בין דרגה מדויקת לדרגה מספרית.
נותנים שמות למה שראינו
מושגים שנשתמש בהם
- תלות לינארית
- קיום מקדמים שאינם כולם אפס כך ש־c₁v₁+⋯+cₖvₖ=0.
- אי־תלות לינארית
- הצירוף היחיד ששווה לאפס הוא הצירוף הטריוויאלי שבו כל המקדמים אפס.
- קבוצה פורשת
- רשימת וקטורים שה־span שלה שווה למרחב הנדון.
- בסיס
- רשימה שגם פורשת את המרחב וגם בלתי תלויה.
- ממד
- מספר הווקטורים בכל בסיס של המרחב.
- דרגה rank
- מספר ה־pivots של A; שווה לממד מרחב העמודות ולממד מרחב השורות.
- קואורדינטות ביחס לבסיס
- המקדמים היחידים שמייצגים וקטור כצירוף של וקטורי הבסיס.
- בסיס מרחב השורות
- השורות הלא־אפסיות של RREF(A), המייצגות את כל הצירופים של שורות A.
- דרגה מדויקת/מספרית
- דרגה מדויקת נקבעת באפסים אלגבריים; דרגה מספרית מסווגת שאריות קטנות כאפס ביחס לסף.
מהמילים אל הסימנים
כותבים את הפעולה שכבר ראינו
פתחו את הנוסחה רק אחרי שאתם יכולים לומר במילים מה כל פעולה אמורה לעשות. בשלב הבא נצדיק אותה צעד אחר צעד.
להצגת נוסחת המפתח
קראו כל סימן כפעולה, לא כמשהו שצריך לשנןdim C(A)=rank(A)=r; r+(n−r)=nמרכיבים את הפעולות
מהתמונה אל הנוסחה — הגזירה, בלי לדלג על הצעדים
הופכים רשימת וקטורים למטריצה
מסדרים את הווקטורים כעמודות U. אז כל צירוף שלהם הוא Uc, והשאלה אם הם פורשים יעד b היא בדיוק שאלת הפתירות Uc=b.
U=[u₁ ⋯ uₖ], span{uᵢ}=C(U)בודקים אי־תלות דרך האפס
אם Uc=0 מאפשר c≠0, אחד הווקטורים ניתן לביטוי באמצעות האחרים. אם c=0 הוא הפתרון היחיד, אין יתירות והרשימה בלתי תלויה.
{uᵢ} independent ⇔ N(U)={0}עוצרים לחשוב: כל עמודה צריכה pivot; משתנה חופשי יוצר מיד יחס תלות.
מחברים שני תנאים לבסיס
פרישה לבדה יכולה לכלול וקטורים מיותרים, ואי־תלות לבדה יכולה לכלול מעט מדי כיוונים. בסיס מקיים את שני התנאים בעת ובעונה אחת.
basis = spanning + independentממד סופר כיוונים חיוניים
כל הבסיסים של אותו מרחב מכילים אותו מספר וקטורים. המספר הזה הוא הממד, לא מספר הרכיבים בכל וקטור ולא מספר הווקטורים ברשימה מקרית.
dim(V)=number of vectors in a basis of Vה־pivots נותנים את הדרגה
כל pivot מסמן כיוון בלתי תלוי אחד. לכן r pivots נותנים dim C(A)=r וגם dim C(Aᵀ)=r; עם n עמודות מתקבל dim N(A)=n−r.
rank(A)=dim C(A)=dim C(Aᵀ), nullity=n−rלוקחים כל בסיס מן המקום הנכון
בסיס ל־C(A) מתקבל מעמודות A המקורית במיקומי ה־pivots. בסיס למרחב השורות מתקבל מן השורות הלא־אפסיות של RREF(A). פתרונות מיוחדים נותנים בסיס ל־N(A).
C(A): original pivot columns; C(Aᵀ): nonzero RREF rowsבסיס מבטיח קואורדינטות יחידות
אם v קיבל שתי הצגות, חיסורן נותן צירוף אפס של וקטורי הבסיס. אי־תלות כופה שכל הפרשי המקדמים אפס.
Bc=v=Bd ⇒ B(c−d)=0 ⇒ c=dמסמנים את אופי הדרגה
בתרגיל סמלי משתמשים בשוויון מדויק. בנתוני מדידה דרגה מספרית תלויה בסף ובסקלה; ערך סינגולרי קטן עשוי לתאר כיוון חלש, לא אפס מתמטי.
numerical rank = #{directions above tolerance}עוצרים לחשוב: דיווח מקצועי כולל את הסף או את שיטת ההערכה, ולא רק את המספר r.
עכשיו רואים את השיטה בפעולה
דוגמאות פתורות, צעד אחר צעד
רשימה פורשת אך תלויה
נתונים u₁=(1,0,1), u₂=(0,1,1), u₃=(1,1,2). מצאו בסיס למרחב שהם פורשים.
מבחינים ש־u₃=u₁+u₂, ולכן u₁+u₂−u₃=0 הוא יחס תלות לא־טריוויאלי.
הסרת u₃ אינה משנה את ה־span, כי כל שימוש בו אפשר להחליף ב־u₁+u₂.
u₁ ו־u₂ אינם כפולות זה של זה, ולכן הם בלתי תלויים.
מכאן {u₁,u₂} גם פורשת את המישור וגם בלתי תלויה: זהו בסיס והממד 2.
שלושה וקטורים יכולים לפרוש מישור, אך בסיס המישור מכיל שני כיוונים חיוניים בלבד.
B={u₁,u₂}, dim span{u₁,u₂,u₃}=2קואורדינטות תלויות בבסיס
מצאו את קואורדינטות v=(4,2) ביחס לבסיס B=((1,1),(1,−1)).
כותבים α(1,1)+β(1,−1)=(4,2).
השוואת רכיבים נותנת α+β=4 ו־α−β=2.
חיבור המשוואות נותן 2α=6 ולכן α=3; מכאן β=1.
בדיקה: 3(1,1)+1(1,−1)=(4,2).
הווקטור הגאומטרי לא השתנה, אך המספרים שמתארים אותו ביחס ל־B הם (3,1).
[v]ᴮ=(3,1)וקטורים אינם חייבים להיות רשימות מספרים
מצאו בסיס למרחב D של מטריצות אלכסוניות 2×2, והשוו למרחב F=span{cos x,cos 2x} של פונקציות.
כל מטריצה ב־D היא [[a,0],[0,b]]=aE₁₁+bE₂₂.
אם aE₁₁+bE₂₂=0, השוואת שני איברי האלכסון נותנת a=b=0; לכן {E₁₁,E₂₂} בלתי תלויה ופורשת את D.
ב־F כל פונקציה היא αcos x+βcos 2x לפי ההגדרה, ולכן שתי הפונקציות פורשות את F.
הן בלתי תלויות: אם αcos x+βcos 2x היא פונציית האפס, הצבה ב־x=0 וב־x=π/2 נותנת α+β=0 ו־−β=0, ולכן α=β=0.
בשני המקרים פעולות הווקטור הן חיבור וכפל בסקלר; סוג האובייקט משתנה אך מושגי בסיס וממד נשארים זהים.
dim D=2, dim F=2איפה זה פוגש את העולם
יישום
במערכת חיישנים, עמודות pivot מזהות חיישנים שמוסיפים מידע חדש. אפשר להסיר עמודות תלויות בלי לשנות את מרחב האותות האפשריים, וכך לדחוס נתונים תוך שמירת כל הכיוונים הנמדדים.
מלכודת נפוצה
מה כדאי לבדוק
לקחת את עמודות ה־pivot מתוך RREF(A) כבסיס ל־C(A). פעולות שורה שומרות את יחסי התלות ואת מיקומי ה־pivots, אך משנות את מרחב העמודות עצמו.
בודקים שהרעיון יושב
תרגול ומשוב
בדיקת הבנה
בחרו תשובה ורק אז בדקו את עצמכם
בחרו אחת מהאפשרויות כדי להמשיך.
עכשיו אתם
אתגר קצר
חזרו למטריצת העוגן A=[[2,4,6,4],[2,5,7,6],[2,3,5,2]]. מצאו rank(A), בסיס ל־C(A), בסיס למרחב השורות ובסיס ל־N(A), ובטאו את העמודות 3 ו־4 באמצעות בסיס העמודות.
רמז ראשון
השתמשו ב־RREF(A)=[[1,0,1,−2],[0,1,1,2],[0,0,0,0]]. זכרו: בסיס העמודות נלקח מ־A, בסיס השורות נלקח מ־RREF.
הצגת דרך הפתרון
- יש שני pivots ולכן rank(A)=2. בסיס ל־C(A) הוא שתי עמודות ה־pivot המקוריות: {(2,2,2),(4,5,3)}.
- בסיס למרחב השורות הוא {(1,0,1,−2),(0,1,1,2)}, שתי השורות הלא־אפסיות של RREF.
- מן המשתנים החופשיים x₃,x₄ מתקבל בסיס ל־N(A): {(−1,−1,1,0),(2,−2,0,1)}.
- עמודה 3 מקיימת a₃=a₁+a₂, כפי שמראה עמודת RREF (1,1,0). עמודה 4 מקיימת a₄=−2a₁+2a₂.
- ממדי מרחב העמודות והשורות הם 2, וממד N(A) הוא 4−2=2; כל הספירות עקביות.
מימוש הנושא
קוד שאפשר לקחת לניסוי
הקוד מיישם את אותו רעיון מתמטי. ב־JavaScript אפשר להריץ אותו כאן; גרסת Python זמינה להשוואה ולהעתקה.
analyzeBasis מרכז את מיקומי ה־pivots, בסיס העמודות המקורי, בסיס השורות המצומצם ובסיס מרחב האפס, ומדווח גם אם העמודות בלתי תלויות או פורשות את מרחב היעד.
באתגר תתקבל דרגה 2, עמודות pivot 1 ו־2, בסיס העמודות המקורי, שתי שורות RREF ושני כיווני האפס של מטריצת העוגן.
החליפו את העמודה הרביעית ב־c₄+ε(0,0,1). נסו ε=10⁻⁶ ואז 10⁻¹⁴ ושנו את tolerance כדי לראות את ההבדל בין תלות מדויקת לתלות כמעט־מספרית.
מהרעיון אל הקוד
מימוש חישובי
function rref(input, relativeTolerance=1e-12) {
const matrix = input.map((row) => row.map(Number));
const rowScales = matrix.map((row) => Math.max(...row.map(Math.abs)));
const pivots = [];
let pivotRow = 0;
for (let column = 0;
column < matrix[0].length && pivotRow < matrix.length;
column += 1) {
let best = -1;
let bestRatio = 0;
for (let row = pivotRow; row < matrix.length; row += 1) {
const ratio = rowScales[row] === 0
? 0
: Math.abs(matrix[row][column])/rowScales[row];
if (ratio > bestRatio) {
bestRatio = ratio;
best = row;
}
}
if (best === -1 || bestRatio <= relativeTolerance) continue;
[matrix[pivotRow], matrix[best]] = [matrix[best], matrix[pivotRow]];
[rowScales[pivotRow], rowScales[best]] = [rowScales[best], rowScales[pivotRow]];
const scale = matrix[pivotRow][column];
matrix[pivotRow] = matrix[pivotRow].map((value) => value/scale);
for (let row = 0; row < matrix.length; row += 1) {
if (row === pivotRow) continue;
const factor = matrix[row][column];
matrix[row] = matrix[row].map(
(value, j) => value - factor*matrix[pivotRow][j],
);
}
pivots.push(column);
pivotRow += 1;
}
return {
matrix: matrix.map((row) =>
row.map((value) => Math.abs(value) <= relativeTolerance ? 0 : value),
),
pivots,
};
}
function analyzeBasis(A, relativeTolerance=1e-12) {
const { matrix, pivots } = rref(A, relativeTolerance);
const columns = A[0].length;
const free = Array.from({ length: columns }, (_, j) => j)
.filter((j) => !pivots.includes(j));
const nullspaceBasis = free.map((freeColumn) => {
const vector = Array(columns).fill(0);
vector[freeColumn] = 1;
pivots.forEach((pivot, row) => {
vector[pivot] = -matrix[row][freeColumn];
});
return vector;
});
return {
rank: pivots.length,
pivotColumns: pivots.map((index) => index + 1),
columnBasis: pivots.map(
(column) => A.map((row) => row[column]),
),
rowBasis: matrix.slice(0, pivots.length),
nullspaceBasis,
independentColumns: pivots.length === columns,
spansAmbientSpace: pivots.length === A.length,
};
}
const A = [
[2, 4, 6, 4],
[2, 5, 7, 6],
[2, 3, 5, 2],
];
console.log(analyzeBasis(A));def rref(source, relative_tolerance=1e-12):
matrix = [[float(value) for value in row] for row in source]
row_scales = [max(abs(value) for value in row) for row in matrix]
pivots = []
pivot_row = 0
for column in range(len(matrix[0])):
if pivot_row == len(matrix):
break
best = max(
range(pivot_row, len(matrix)),
key=lambda row: (
abs(matrix[row][column])/row_scales[row]
if row_scales[row] else 0.0
),
)
best_ratio = (
abs(matrix[best][column])/row_scales[best]
if row_scales[best] else 0.0
)
if best_ratio <= relative_tolerance:
continue
matrix[pivot_row], matrix[best] = matrix[best], matrix[pivot_row]
row_scales[pivot_row], row_scales[best] = (
row_scales[best], row_scales[pivot_row]
)
scale = matrix[pivot_row][column]
matrix[pivot_row] = [value/scale for value in matrix[pivot_row]]
for row in range(len(matrix)):
if row == pivot_row:
continue
factor = matrix[row][column]
matrix[row] = [
value - factor*pivot_value
for value, pivot_value
in zip(matrix[row], matrix[pivot_row])
]
pivots.append(column)
pivot_row += 1
matrix = [
[0.0 if abs(value) <= relative_tolerance else value for value in row]
for row in matrix
]
return matrix, pivots
def analyze_basis(A, relative_tolerance=1e-12):
matrix, pivots = rref(A, relative_tolerance)
columns = len(A[0])
free = [j for j in range(columns) if j not in pivots]
nullspace_basis = []
for free_column in free:
vector = [0.0]*columns
vector[free_column] = 1.0
for row, pivot in enumerate(pivots):
vector[pivot] = -matrix[row][free_column]
nullspace_basis.append(vector)
return {
"rank": len(pivots),
"pivot_columns": [index+1 for index in pivots],
"column_basis": [
[A[row][column] for row in range(len(A))]
for column in pivots
],
"row_basis": matrix[:len(pivots)],
"nullspace_basis": nullspace_basis,
"independent_columns": len(pivots) == columns,
"spans_ambient_space": len(pivots) == len(A),
}
A = [
[2, 4, 6, 4],
[2, 5, 7, 6],
[2, 3, 5, 2],
]
print(analyze_basis(A))לפני שממשיכים
מה לוקחים מהשיעור
- בסיס משלב פרישה ואי־תלות; כל אחד מן התנאים לבדו אינו מספיק.
- הממד הוא מספר הכיוונים בבסיס, והדרגה היא מספר ה־pivots.
- עמודות pivot מקוריות, שורות RREF לא־אפסיות ופתרונות מיוחדים מייצרים בסיסים למרחבים שונים.
- קואורדינטות ביחס לבסיס הן יחידות; בחישוב מספרי יש לדווח כיצד הוערכה הדרגה.
משימת מעבדה לשיעור הזה
תחנה 3 — כמה כיוונים באמת דרושים?
הוסיפו והסירו וקטורים מרשימה פורשת. חזו איזה וקטור מיותר, בדקו את ה־pivots וודאו שה־span נשמר בעוד הייצוג הופך ליחיד.
מקורות להעמקה בלבד — השיעור עומד בפני עצמו
מדריך המרצים: עמ׳ 148–155
ספר הלימוד: עמ׳ 285–299