מרחבים ותתי־מרחבים
הפתרון השלם של Ax=b
The Complete Solution to Ax=b
בודקים תחילה אם b∈C(A); אם כן, מחברים פתרון פרטי אחד לכל מרחב האפס ומקבלים קבוצה אפינית של כל הפתרונות.
- 1נקודת פתיחהמה כבר ידוע ומה השאלה?
- 2ניבוימה יקרה במקרה הפשוט?
- 3המחשהמה באמת משתנה בתמונה?
- 4ניסוח והצדקהשם, נוסחה ולמה היא נכונה
- 5בדיקהדוגמה, תרגול ומשוב
- 6העברהמקרה חדש והמשך המסלול
שאלה לפני נוסחה
מה אנחנו מנסים לראות?
לחבר בין מרחב העמודות למרחב האפס: להכריע אם Ax=b עקבית, למצוא פתרון פרטי xₚ ולתאר את כל הפתרונות ורק אותם בצורה x=xₚ+xₙ.
אם שני וקטורים מגיעים לאותו b, ההפרש ביניהם בלתי נראה למטריצה ולכן נמצא במרחב האפס. כל הפתרונות הם הזזה של N(A): מתחילים בנקודה אחת שמגיעה אל b, וממנה נעים רק בכיוונים ש־A מוחקת.
לפני ההמחשה: קראו רק את הכותרת “נקודת עוגן ועוד כיווני חופש”. מה לדעתכם ישתנה, מה יישאר קבוע, ואיזה סימן בתמונה יוכל להפריך את הניבוי?
לראות לפני שמחשבים · המקרה הפשוט ביותר
נקודת עוגן ועוד כיווני חופש
ההמחשה מציגה חתך דו־ממדי: N(A) הוא הקו שעובר בראשית, והקו המקביל xₚ+N(A) מכיל את כל הפתרונות של Ax=b.
מה כדאי לגלות: עקבו אחר x₁, xₚ ו־x₂ שעל הקו המוזז: שלושתם נשלחים לאותו b. הקו אינו עובר ב־0 כאשר b≠0, ולכן זו קבוצה אפינית ולא תת־מרחב.
אחרי שראינו
בסוף השיעור תוכלו
- לזהות עקביות או סתירה מתוך RREF של [A|b] ומן התנאי b∈C(A).
- לבנות פתרון פרטי אחד על ידי איפוס המשתנים החופשיים.
- להוכיח שכל שני פתרונות נבדלים בווקטור מ־N(A).
- לסווג מערכת ללא פתרון, עם פתרון יחיד או עם אינסוף פתרונות ולכתוב את כל קבוצת הפתרונות.
נותנים שמות למה שראינו
מושגים שנשתמש בהם
- מערכת עקבית
- מערכת Ax=b שיש לה לפחות פתרון אחד.
- מטריצה מורחבת
- [A|b], שבה פעולות השורה מופעלות יחד על המקדמים ועל אגף ימין.
- שורת סתירה
- שורה [0 ⋯ 0 | c] עם c≠0, המייצגת 0=c ומוכיחה שאין פתרון.
- פתרון פרטי xₚ
- פתרון מסוים אחד של Ax=b; הוא נקודת העוגן של קבוצת הפתרונות.
- פתרון הומוגני xₙ
- וקטור כלשהו ב־N(A), כלומר Axₙ=0.
- קבוצה אפינית
- הזזה של תת־מרחב: xₚ+N(A). היא אינה חייבת לעבור בראשית.
- פתרון יחיד
- מצב שבו המערכת עקבית ו־N(A)={0}, כלומר אין משתנים חופשיים.
- דרגת המטריצה המורחבת
- מספר ה־pivots ב־[A|b]; עקביות דורשת rank(A)=rank([A|b]).
מהמילים אל הסימנים
כותבים את הפעולה שכבר ראינו
פתחו את הנוסחה רק אחרי שאתם יכולים לומר במילים מה כל פעולה אמורה לעשות. בשלב הבא נצדיק אותה צעד אחר צעד.
להצגת נוסחת המפתח
קראו כל סימן כפעולה, לא כמשהו שצריך לשנןx=xₚ+xₙ, xₙ∈N(A), אם b∈C(A)מרכיבים את הפעולות
מהתמונה אל הנוסחה — הגזירה, בלי לדלג על הצעדים
בודקים קודם אם יש נקודת עוגן
מבצעים אלימינציה על [A|b]. אם מתקבלת שורת סתירה, אין xₚ ולכן אין קבוצת פתרונות לבנות.
[0 ⋯ 0 | c], c≠0 ⇒ no solutionמחברים את בדיקת העקביות למרחב העמודות
כאשר b הוא צירוף של עמודות A, הוספתו למטריצה אינה מוסיפה pivot. לכן שלושה ניסוחים אומרים אותו דבר.
b∈C(A) ⇔ rank(A)=rank([A|b]) ⇔ Ax=b consistentבוחרים פתרון פרטי פשוט
במערכת עקבית מציבים 0 בכל המשתנים החופשיים ופותרים את משתני ה־pivot. זו בחירה נוחה, לא פתרון מיוחד מבחינה גאומטרית.
Axₚ=bעוצרים לחשוב: לפני שממשיכים, הכפילו ובדקו בפועל ש־Axₚ=b.
פותרים את הבעיה ההומוגנית
אותה A קובעת את N(A), בלי תלות ב־b. משתמשים ב־RREF כדי לבנות את הפתרונות המיוחדים n₁,…,nₖ.
xₙ=t₁n₁+⋯+tₖnₖ, Axₙ=0מוכיחים שכל חיבור הוא פתרון
החלק הפרטי מייצר b והחלק ההומוגני מייצר 0, ולכן סכומם מייצר שוב b.
A(xₚ+xₙ)=Axₚ+Axₙ=b+0=bמוכיחים שלא החמצנו אף פתרון
אם x הוא פתרון כלשהו, חיסור xₚ מבטל את b. לכן x−xₚ שייך בהכרח ל־N(A), וכל פתרון מופיע בתיאור.
Ax=b ⇒ A(x−xₚ)=0 ⇒ x=xₚ+xₙמסווגים את כל האפשרויות
סתירה נותנת אפס פתרונות. אם r=n אין משתנים חופשיים ולכן לכל b יש לכל היותר פתרון אחד; אם r=m כל b עקבי ולכן יש לפחות פתרון אחד. כאשר r=m=n יש בדיוק פתרון אחד לכל b. אם r<n ומערכת מסוימת עקבית, יש לה אינסוף פתרונות; ואם r<m קיימים יעדים b שאינם פתירים.
r=n ⇒ at most one; r=m ⇒ at least one for every b; r=m=n ⇒ exactly oneעוצרים לחשוב: בכל מקרה עקבי solution set=xₚ+N(A). כאשר b≠0 זו קבוצה אפינית ולא תת־מרחב.
עכשיו רואים את השיטה בפעולה
דוגמאות פתורות, צעד אחר צעד
קו פתרונות כמערכת אפינית
פתרו את A=[[1,2,−1],[2,4,−2]], b=(3,6).
השורה השנייה במטריצה המורחבת היא פי 2 מהראשונה, ולכן המערכת עקבית.
המשוואה היחידה היא x₁+2x₂−x₃=3. נציב x₂=x₃=0 ונקבל xₚ=(3,0,0).
במערכת ההומוגנית x₁=−2s+t, ולכן N(A)=span{(−2,1,0),(1,0,1)}.
כל הפתרונות הם (3,0,0)+s(−2,1,0)+t(1,0,1).
כפל ב־A משאיר 3 ו־6 לכל s,t, כי שני כיווני החופש נשלחים לאפס.
קבוצת הפתרונות היא מישור אפיני ב־ℝ³ בעל שתי דרגות חופש.
x=xₚ+s n₁+t n₂אותה A, אגף ימין בלתי אפשרי
מה קורה לאותה A כאשר c=(3,7)?
מבצעים R₂←R₂−2R₁ במטריצה [A|c].
בצד המקדמים מתקבלת שורת אפס, אך באגף ימין מתקבל 7−2·3=1.
השורה החדשה היא [0,0,0|1], כלומר הטענה 0=1.
לכן c∉C(A), אין פתרון פרטי ואי אפשר לכתוב xₚ+N(A).
מרחב האפס לא השתנה, אבל הוא יכול להזיז רק פתרון שכבר קיים; כאן אין נקודת עוגן.
rank([A|c])=2>rank(A)=1איפה זה פוגש את העולם
יישום
בזרוע רובוטית עם יותר מנועים מדרגות חופש, vₚ משיג את תנועת הקצה המבוקשת. וקטורים ב־N(A) משנים את תנוחת המפרקים בלי להזיז את הקצה, ולכן אפשר לנצל אותם כדי להתרחק ממכשול.
מלכודת נפוצה
מה כדאי לבדוק
לכתוב שהפתרון הוא span של vₚ ושל וקטורי האפס. המקדם של vₚ חייב להיות 1. בנוסף r<n מבטיח כיווני אפס, אך אינסוף פתרונות מתקבלים רק לאחר שנבדקה עקביות.
בודקים שהרעיון יושב
תרגול ומשוב
בדיקת הבנה
בחרו תשובה ורק אז בדקו את עצמכם
בחרו אחת מהאפשרויות כדי להמשיך.
עכשיו אתם
אתגר קצר
עבור מטריצת העוגן A=[[2,4,6,4],[2,5,7,6],[2,3,5,2]], תארו את כל הפתרונות ל־b=(4,3,5), ובדקו מדוע c=(4,3,4) אינו נותן פתרון.
רמז ראשון
השתמשו ב־RREF(A) מן השיעורים הקודמים. בחרו x₃=x₄=0 לפתרון פרטי; לבדיקת c השתמשו ב־y=(−2,1,1).
הצגת דרך הפתרון
- הווקטור b מקיים −2b₁+b₂+b₃=−8+3+5=0, ולכן המערכת עקבית. עם x₃=x₄=0 מתקבל xₚ=(4,−1,0,0), ואכן Axₚ=4a₁−a₂=b.
- משיעור 5.2 ידוע N(A)=span{n₁,n₂}, כאשר n₁=(−1,−1,1,0) ו־n₂=(2,−2,0,1).
- לכן כל הפתרונות הם x=(4,−1,0,0)+s(−1,−1,1,0)+t(2,−2,0,1). זהו מישור אפיני ב־ℝ⁴.
- עבור c מתקבל (−2,1,1)ᵀc=−8+3+4=−1≠0. מאחר שהווקטור הזה מאונך לכל עמודות A, c אינו במרחב העמודות ואין פתרון.
מימוש הנושא
קוד שאפשר לקחת לניסוי
הקוד מיישם את אותו רעיון מתמטי. ב־JavaScript אפשר להריץ אותו כאן; גרסת Python זמינה להשוואה ולהעתקה.
completeSolution מצמצמת את [A|b], בודקת שורת סתירה, בונה xₚ עם פרמטרים מאופסים ומחלצת מאותה RREF את כיווני N(A).
עבור b יוחזר consistent=true, particular=[4,−1,0,0] ושני כיווני האפס של העוגן. עבור c יוחזר consistent=false.
החליפו את הפתרון הפרטי על ידי הוספת 5 פעמים כיוון האפס ובדקו שהתיאור המלא לא השתנה. אחר כך כִּפלו את A ואת b באותו גורם קטן.
מהרעיון אל הקוד
מימוש חישובי
function rref(input, relativeTolerance=1e-12, scaleColumnCount) {
const matrix = input.map((row) => row.map(Number));
const columns = matrix[0].length;
const referenceColumns = scaleColumnCount ?? columns;
const rowScales = matrix.map((row) =>
Math.max(0, ...row.slice(0, referenceColumns).map(Math.abs)) ||
Math.max(0, ...row.map(Math.abs)),
);
const pivots = [];
let pivotRow = 0;
for (let column = 0;
column < columns && 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 completeSolution(A, b, relativeTolerance=1e-12) {
const variables = A[0].length;
const augmented = A.map((row, i) => [...row, b[i]]);
const { matrix, pivots } = rref(
augmented,
relativeTolerance,
variables,
);
const coefficientPivots = pivots.filter((column) => column < variables);
const inconsistent = pivots.includes(variables);
if (inconsistent) {
return {
consistent: false,
rankA: coefficientPivots.length,
rankAugmented: pivots.length,
rref: matrix,
};
}
const free = Array.from({ length: variables }, (_, j) => j)
.filter((j) => !coefficientPivots.includes(j));
const particular = Array(variables).fill(0);
coefficientPivots.forEach((column, row) => {
particular[column] = matrix[row][variables];
});
const nullspaceBasis = free.map((freeColumn) => {
const vector = Array(variables).fill(0);
vector[freeColumn] = 1;
coefficientPivots.forEach((column, row) => {
vector[column] = -matrix[row][freeColumn];
});
return vector;
});
return {
consistent: true,
rankA: coefficientPivots.length,
rankAugmented: coefficientPivots.length,
particular,
nullspaceBasis,
rref: matrix,
};
}
const A = [[2, 4, 6, 4], [2, 5, 7, 6], [2, 3, 5, 2]];
console.log(completeSolution(A, [4, 3, 5]));
console.log(completeSolution(A, [4, 3, 4]));def rref(source, relative_tolerance=1e-12, scale_column_count=None):
matrix = [[float(value) for value in row] for row in source]
columns = len(matrix[0])
reference_columns = columns if scale_column_count is None else scale_column_count
row_scales = [
max((abs(value) for value in row[:reference_columns]), default=0)
or max((abs(value) for value in row), default=0)
for row in matrix
]
pivots = []
pivot_row = 0
for column in range(columns):
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 complete_solution(A, b, relative_tolerance=1e-12):
variables = len(A[0])
augmented = [list(row) + [b[i]] for i, row in enumerate(A)]
matrix, pivots = rref(
augmented,
relative_tolerance,
variables,
)
coefficient_pivots = [
column for column in pivots if column < variables
]
inconsistent = variables in pivots
if inconsistent:
return {
"consistent": False,
"rank_A": len(coefficient_pivots),
"rank_augmented": len(pivots),
"rref": matrix,
}
free = [
column for column in range(variables)
if column not in coefficient_pivots
]
particular = [0.0]*variables
for row, column in enumerate(coefficient_pivots):
particular[column] = matrix[row][variables]
nullspace_basis = []
for free_column in free:
vector = [0.0]*variables
vector[free_column] = 1.0
for row, column in enumerate(coefficient_pivots):
vector[column] = -matrix[row][free_column]
nullspace_basis.append(vector)
return {
"consistent": True,
"rank_A": len(coefficient_pivots),
"rank_augmented": len(coefficient_pivots),
"particular": particular,
"nullspace_basis": nullspace_basis,
"rref": matrix,
}
A = [[2, 4, 6, 4], [2, 5, 7, 6], [2, 3, 5, 2]]
print(complete_solution(A, [4, 3, 5]))
print(complete_solution(A, [4, 3, 4]))לפני שממשיכים
מה לוקחים מהשיעור
- בודקים עקביות לפני שמחפשים את כל הפתרונות.
- פתרון פרטי אחד הוא נקודת עוגן; N(A) מספק את כל כיווני התנועה ממנה.
- כל הפתרונות ורק הם נכתבים x=xₚ+xₙ.
- מערכת עקבית היא יחידה כאשר N(A)={0}, ואינסופית כאשר יש לפחות משתנה חופשי.
משימת מעבדה לשיעור הזה
תחנה 2 — בונים את כל משפחת הפתרונות
מצאו תחילה xₚ, אחר כך נעו לאורך כיווני N(A). בדקו בכל נקודה שהפלט נשאר b והבחינו בין קו אפיני, נקודה ומצב ללא פתרון.
מקורות להעמקה בלבד — השיעור עומד בפני עצמו
מדריך המרצים: עמ׳ 141–148
ספר הלימוד: עמ׳ 273–284