Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик1 / VMKUR_6.DOC
Скачиваний:
7
Добавлен:
01.05.2014
Размер:
39.42 Кб
Скачать

Текст модулей :

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

extern double F (double);

//extern double c,d;

extern double func (double);

double BISECT(double Left,double Right,double Eps,int &N)

{

double E = fabs(Eps)*2.0;

double FLeft = F(Left);

double FRight = F(Right);

double X = (Left+Right)/2.0;

double Y;

if (FLeft*FRight>0.0) {puts("Неверное задание интервала\n");exit(1);}

if (Eps<=0.0) {puts("Неверное задание точности\n");exit(1);}

N=0;

if (FLeft==0.0) return Left;

if (FRight==0.0) return Right;

while ((Right-Left)>=E)

{

X = 0.5*(Right + Left); /* вычисление середины отрезка */

Y = F(X);

if (Y == 0.0) return (X);

if (Y*FLeft < 0.0)

Right=X;

else

{ Left=X; FLeft=Y; }

N++;

};

return(X);

}

double Round (double X,double Delta)

{

if (Delta<=1E-9) {puts("Неверное задание точности округления\n");exit(1);}

if (X>0.0) return (Delta*(long((X/Delta)+0.5)));

else return (Delta*(long((X/Delta)-0.5)));

}

double ITER(double X0,double Eps,int &N)

{

if (Eps<=0.0) {puts("Неверное задание точности\n");exit (1);}

double X1=func(X0);

double X2=func(X1);

N = 2;

while( (X1 - X2)*(X1 - X2) > fabs((2*X1-X0-X2)*Eps) )

{

X0 = X1;

X1 = X2;

X2 = func(X1);

N++;

}

return(X2);

}

double NEWTON (double X,double Eps,int &N)

{

extern double F1 (double);

double Y,Y1,DX;

N=0;

do

{

Y = F(X);

if (Y==0.0) return (X);

Y1 = F1(X);

if (Y1==0.0) {puts("Производная обратилась в ноль\n");exit(1);}

DX=Y/Y1; X=X-DX; N++;

}

while (fabs(DX)>Eps);

return (X);

}

double HORDA(double Left,double Right,double Eps,int &N)

{

double FLeft = F(Left);

double FRight = F(Right);

double X,Y;

if (FLeft*FRight>0.0) {puts("Неверное задание интервала\n");exit(1);}

if (Eps<=0.0) {puts("Неверное задание точности\n");exit(1);}

N=0;

if (FLeft==0.0) return Left;

if (FRight==0.0) return Right;

do

{

X = Left-(Right-Left)*FLeft/(FRight-FLeft);

Y = F(X);

if (Y == 0.0) return (X);

if (Y*FLeft < 0.0)

{ Right=X; FRight=Y; }

else

{ Left=X; FLeft=Y; }

N++;

}

while ( fabs(Y) >= Eps );

return(X);

}

Выводы :

В ходе выполнения курсовой работы была исследована работа четырех методов вычисления и уточнения корней нелинейного уравнения . Для этого был выбран отрезок ,на котором сама функция, ее первая и вторая производные монотонны, что является необходимым условием при вычислении корня функции методом хорд и Ньютона.

Так-же в работе необходимо было оценить обусловленность методов , для этого был выбран большой ряд пар чисел Eps и Delta , для обьективной оценки методов .

Скорость сходимости и точность результатов :

Если проанализировать графики iter(Eps) для всех четырех методов то можно сразу заметить что лучшим по скорости сходимости являются методы Ньютона, Хорд и Простых Итераций.

Это подтверждается теорией :

-метод Хорд обладает линейной сходимостью;

-метод Ньютона обладает квадратичной скоростью сходимости:

-метод Простых Итераций сходится тем быстрее, чем меньше окажется q, в данном случае q»0,362432, что подтверждает быструю сходимость метода ( всего 18 итерации при высокой точности для данного уравнения ).

Самым медленным оказался метод Бисекции , это подтверждается теорией, что метод сходится по геометрической прогрессии со знаменателем q=0.5. Однако этот метод является самым точным для заданного Eps.

По графикам видно, что при изменении Delta от 0.1 до 0.000001 при постоянных значениях Eps=0.01 и Eps=0.000001 точные результаты получаются при Delta < 0.001.

Соседние файлы в папке Курсовик1