לחשב כשאין נוסחה
שיטות גרפיות ונומריות
Graphical and Numerical Methods
כשאין פתרון סגור, עדיין אפשר לראות את כיוון התנועה ולחשב מסלול. שדה שיפועים, יציבות, אוילר ו־Runge–Kutta הופכים משוואה לתמונה ולאלגוריתם.
מפת הפרק
5 תחנות בדרך
5 יחידות לימוד עצמאיות · כ־5 שעות ו־15 דקות לשיעורים ולתרגול
- 3.1יחידת לימוד50 דקות
משוואות לא־לינאריות ושדות שיפועים
שאלה 1: מה ננסה להבין?איזוקלינות, כיווני זרימה וקיום ויחידות של פתרון.
לשיעור ← - 3.2יחידת לימוד60 דקות
מקורות, בורות, אוכפים וספירלות
שאלה 2: מה ננסה להבין?מסווגים נקודות שיווי משקל לפי הכיוונים שאליהם המסלולים נכנסים ויוצאים.
לשיעור ← - 3.3יחידת לימוד65 דקות
לינאריזציה ויציבות
שאלה 3: מה ננסה להבין?מקרבים מערכת לא־לינארית ליד שיווי משקל בעזרת מטריצת יעקובי.
לשיעור ← - 3.4יחידת לימוד70 דקות
שיטות אוילר
שאלה 4: מה ננסה להבין?צעד קדימה, צעד אחורה ו־trapezoid — דיוק מול יציבות.
לשיעור ← - 3.5יחידת לימוד70 דקות
דיוק גבוה עם Runge–Kutta
שאלה 5: מה ננסה להבין?דוגמים כמה שיפועים בכל צעד כדי לקבל דיוק גבוה בלי נגזרות נוספות.
לשיעור ←
ביד, שלב אחר שלב
משיפוע מקומי לקירוב מבוקר
קרבו את y(1) עבור y′=y, y(0)=1, בצעד h=0.25, והשוו בין אוילר קדמי, RK4 והפתרון המדויק.
- 1
שדה השיפועים נותן בכל נקודה את השיפוע f(t,y)=y; מן המצב ההתחלתי השיפוע הראשון הוא 1.
- 2
אוילר קדמי משתמש רק בשיפוע שבתחילת כל צעד: yₙ₊₁=(1+0.25)yₙ. לאחר ארבעה צעדים מתקבל 1.25⁴=2.441406.
- 3
RK4 דוגם ארבעה שיפועים בכל צעד. באותה רשת ארבעת הצעדים נותנים y₄≈2.718210.
- 4
הפתרון המדויק הוא e≈2.718282. לכן שגיאת אוילר היא כ־0.276876, ואילו שגיאת RK4 היא כ־0.000072.
ב־h=0.25: אוילר 2.441406, RK4 2.718210, מדויק 2.718282. דגימת שיפועים טובה יותר מצמצמת מאוד את השגיאה, אך אינה מבטלת את הצורך לבדוק צעד ויציבות.ניבוי, ניסוי והסבר
מעבדת חקר: משדות ויציבות לצעדים נומריים מדויקים
התחילו מתחנה אחת, נבאו את התוצאה ורק אז שנו פרמטר. בכל תחנה תקבלו משוב וקישור לשיעור שעליו היא בנויה.
פרק 3 · ארבע תחנות חקר
משדה שיפועים לאלגוריתם יציב ומדויק
נבאו, בדקו והסבירו: שדות וקווי פתרון, דיוקני פאזה ולינאריזציה, יציבות שיטות אוילר וסדר ההתכנסות של Runge–Kutta.
המעבדה עוברת מן התמונה הגאומטרית אל האלגוריתם: קוראים שיפועים, מסווגים זרימה במישור, בודקים יציבות של צעד יחיד, ולבסוף מודדים סדר התכנסות. בכל תחנה מנבאים לפני שמשנים לכל היותר שלושה פרמטרים.
תחנה 1 מתוך 4
שדה שיפועים וקווי פתרון
- המטרה
- לקרוא מן השדה את כיוון הפתרון, לזהות איזוקלינות ושיווי משקל, ולראות כיצד קו פתרון משיק לכל מקטע שהוא פוגש.
- המשימה
- נבאו אם הפתרון יעלה או ירד, שנו את תנאי ההתחלה ואת האיזוקלינה, ואז הקטינו את צעד אוילר ובדקו אם המסלול מתקרב לפתרון המדויק.
- פתרון מדויק
- צעדי אוילר
- איזוקלינה נבחרת
- תנאי התחלה
- שיפוע ב־t=0
- 0.797
- כיוון
- הפתרון עולה
- איזוקלינה
- y=-1 וגם y=1
- שגיאת אוילר בקצה
- 0.03552
מן הנקודה (0, -0.45) השיפוע הוא 0.797 ולכן הפתרון עולה. האיזוקלינה המסומנת עבור שיפוע 0 נמצאת ב־y=-1 וגם y=1. בקצה הימני שגיאת אוילר היא 0.03552.
עכשיו בקוד
אותו רעיון, כאלגוריתם
הקוד קצר בכוונה: כל שורה מקבילה לצעד בחישוב הידני.
מהרעיון אל הקוד
מימוש חישובי
function euler(f, t0, y0, h, steps) {
let t = t0, y = y0;
for (let i = 0; i < steps; i++) {
y += h * f(t, y);
t += h;
}
return y;
}
function rk4Step(f, t, y, h) {
const k1 = f(t, y);
const k2 = f(t + h/2, y + h*k1/2);
const k3 = f(t + h/2, y + h*k2/2);
const k4 = f(t + h, y + h*k3);
return y + h*(k1 + 2*k2 + 2*k3 + k4)/6;
}
function rk4(f, t0, y0, h, steps) {
let t = t0, y = y0;
for (let i = 0; i < steps; i++) {
y = rk4Step(f, t, y, h);
t += h;
}
return y;
}
const f = (_t, y) => y;
const exact = Math.E;
console.table([0.5, 0.25, 0.125].map((h) => {
const steps = Math.round(1/h);
const eulerValue = euler(f, 0, 1, h, steps);
const rk4Value = rk4(f, 0, 1, h, steps);
return {
h,
euler: eulerValue,
eulerError: Math.abs(eulerValue - exact),
rk4: rk4Value,
rk4Error: Math.abs(rk4Value - exact),
};
}));from math import e
def euler(f, t0, y0, h, steps):
t, y = t0, y0
for _ in range(steps):
y += h * f(t, y)
t += h
return y
def rk4_step(f, t, y, h):
k1 = f(t, y)
k2 = f(t+h/2, y+h*k1/2)
k3 = f(t+h/2, y+h*k2/2)
k4 = f(t+h, y+h*k3)
return y + h*(k1+2*k2+2*k3+k4)/6
def rk4(f, t0, y0, h, steps):
t, y = t0, y0
for _ in range(steps):
y = rk4_step(f, t, y, h)
t += h
return y
f = lambda _t, y: y
for h in (0.5, 0.25, 0.125):
steps = round(1/h)
euler_value = euler(f, 0, 1, h, steps)
rk4_value = rk4(f, 0, 1, h, steps)
print({
"h": h,
"euler": euler_value,
"euler_error": abs(euler_value-e),
"rk4": rk4_value,
"rk4_error": abs(rk4_value-e),
})בדיקת שליטה מצטברת
האם כל פרק 3 יושב במקום?
חמש שאלות קצרות בודקות את כל רצף הפרק — מקריאת שדה שיפועים ויציבות מקומית ועד בחירת צעד ושיטת אינטגרציה. לאחר הבדיקה תקבלו הסבר וקישור מדויק לשיעור שכדאי לחזור אליו.
מקורות להעמקה בלבד — הפרק באתר עומד בפני עצמו
מדריך המרצים: עמ׳ 81–98. הפניות מדויקות לספר מופיעות בתחתית כל שיעור.