אנליזה נומרית/שיטת חציית האינטרוולים/קוד מקור

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

שימו לב:

קטעי הקוד הבאים מהווים תוכניות שלמות ומלאות אשר ניתן להעתיק ולהריץ. קטעי הקוד נועדו לשמש ככלי לפתרון בעיות וכדומה ולא מומלץ להשתמש בקוד זה לשם הגשת עבודות, מסיבות ברורות. כמו-כן, הקוד המוצג לא נועד להיות היעיל ביותר אלא הקריא ביותר. לכן עבור חלק מהשיטות יוצג פתרון רקורסיבי אשר מתאים לאופי הבעיה, למרות חוסר היעילות התכנותית. עם זאת, ייעשה מאמץ להציג פתרונות אשר ממלאים באופן הטוב הן את דרישת הקריאות והן את דרישת היעילות.

חיפוש פשוט[עריכה]

שפת C[עריכה]

אזהרות:

  • כאן יש אפשרות לתת תנאי עצירה רק על ערך הפונקציה ובמצבים קיצוניים גודל הקבוע accuracy לא יהיה מספיק.
  • השיטה איטית להחריד כאשר לא ידוע כיצד לנחש בחכמה והיכן מונח השורש.

הנחות:

  • הניחוש ההתחלתי הוא משמאל לשורש בו מעוניינים.
#include <stdio.h>

נגדיר את הפונקציה f, אשר את שורשיה אנו מחפשים:

float f(float x)
{
    return 3*x-8;
}

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

float abso(float x)
{
    if (x<0)
        return -x;
    else
        return x;
}

בפונקציה הראשית נצהיר קבועים ומשתנים:

int main()
{
    float const accuracy=0.01;
    float const step=accuracy;
    float const bounds=4;
    float init,x;
    printf("\nInput initial position:\t");
    scanf("%f",&init);

אתחול והרצת לולאה:

    x=init;
    while (abso(f(x))>accuracy && abso(x-init)<bounds)
        x+=step;

על מנת לחפש שורש מצד שמאל לניחוש ההתחלתי, קידום המשתנה יעשה באמצעות "-=" על מנת להחסיר את הצעד step. לבסוף נבדוק את תנאי הדיוק ונסיים את התכנית:

    if (abs(f(x))<accuracy)
        printf("\nRoot: %f",x);
    else
        printf("\nRoots not found in bounds of %f",bounds);

    return 0;
}