Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Решение нелинейных уравнений методом деления отрезка пополам






     

    Постановка задачи:

     

    Необходимо решить уравнение f(x)=0 с заданной точностью, если на отрезке

    функция f(x) непрерывна, монотонна и имеет разные знаки на концах ().

     

    Уравнение называется нелинейным, потому что оно может содержать тригонометрические, логарифмические, показательные функции, и потому что x могут входить в степень выше первой.

     

    Разделим отрезок [a; b] пополам, найдя его середину (), определим знак f(c), если он совпадает со знаком f(b), то с присваиваем в b, если нет, то в a, и опять находим середину уменьшенного в 2 раза отрезка до тех пор, пока не будет выполнено одно из условий (|f(c)|< Eps или |b-a|< Eps).

     

    II этапа решения данной задачи:

     

    I этап: отделение корней

     

    Получение отрезка [a; b], содержащего единственное решение.

     

    II этап: численные методы (метод деления отрезка пополам)

     

    Алгоритм решения:

     

    1) Ввод a, b, Eps

     

    2) Цикл

    iter

    do

    2.1. Получение середины отрезка

    iter++

    2.2. если

    b=c

    иначе a=c

    while (|f(c)|< Eps или |b-a|< Eps)

     

    3) Вывод решения – с

     

    4) Проверка (подставляем в функцию с, f(c) должно получиться ≈ 0)

     

    Исходные данные:

    График функции:

     

     

    По графику видно, что отрезок [a; b] – это [0, 1], т. к. на этом отрезке у графика разные знаки на концах.

     

    Текст программы:

     

    #include< conio.h>

    #include< iostream.h>

    #include< math.h>

    long double f(long double x)

    {

    if (x==0) x=0.000001;

    return (2*log(x)-x/2+1);

    }

    void main()

    {

    clrscr();

    long double a, b, Eps, c=0;

    int iter=0;

    cout< < " Vvedite a, b, Eps ";

    cin> > a> > b> > Eps;

    do

    {

    c=(a+b)/2;

    if (f(a)*f(c)< 0) b=c;

    else a=c;

    iter++;

    }

    while(fabs(f(c))> Eps);

    cout< < " \nOtvet: " < < c< < " \n\nIteraziy: " < < iter< < " \n\nProverka: " < < f(c);

    getch();

    }

     

     

    Скриншот результата программы (при Eps=0, 01 7 итераций):

     

     

     

    Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):

     

    с ()=0, 726562

     

    Скриншот результата программы (при Eps=0, 0000001 22 итерации):

     

     

    Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):

     

    с ()=0, 727515

     

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.