העשרה: שיטת ניוטון-רפסון (Newton-Raphson)
מוטיבציה
שיטת החצייה (Bisection) עובדת תמיד, אבל מתכנסת לאט — ספרה מדויקת אחת כל ~3.3 איטרציות.
ניוטון-רפסון משתמש בנגזרת כדי להתכנס הרבה יותר מהר.
הרעיון
גיאומטרית
- ניקח נקודה על הפונקציה
- נמתח משיק (tangent line) לפונקציה בנקודה
- נמצא איפה המשיק חוצה את ציר x
- הנקודה הזו היא — הקירוב הבא
f(x)
│ ╱
│ ╱ ← הפונקציה
│╱
────┼─────── ציר x
╱│
╱ │ ← המשיק
╱ │
↑ ↑
x₁ x₀
(קירוב חדש, יותר קרוב לשורש)
נוסחת האיטרציה
גזירה
משוואת המשיק בנקודה :
נציב (חיתוך עם ציר x):
מימוש
def newton_raphson(f, f_deriv, x0, eps, max_iter=100):
"""
f: הפונקציה
f_deriv: הנגזרת של f
x0: ניחוש ראשוני
eps: דיוק רצוי
max_iter: מספר מקסימלי של איטרציות
"""
x = x0
for _ in range(max_iter):
fx = f(x)
fpx = f_deriv(x)
if abs(fpx) < 1e-15: # נגזרת קרובה ל-0 — בעיה!
break
x_new = x - fx / fpx
if abs(x_new - x) < eps:
return x_new # התכנסנו!
x = x_new
return x
דוגמה: מציאת
הגדרה
נוסחת הניוטון הספציפית
קוד
f = lambda x: x**2 - 2
f_deriv = lambda x: 2 * x
root = newton_raphson(f, f_deriv, x0=1.0, eps=1e-10)
print(root) # 1.4142135623730951
מעקב — התכנסות מדהימה
| איטרציה | שגיאה | ||
|---|---|---|---|
| 0 | 1.0 | -1.0 | 0.414 |
| 1 | 1.5 | 0.25 | 0.086 |
| 2 | 1.4167 | 0.00694 | 0.0025 |
| 3 | 1.41422 | 0.0000060 | 0.0000021 |
| 4 | 1.41421356... |
4 איטרציות לדיוק של 12 ספרות!
התכנסות ריבועית (Quadratic Convergence)
מה זה אומר?
בכל איטרציה, מספר הספרות המדויקות מוכפל.
| איטרציה | ספרות מדויקות |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
| 4 | 8 |
| 5 | 16 |
השוואה ל-Bisection
| Bisection | Newton-Raphson | |
|---|---|---|
| סוג התכנסות | ליניארית | ריבועית |
| ספרות חדשות/איטרציה | ~0.3 | כפולות |
| 10 ספרות דיוק | ~33 איטרציות | ~5 איטרציות |
| 20 ספרות דיוק | ~66 איטרציות | ~6 איטרציות |
מתי ניוטון-רפסון נכשל?
1. נגזרת אפס:
# f(x) = x³, f'(x) = 3x²
# בניחוש x = 0: f'(0) = 0 → חילוק באפס!
2. ניחוש ראשוני רע
# f(x) = x³ - 2x + 2
# עם x₀ = 0: האלגוריתם מתבדר (oscillates)
# עם x₀ = -2: מתכנס
3. שורשים מרובים
אם הפונקציה יותר מורכבת, אין ערובה לאיזה שורש נתכנס.
השוואה מלאה: Bisection vs Newton-Raphson
| Bisection | Newton-Raphson | |
|---|---|---|
| צריך נגזרת? | לא | כן |
| צריך קטע [a,b]? | כן (עם החלפת סימן) | לא (רק ניחוש ) |
| קצב התכנסות | ליניארי | ריבועי |
| תמיד מתכנס? | כן (אם יש החלפת סימן) | לא תמיד |
| פשטות | פשוט מאוד | מורכב יותר |
| מספר קריאות ל-f | ~33 (ל-10 ספרות) | ~5 |
| מתי להשתמש | אין נגזרת / צריך אמינות | יש נגזרת / צריך מהירות |
בפועל
לפעמים משלבים: מתחילים עם Bisection (אמין) ועוברים ל-Newton (מהיר).
סיכום נקודות חשובות
- נוסחה:
- רעיון: משיק + חיתוך עם ציר x
- התכנסות ריבועית: ספרות מדויקות מכפילות בכל צעד
- דורש נגזרת — לא תמיד זמינה
- יכול להיכשל: , ניחוש ראשוני רע
- הרבה יותר מהיר מ-Bisection כשעובד
קישורים נוספים
- חלופה: bisection_method.md - שיטת החצייה (יותר אמינה, יותר איטית)