Студопедия

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

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

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






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






 

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

 

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

функция f(x) непрерывна, монотонна и имеет разные знаки на концах (). На этом отрезке существует и единственен корень исходного уравнения.

 

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

 

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

 

 

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

 

Проводим хорду через концы графика и находим абсциссу точки пересечения её с осью x (c1), находим значение функции в точке с1 (определяем знак функции в точке с1), сравниваем знаки функций в точке а, b, c1, присваиваем с1 в a или b (так, чтобы знаки совпадали).

Проводим новую хорду, поступаем аналогично до тех пор, пока не будет выполнено одно из условий: |f(c)|< Eps или |b-a|< Eps.

 

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

 

 

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

 

1) Ввод a, b, Eps

 

2) iter

do

2.1. Получение точки пересечения хорды с осью X

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=(f(a)*(b-a))/(f(a)-f(b))+a;

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, 001 100 итераций):

 

 

 

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

 

с ()=0, 727944

 

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

 

 

 

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

 

с ()=0, 727514

 

Если сравнить результаты решения нелинейных уравнений методом деления отрезка пополам и методом хорд, то результаты почти совпадают.

 

Чем меньше Eps, тем больше итераций требуется для достижения результата, и тем точнее он получается.

 

 






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