МЕТОД ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ




Кафедра прикладной математики

 

Название работы:

лабораторная работа на тему

 

Нахождение корня уравнения

-методом деления отрезка пополам;

-методом Ньютона;

-методом хорд;

ОТЧЕТ

 

Студент _______ Якушова Е.Ю.
(подпись, дата) (инициалы, фамилия)
Группа М2-С-09    
(шифр группы)    
Руководитель    
Преподаватель __________ Чепурко С.В.
(ученая степень, звание) (подпись, дата) (инициалы, фамилия)

 

 

Обнинск,2012

CОДЕРЖАНИЕ:

1 МЕТОД ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ………………………………2

1.1 Постановка задачи………………………………………………….2-3

1.2 Достоинства и недостатки метода…………………………………3

1.3 Код программы…………………………………………………………4

1.4 Результаты программы………………………………………………..5

 

2 МЕТОД ХОРД

2.1 Постановка задачи………………………………………………..…..…6-7

2.2 Код программы……………………..……………………………………..7

2.3 Результаты программы………………………………..…………………8

 

3 МЕТОД НЬЮТОНА

3.1 Постановка задачи…………………………………………………...9-10

3.2 Код программы…………………………………………………………..11

3.3 Результаты программы…………………………………………………12


 

 

МЕТОД ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ

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

Ур-е:f(x)=0,xє[a,b] (1)

f(x)-непрерывна на [a,b]

f(a)*f(b)<0 (2)

Функция имеет хотя бы 1 точку пересечения с осью Ох,т е имеет корень.

Алгаритм:а0=а, b0=b, c0=(a0+b0)/2;

Отрезок [a,b] разбивается на [a0,c0],[c0,b0].Из этих ввух отрезков выбираем тот,у которого значение ф-ии на концах имеет разные знаки и выбранный отрезок переобозначаем [a1,b1].

[a0,c0] [c0,bo]->[a1,b1]

If (f(c0)=0) x*=c0;иначе продолжаем процедуру.

Проверяем f(a1)f(b1)<0;[a1,b1] делим пополам;выбираем нужный отрезок,ф-я на краях которого имеет разные знак и так далее.

В результате имеем последовательность вложенных друг в друга отрезков[a0,b0] [a1,b1]…[an,bn]…таких что f(an)f(bn)<0,n>1;

bn-an=(b0-a0)/2^n; (3) (т к при каждом делении длина отрезка уменьшается вдвое)

Теорема(о сходимости метода деления отрезка пополам)

Пусть f(x) непрерывна на [a,b] и f(a)*f(b)<0.Тогда последовательности an и bn сходятся к корню уравнения (1).

Док-во:an:a1,a2,..,an-последовательность левых краев вложенных друг в друга отрезков.По построению она монотонно неубывает ограничена сверху(b).=>X=

bn:b1,b2,..,bn-последовательность правых краев вложенных друг в друга отрезков.По построению она монотонно невозрастает ограничена снизу(а).=>X=

Возьмем операцию предела от (3) =0=>X=X+=x*

Покажем что х*-корень ур-я(1).Возьмем опрерациб предела от(2)

=f()f()= (x*)<=0(2).Т е квадрат ф-ии <=0,следовательно,единственный допустимый случай f(x*)=0;

ч т д

 

1.2 Достоинства и недостатки метода:

+)Сходится всегда.

-)Сходится быстро,если корней несколько,то при неверном отделении –неправильность в выборе корня


 

1.3 Код программы:

#include <iostream>

#include <math.h>

#include <conio.h>

using namespace std;

 

double e, a, b;

 

double f(double x)

{return sin(x)+cos(x)-pow(x,0.5);}

void delenie ()

{double c=(a+b)/2;

int k=0;

while (fabs(f(c))>=e)

{c = (a + b)/2;

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

else

a=c;

k++;

}

cout << "x* = " << c <<endl;

cout << "iter= " << k<<endl;

}

void main()

{ cout << "input a"<<endl;

cin >> a;

cout << "input b"<<endl;

cin >> b;

cout << "input eps"<<endl;

cin >> e;

if(f(a)*f(b)>0) cout<<"error"<<endl;else

if(a<0||b<0) cout<<"error"<<endl;else

if(a==b)cout<<"error"<<endl;

else delenie();

getch();

;

}


 

1.4 Результаты программы:

График ф-ии:

Нахождение корня ур-я и подсчет кол-ва итераций в зависимости от задания промежутка рассмотрения [a,b] и точности eps.

a=0 b=3 eps=0.001 x*=1.376953125 i=9

a=1 b=1 eps=0.1 x*=1.375 i=3

a=1 b=10 eps=0.00001 x*=1.37732287268 i=19

a=-3 b=-7 eps=0.001 x-error i=error

a=4 b=6 eps=0.001 x-error i=error

a=1.2 b=1.7 eps=0.0001 x=1.377368164 i=12


МЕТОД ХОРД

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

f(x)=0, xє[a,b] (1)

f(x)-непрерывна;

f(a)*f(b)<0;

[a,b]->[a,c] [c,b].Из этих двух отрезков выбираем тот у которого ф-я на концах имеет разные знаки.

Найдем формулу,по которой высисляется с:

 

Из соотношения подобия имеем: = =>c находим как = =>

1.2 Код программы:

 

#include <iostream>

#include <math.h>

#include <conio.h>

using namespace std;

 

double e, a, b;

 

double f(double x)

{return sin(x)+cos(x)-pow(x,0.5);}

void horda ()

