Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2092(1).docx
Скачиваний:
15
Добавлен:
21.09.2019
Размер:
716.01 Кб
Скачать

Дополнительное исследование метода релаксации:

изменим параметр релаксации:

Параметр релаксации

Число итераций

Расх*

57

7

5

4

3

4

4

3

6

9

24

Расх**

* - превысил значение, при котором метод ещё сходится

**- совпало по знаку с .

ИТОГО: наименьшее количество итераций для метода релаксации: i=3 при . Трудоёмкость процесса при этом S=5.

Выводы: трудоёмкость ньютоновского процесса на каждом шаге в два раза выше, чем в остальных методах, ибо метод помимо вычисления функции предполагает вычисление производной. Таким образом, при одинаковом объёме вычислений методы секущих и релаксации могут сделать больше итераций, чем метод Ньютона, а, следовательно, и получить более высокую точность. Стоит также отметить, что оптимальное значение параметра релаксации не предоставило минимума числа итераций для метода релаксации: минимальное значение числа итераций было достигнуто при отклонении от (при этом значение числа итераций метода релаксации было меньше, чем соответствующее значение для метода Ньютона). Это объясняется тем, что оптимальное значение параметра релаксации вычисляется на интервале монотонности производной функции; в данном случае таких интервала два: и . Этим же объясняется и тот факт, что при некоторых значениях параметра релаксации, при которых , метод ещё сходится. Таким образом, при данных исходных условиях наиболее экономичным как в плане трудоёмкости, так и в плане числа минимума итераций, является метод релаксации.

Листинг:

1) Метод релаксации:

#include <iostream>

#include <iomanip>

#include <fstream>

#include <conio.h>

#include <math.h>

using namespace std;

ofstream of1("Rout.txt");

ofstream of2("Rout2.txt");

double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}

double derivef(double x){return (3*x*x-0.2*x+0.3);}

double scndderivef(double x){return (6*x-0.2);}

int main(){

int S=0 , Iter=0;

double m1=derivef(0.5) , sol=0.75507187112752851702;

double M1=derivef(1) , t=-2/(m1+M1);

double x0=0.5 , eps=0.00001 , xa , xb;

S=S+2; //Дважды посчитали производную для поиска m1 и M1

xa=x0; xb=x0;

while(fabs(xb-sol)>=eps){

Iter=Iter+1; S=S+1;

xb=xa+t*f(xa);

cout<<S;

of1<<setw(8)<<xa<<endl;

of2<<setw(8)<<f(xa)<<endl;

xa=xb;

}

of1<<xb<<endl<<"The laboriousness S="<<S;

of2<<f(xb)<<endl<<"The laboriousness S="<<S;

cout<<"x*="<<xb<<" Iter="<<Iter;

cout<<" S="<<S<<"\nAll done”;

getch();

return 0;

}

2) Метод секущих:

#include <iostream>

#include <iomanip>

#include <fstream>

#include <conio.h>

#include <math.h>

using namespace std;

ofstream of1("Sout.txt");

ofstream of2("Sout2.txt");

double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}

double derivef(double x){return (3*x*x-0.2*x+0.3);}

double scndderivef(double x){return (6*x-0.2);}

int main(){

int S=0 , Iter=0;

double sol=0.75507187112752851702;

double x0=0.5 , eps=0.00001 , x1=1;

double xa , xb , xc=999 , xcontr , flast;

xa=x0;

if(fabs(xa-sol)<eps){

of1<<x0;

of2<<f(x0);

return 0;

}

of1<<xa<<endl;

of2<<f(xa)<<endl;

xb=x1;

if(fabs(xb-sol)<eps){

of1<<x1;

of2<<f(x1);

return 0;

}

of1<<xb<<endl;

of2<<f(xb)<<endl;

flast=f(x0); S=S+1;

if(fabs((xb-f(xb)*(xb-xa)/(f(xb)-flast))-sol)<eps){

S=S+1;

of1<<xb-f(xb)*(xb-xa)/(f(xb)-flast);

of2<<f(xb-f(xb)*(xb-xa)/(f(xb)-flast));

return 0;

}

while(fabs(xc-sol)>=eps){

Iter=Iter+1; S=S+1;

xc=xb-f(xb)*(xb-xa)/(f(xb)-flast);

if(fabs(xc-xb)/fabs(xb-xa)>1)

xcontr=xc;

of1<<xc<<endl;

of2<<f(xc)<<endl;

xa=xb; xb=xc;

flast=f(xa);

}

if(fabs(xcontr-sol)<=fabs(xc-sol)){

xc=xcontr;

of1<<"Warning! New xc="<<xc<<endl;

of2<<"Warning! New f(xc)="<<f(xc)<<endl;

}

of1<<"The laboriousness S="<<S;

of2<<"The laboriousness S="<<S;

cout<<"x*="<<xc<<" Iter="<<Iter<<" S="<<S<<"\nAll done";

getch();

return 0;

}

2) Метод Ньютона:

#include <iostream>

#include <iomanip>

#include <fstream>

#include <conio.h>

#include <math.h>

using namespace std;

ofstream of1("Nout.txt");

ofstream of2("Nout2.txt");

double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}

double derivef(double x){return (3*x*x-0.2*x+0.3);}

double scndderivef(double x){return (6*x-0.2);}

int main(){

int S=0 , Iter=0;

double sol=0.75507187112752851702 , m1=derivef(0.5) , M2=scndderivef(1);

double x0=0.5 , eps=0.00001 , xa , xb;

cout<<M2/(2*m1)*fabs(x0-sol)<<endl;

xa=x0; xb=x0;

while(fabs(xb-sol)>=eps){

Iter=Iter+1; S=S+2;

xb=xa-f(xa)/(derivef(xa));

of1<<xa<<endl;

of2<<f(xa)<<endl;

xa=xb;

}

of1<<xb<<endl<<"The laboriousness S="<<S;

of2<<f(xb)<<endl<<"The laboriousness S="<<S;

cout<<"x*="<<xb<<" Iter="<<Iter<<" S="<<S<<"\nAll done";

getch();

return 0;

}