שיטת המיתר

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

באנליזה נומרית, שיטת המיתר היא שיטה איטרטיבית למציאת שורשים של פונקציה רציפה של משתנה אחד.

שיטה זו דומה לשיטת ניוטון-רפסון למציאת שורשים. בשיטת ניוטון-רפסון יש צורך בנגזרת הפונקציה בנקודה האחרונה. שיטת המיתר מקרבת את הנגזרת על ידי שיפוע המיתר המחבר את שתי הנקודות האחרונות שחושבו, ומכאן שמה. סדר ההתכנסות של השיטה נמוך יותר מזה של שיטת ניוטון-רפסון: בשיטת ניוטון-רפסון הסדר הוא 2, ואילו בשיטת המיתר, הסדר הוא יחס הזהב (1.618 לערך). יתרונה של שיטת המיתר היא בכך שהיא אינה משתמשת בנגזרת: אם הנגזרת אינה ידועה, או שחישובה גוזל משאבי חישוב רבים, שיטת המיתר מתכנסת מהר יותר.

השיטה[עריכת קוד מקור | עריכה]

שיטת המיתר: העקומה באדום מייצגת את הפונקציה והקווים הכחולים את הישרים שמחשבים בכל איטרציה של השיטה

ניקח שני ערכים התחלתיים, \,x_0 ו-\,x_1, הקרובים יחסית לשורש המבוקש.
נבנה את הישר העובר דרך הנקודות \,(x_0,f(x_0)) ו- \,(x_1,f(x_1)). משוואת הישר היא:

 y  = \frac{f(x_1)-f(x_0)}{x_1-x_0} (x-x_1)+f(x_1).

נבחר את \,x_2, הערך הבא באיטרציה, להיות החיתוך של ישר זה עם ציר ה-x.

x_2 = x_1 - f(x_1)\frac{x_1-x_0}{f(x_1)-f(x_0)}

כעת נבנה ישר בין הנקודות \,(x_1,f(x_1)) ו- \,(x_2,f(x_2)), נחפש את החיתוך שלו בציר ה-x וכן הלאה. התהליך מוגדר בנוסחת הנסיגה הבאה:

x_n = x_{n-1} - f(x_{n-1})\frac{x_{n-1}-x_{n-2}}{f(x_{n-1})-f(x_{n-2})}

ככל שנחשב יותר איטרציות של נוסחת הנסיגה, כך נקבל ערך קרוב יותר לערך השורש האמיתי.

התכנסות[עריכת קוד מקור | עריכה]

דוגמה ויזואלית הממחישה את התכנסות השיטה

השיטה לא תמיד מתכנסת, אך אם הפונקציה \,f רציפה וגזירה, הערכים ההתחלתיים \,x_0 ו-\,x_1 קרובים מספיק לשורש, והשורש הוא שורש פשוט (כלומר נגזרתה של \,f לא מתאפסת באותה נקודה), אזי ניתן להראות כי השיטה מתכנסת לשורש של הפונקציה \,f. סדר ההתכנסות הוא יחס הזהב \,\varphi, כאשר  \varphi = \frac{1+\sqrt{5}}{2} \approx 1.618 .

קוד דוגמה[עריכת קוד מקור | עריכה]

להלן קוד בשפת C אשר מיישם את שיטת המיתר. הקוד נכתב בדגש על בהירות ולא על יעילות. הבעיה: למצוא את המספר החיובי \,x המקיים \ x^3=\cos(x). הבעיה מומרת לבעית מציאת שורש של הפונקציה \ f(x)=x^3-\cos(x).

בקוד הרשום מטה, שיטת המיתר ממשיכה כל עוד מתקיימים שני התנאים הבאים:

  1. \, |x_{n+1} - x_n| < e
  2. \, n < m

כאשר \,e הוא קבוע (השגיאה המקסימלית המותרת), \,n הוא מספר האיטרציה ו-\,m הוא חסם על מספר האיטרציות.

#include <stdio.h>
#include <math.h>
  
double f(double x)
{
    return x*x*x - cos(x);
}
  
double SecantMethod(double xn_1, double xn, double e, int m)
{
    int n;
    double d;
    for (n = 1; n <= m; n++)
    {
        d = (xn - xn_1) / (f(xn) - f(xn_1)) * f(xn);
        if (fabs(d) < e)
            return xn;
        xn_1 = xn;
        xn = xn - d;
    }
    return xn;
}
  
int main(void)
{
    printf("%0.15f\n", SecantMethod(0, 1, 5E-11, 100));
    return 0;
}

אחרי הרצה של הקוד התוצאה הסופית תהיה 0.865474033101614. הערכים המתקבלים הם:

 x_0 = 0  \,\!
 x_1 = 1  \,\!
 x_2 = 0.685073357326045  \,\!
 x_3 = 0.841355125665652  \,\!
 x_4 = 0.870353470875526  \,\!
 x_5 = 0.865358300319342  \,\!
 x_6 = 0.865473486654304  \,\!
 x_7 = 0.865474033163012  \,\!
 x_8 = 0.865474033101614  \,\!

הגרף הבא מראה את הפונקציה \,f באדום וקו המיתר האחרון בכחול. בגרף ניתן לראות שנקודת החיתוך של המיתר עם ציר ה-\,x קרובה מאוד לשורש של \,f.

Secantmethod jaredwf.png