{double c=b-(b-a)*f(b)/(f(b)-f(a));

int k=0;

while (fabs(f(c))>=e)

{ c=b-((b-a)*f(b)/(f(b)-f(a)));

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

else

a=c;

k++;

}

cout << "x* = " << c <<endl;

cout << "iter= " << k<<endl;

}

void main()

{ cout << "input a"<<endl;

cin >> a;

cout << "input b"<<endl;

cin >> b;

cout << "input eps"<<endl;

cin >> e;

if(f(a)*f(b)>0) cout<<"error"<<endl;else

if(a<0||b<0) cout<<"error"<<endl;else

if(a==b)cout<<"error"<<endl;

else horda();

getch();

;

}


 

2.3 Результаты программы:

 

График аналогичен графику из предыдущего метода.

Нахождение корня ур-я и подсчет кол-ва итераций в зависимости от задания промежутка рассмотрения [a,b] и точности eps.

a=0 b=10 eps=0.01 x*=1.371693772 i=9

a=1 b=3 eps=0.0001 x*=1.3773131424 i=7

a=-1 b=3 eps=0.00001 x-error i-error

a=-1 b=0 eps=0.001 x*-error i-error

a=4 b=6 eps=0.001 x*-error i-error

a=1 b=6 eps=0.000001 x*=1.377336696 i=12

 


МЕТОД НЬЮТОНА

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

f(x)=0,f(x) непрерывна на [a,b]; (1)

f(a)*f(b)<0;

x=x+ , x=x- , - , n=0,1,2…

x*:f(x*)=0;

Пусть известно некоторое значение , тогда f(x*)=f(x*+ - )=0.Раскладываем по ф-ле Тейлора и устремляем к 0 f”( тогда x* x . Заменяем на = и имеем слева приближенное значение = -

Геометрический смысл:

Tg =f’(x0)=f(x0)/x0-x1 => x1=x0 - ; касательными приближаемся к корню.

Теорема(о сходимости метода Ньютона):

Пусть ф-я f(x) дважды непрерывно дифференцируема на [a,b]. И f(a)f(b)<0;

f’ f” знакопостоянны на [a,b].Тогда итерационный процесс уравнения Ньютона сходится к единственному корню уравнения f(x)=0;

И для погрешности справедлива формула |x*- | M2/2m1*( - ), где ,

Док-во:

Для определенности f(a)<0, f(b)<0, f’(x)>0,f’’(x)>0;

Рассмотрим итерационный процесс и покажем что >x*;

Пусть f’(x)>0, f’’(x0)>0. Тогда в качестве x0 берем точку x0=b, так как f(b)f’’(b)>0. Из (3.23) следует, что xn+1<xn, то есть последовательность {xn} является убывающей

b=x0>x1>…>xn>a (3.24)

Покажем теперь, что эта последовательность имеет предел ξ. Пусть xn-1> ξ. Докажем, что xn> ξ. Для этого запишем n-ое приближение, полученное по формуле Ньютона (см. формулу (3.17)) и по модифицированной формуле Ньютона (3.23)

= - = -

 

и найдем разность - = *()

. (3.25)

Из теории выпуклых функций известно, что если f’’(x) и сохраняет знак на [a,b], то f(x)является выпуклой. Для выпуклой функции f(x) производная f’(x) является неубывающей, то есть для любого x2>x1,f’(x2) . Поэтому f’() f’()

. (3.26)

С учетом (3.26) из (11) следует ^x- . Из теоремы сходимости метода Ньютона мы получали ^ , поэтому кси Отсюда

ξ≤xn. (3.27)

Таким образом, из (3.24) и (3.27) получили убывающую сходящуюся последовательность

x0>x1>…>xn≥ξ.

Следовательно, для любого сколь угодно малого ε>0 можно указать такое n, что

|xn-ξ|< ε. Теорема доказана.


 

3.2 Код программы:

 

#include <iostream>

#include <cmath>

#include <conio.h>

using namespace std;

 

double f(double x)

{return(sin(x)+cos(x)-pow(x,0.5));}

 

double df(double x)

{return (-1/(2*pow(x,0.5))+cos(x)-sin(x));}

 

double ddf(double x)

{return (-sin(x)-cos(x)+1/(4*pow(x,1.5)));}

 

 

void main()

{

 

double x0,xn, e=0.0001, n=0, a, b;

 

cout<<"Vvedi a=";

cin>>a;

cout<<endl<<"Vvedi b=";

cin>>b;

cout<<"Vvedi x0=";

cin>>x0;

if(a<0||b<0)cout <<"error"<<endl;else

if(x0<0) cout <<"error"<<endl;else

if(a==b)cout <<"error"<<endl;else

if(f(a)*f(b)>=0)cout <<"error"<<endl;else

{if(f(x0)*ddf(x0)<=0) cout<<"error x0!"<<endl; else

{xn=x0-f(x0)/df(x0);

while(fabs(xn-x0)>=e){x0=xn;xn=x0-f(x0)/df(x0);n++;}

}cout<<n<<endl;cout<<xn;}

getch();

}

 

 

 

 

3.3 Результаты программы:

 

График аналогичен графику из предыдущих двух методов.

Нахождение корня ур-я и подсчет кол-ва итераций в зависимости от задания промежутка рассмотрения [a,b],точности eps и начального задания х0

.

 

a=1, b=7, x0=1.6, e=0.0001, i=3, x*=1.37734

a=2, b=4, x0=1.6 e=0.0001, i-error, x*-error

a=1,b=2, x0=1.7, e=0.0001, i=3, x*=1.3773369

a=1.1, b=2, x0=1.8,e=0.00001, i=5, x*=1.3773371

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-01-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: