Студопедия

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

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

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






Решение нелинейных уравнений методом Ньютона






 

 

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

 

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

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

 

 

Через точку М проводим касательную к графику y=f(x), находим пересечение её с осью Х – с, строим перпендикуляр из точки с к графику, проводим новую касательную, поступаем аналогично до тех пор, пока не будет выполнено одно из условий: или .

 

Для реализации метода необходимо решить следующие задачи:

 

1) Получение (выбор) начального приближения -

 

 

2) Формула метода Ньютона:

 

 

3) Условия завершения итерационного процесса:

 

1.

2.

 

 

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

 

1) Ввод a, b, Eps

 

2) Выбор x0

если

тогда Xk=a

иначе Xk=b

 

3) iter++

 

4) Итерационный процесс:

 

do

 

4.1) iter++

 

4.2)

4.3) d=|XK1-XK|

 

4.4) если d > Eps, тогда XK=XK1

 

условие продолжения:

 

while (d > Eps)

 

5) Вывод результатов: XK1 и iter

 

6) Проверка: f(XK1) ≈ Eps

 

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

 

 


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

 

 

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

 

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

 

#include < conio.h>

#include < math.h>

#include < iostream.h>

long double f(long double x)

{

if (x==0) x=0.000001;

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

}

long double f1(long double x)

{

if (x==0) x=0.000001;

return ((4-x)/(2*x));

}

long double f2(long double x)

{

return ((-2)/pow(x, 2));

}

void main()

{

clrscr();

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

int iter=0;

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

cin> > a> > b> > Eps;

if(f(a)*f1(a)> 0) c=a;

else c=b;

do

{

c-=f(c)/f1(c);

iter++;

}

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

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

getch();

}

 

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

 

 

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

 

с ()=0, 724372

 

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

 

 

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

 

с ()=0, 727514

 

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

 

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


 

 






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