Студопедия

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

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

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






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






 

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

 

Необходимо решить уравнение 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 :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.