Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод Ньютона.doc
Скачиваний:
1
Добавлен:
29.07.2019
Размер:
4.82 Mб
Скачать

Уфимский Государственный Авиационный Технический Университет

Кафедра Автоматизации Проектирования Информационных Систем

Лабораторная работа №3

«Безусловная многомерная оптимизация второго порядка»

Методы оптимизации

Вариант 10

Проверил:

Хасанов А.Ю.

Уфа 2009

Содержание

Цель работы….………………………………..………………………………..3

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

График функции……………………………………………………………….3

Блок-схемы…………………………………………………………………….4

  1. Метод Ньютона ..………………………………………..................................4

  2. Метод Ньютона (1-я модификация)………………………………………….5

  3. Метод Ньютона (2-я модификация)………………………………………….6

  4. Метод Ньютона-Рафсона с дроблением шага……………………………….7

  5. Метод Ньютона-Рафсона с дроблением шага (1-я модификация)………...8

  6. Метод Ньютона-Рафсона с дроблением шага (2-я модификация)………...9

  7. Метод Ньютона-Рафсона с оптимальным шагом……………………....10-11

  8. Метод Ньютона-Рафсона с оптимальным шагом (1-я модификация)..12-13

  9. Метод Ньютона-Рафсона с оптимальным шагом (2-я модификация)..14-15

Графики траекторий промежуточных приближений…………………16-20

Листинг программы…………………………………………………......21-36

Результирующая таблица и вывод…………………………………….......37

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

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

Целевая функция f(x)=f(x(1), x(2)) зависит от двух аргументов. Функция f(x) следующего вида:

f(x)=a*x­1+b*x2+

Целевая функция

Начальное

приближение

Точность

решения

a

b

c

d

10

25

0.0

0.35

0,35

(1;0)

0,0004

Для решения задачи использовать методы:

1) Метод Ньютона;

2) Метод Ньютона (1-я модификация);

3) Метод Ньютона (2-я модификация);

4) Метод Ньютона-Рафсона с дроблением шага;

5) Метод Ньютона-Рафсона с дроблением шага (1-я модификация);

6) Метод Ньютона-Рафсона с дроблением шага (2-я модификация);

7) Метод Ньютона-Рафсона с оптимальным шагом;

8) Метод Ньютона-Рафсона с оптимальным шагом (1-я модификация);

9) Метод Ньютона-Рафсона с оптимальным шагом (2-я модификация).

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

Блок-схемы

Метод Ньютона

Первая модификация метода Ньютона

Вторая модификация метода Ньютона

Метод Ньютона – Рафсона с дроблением шага

Первая модификация метода Ньютона – Рафсона с дроблением шага

Вторая модификация метода Ньютона – Рафсона с дроблением шага

Метод Ньютона – Рафсона с оптимальным шагом

Первая модификация метода Ньютона – Рафсона с оптимальным шагом

Вторая модификация метода Ньютона – Рафсона с оптимальным шагом

Графики траекторий промежуточных приближений

Листинг программы:

#include <iostream.h>

#include <math.h>

#include <conio.h>

#include <stdlib.h>

#include <iomanip.h>

#include <fstream.h>

struct znach_x

{ double x1,x2;

};

double f(double x1,double x2)

{double y;

y=25*x1+0.9*x2+exp(0.35*pow(x1,2)+0.35*pow(x2,2));

return y;

}

double dfx1(double x1,double x2)

{double y;

y=25+0.7*x1*exp(0.35*pow(x1,2)+0.35*pow(x2,2));

return y;

}

double dfx2(double x1,double x2)

{double y;

y=0.9+0.7*x2*exp(0.35*pow(x1,2)+0.35*pow(x2,2));

return y;

}

double dfx1x1(double x1,double x2)

{double y,e;

e=exp( 0.35*pow(x1,2)+0.35*pow(x2,2) );

y=0.7*(e+0.7*x1*x1*e);

return y;

}

double dfx2x2(double x1,double x2)

{double y,e;

e=exp( 0.35*pow(x1,2)+0.35*pow(x2,2) );

y=0.7*(e+0.7*x2*x2*e);

return y;

}

double dfx1x2(double x1,double x2)

{double y;

y=0.49*x1*x2*exp(0.35*pow(x1,2)+0.35*pow(x2,2));

return y;

}

void newton()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F;

double f2[2][2];

int N1,N2,k,N;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

fout.open("result1.txt");

if(fout.fail()){ cout<<"result1.txt "<<"Mistake!";

getch(); exit(1);}

eps = 0.0004;

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;

m1:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

x[k+1].x1=x[k].x1-p1;

x[k+1].x2=x[k].x2-p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) goto m1;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void newton_rafs_drobl()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,delta,a,y,fp;

double f2[2][2];

int N1,N2,k,N,N0;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

eps=0.0004;

cout<<"Vvedite delta':\n";

cout<<"delta = "; cin>>delta;

fout.open("result2.txt");

if(fout.fail()){ cout<<"result2.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;a=1;N0=0;

m2:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

y=f(x[k].x1,x[k].x2);

N0++;

fp=f1_1*p1+f1_2*p2; //scal.

m1:

if ((f(x[k].x1-a*p1,x[k].x2-a*p2)-y)>(-delta*a*fp)) {a=0.5*a;

N0++;goto m1;}

x[k+1].x1=x[k].x1-a*p1;

x[k+1].x2=x[k].x2-a*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) goto m2;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void newton_rafs_optim()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,y1,y2,A,B;

double a1,a2,amin,da,d0,a,f1,f3;

double f2[2][2];

int i,N1,N2,k,N,N0;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

cout<<"Vvedite da:\n";

cout<<"da = "; cin>>da;

eps=0.0004;

fout.open("result3.txt");

if(fout.fail()){ cout<<"result3.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;N0=0;

m2:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

//opredel A,B

y1=f(x[k].x1,x[k].x2);

i=0;

m5:

y2=f(x[k].x1-((i+1)*da)*p1,x[k].x2-((i+1)*da)*p2);

N0++;

if (y2<y1) {i++;y1=y2;goto m5;}

else {B=(1+i)*da;

if (i>0) A=(i-1)*da;

else A=0;

}

//cout<<"A="<<A<<" B="<<B<<endl;

d0=eps/100;

do

{a=(A+B)/2.0;

a1=a-d0;

a2=a+d0;

f1=f(x[k].x1-a1*p1,x[k].x2-a1*p2);

f3=f(x[k].x1-a2*p1,x[k].x2-a2*p2);

N0=N0+2;

if (f1<f3) B=a2;

else A=a1;

}

while (B-A>2*eps);

amin=(A+B)/2.0;

x[k+1].x1=x[k].x1-amin*p1;

x[k+1].x2=x[k].x2-amin*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) goto m2;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void f_modif_new()

{const int L=1500;

znach_x x[L];

znach_x x_;

long double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F;

long double f2[2][2];

int N1,N2,k,N;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

eps=0.0004;

fout.open("result4.txt");

if(fout.fail()){ cout<<"result4.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

cout<<"f1_1="<<f1_1<<" "<<"f1_2="<<f1_2<<endl;

k=0;N1=0;N2=0;

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

cout<<"11="<<f2[1][1]<<" "<<"12="<<f2[1][2]<<" "<<"21="<<f2[2][1]<<" "<<"22="<<f2[2][2]<<endl;

N2=N2+3;

m1:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

cout<<"d="<<d<<" "<<"d1="<<d1<<" "<<"d2="<<d2<<endl;

p1=d1/d;

p2=d2/d;

cout<<"p1="<<p1<<" "<<"p2="<<p2<<endl;

x[k+1].x1=x[k].x1-p1;

x[k+1].x2=x[k].x2-p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

cout<<"f1_1="<<f1_1<<" f1_2="<<f1_2<<endl;

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

cout<<"F="<<F<<endl;

dlina=sqrt(F);

k++;

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

cout<<"dlina="<<dlina<<endl;

if (dlina>eps) goto m1;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void f_modif_new_rafs_drobl()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,delta,a,y,fp;

double f2[2][2];

int N1,N2,k,N,N0;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

eps=0.0004;

cout<<"Vvedite delta':\n";

cout<<"delta = "; cin>>delta;

fout.open("result5.txt");

if(fout.fail()){ cout<<"result5.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;a=1; N0=0;

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

m2:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

y=f(x[k].x1,x[k].x2);

N0++;

fp=f1_1*p1+f1_2*p2; //scal.

m1:

if ((f(x[k].x1-a*p1,x[k].x2-a*p2)-y)>(-delta*a*fp)) {a=0.5*a;

N0++;goto m1;}

x[k+1].x1=x[k].x1-a*p1;

x[k+1].x2=x[k].x2-a*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) goto m2;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void f_modif_new_rafs_optim()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,y1,y2,A,B;

double a1,a2,amin,da,d0,a,f1,f3;

double f2[2][2];

int N1,N2,k,N,N0,i;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

cout<<"Vvedite da:\n";

cout<<"da = "; cin>>da;

eps=0.0004;

fout.open("result6.txt");

if(fout.fail()){ cout<<"result6.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;N0=0;

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

m2:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

//opredel A,B

y1=f(x[k].x1,x[k].x2);

i=0;

m5:

y2=f(x[k].x1-((i+1)*da)*p1,x[k].x2-((i+1)*da)*p2);

N0++;

if (y2<y1) {i++;y1=y2;goto m5;}

else {B=(1+i)*da;

if (i>0) A=(i-1)*da;

else A=0;

}

//cout<<"A="<<A<<" B="<<B<<endl;

d0=eps/100;

do

{a=(A+B)/2.0;

a1=a-d0;

a2=a+d0;

f1=f(x[k].x1-a1*p1,x[k].x2-a1*p2);

f3=f(x[k].x1-a2*p1,x[k].x2-a2*p2);

N0=N0+2;

if (f1<f3) B=a2;

else A=a1;

}

while (B-A>2*eps);

amin=(A+B)/2.0;

x[k+1].x1=x[k].x1-amin*p1;

x[k+1].x2=x[k].x2-amin*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) goto m2;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void s_modif_new()

{

const int L=1500;

znach_x x[L];

znach_x x_;

long double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F;

long double f2[2][2];

int N1,N2,k,N,m=9;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

eps = 0.0004;

fout.open("result7.txt");

if(fout.fail()){ cout<<"result7.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

/*cout<<"x[k]:"<<endl<<x[0].x1<<endl<<x[0].x2<<endl;

cout<<"f1_1="<<f1_1<<endl;

cout<<"f1_2="<<f1_2<<endl;

*/

k=0;N1=0;N2=0;

m1:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

/*cout<<"f211="<<f2[1][1]<<endl;

cout<<"f212="<<f2[1][2]<<endl;

cout<<"f221="<<f2[2][1]<<endl;

cout<<"f222="<<f2[2][2]<<endl;

*/

N2=N2+3;

m2:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

/*cout<<"x[k]:"<<endl<<x[k].x1<<endl<<x[k].x2<<endl;

cout<<"d="<<d<<endl;

cout<<"d1="<<d1<<endl;

cout<<"d2="<<d2<<endl;

*/

p1=d1/d;

p2=d2/d;

x[k+1].x1=x[k].x1-p1;

x[k+1].x2=x[k].x2-p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<endl<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

//cout<<"F="<<F<<endl;

k++;

if (dlina>eps)

{if (k%m==0)goto m1;

else goto m2; }

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void s_modif_new_rafs_drobl()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,delta,a,y,fp;

double f2[2][2];

int N1,N2,k,N,N0,m=2;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

eps=0.0004;

cout<<"Vvedite delta':\n";

cout<<"delta = "; cin>>delta;

fout.open("result8.txt");

if(fout.fail()){ cout<<"result8.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;a=1; N0=0;

m2:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

m6:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

y=f(x[k].x1,x[k].x2);

N0++;

fp=f1_1*p1+f1_2*p2; //scal.

m1:

if ((f(x[k].x1-a*p1,x[k].x2-a*p2)-y)>(-delta*a*fp)) {a=0.5*a;

N0++;goto m1;}

x[k+1].x1=x[k].x1-a*p1;

x[k+1].x2=x[k].x2-a*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) { if (k%m==0) goto m2;

else goto m6; }

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void s_modif_new_rafs_optim()

{

const int L=1500;

znach_x x[L];

znach_x x_;

double eps,y_,f1_1,f1_2,d,d1,d2,p1,p2,dlina,F,y1,y2,A,B;

double a1,a2,amin,da,d0,a,f1,f3;

double f2[2][2];

int i,N1,N2,k,N,N0,m=2;

ofstream fout;

cout<<"Vvedite bazovuyu tochku:"<<endl;

cout<<"x0(x1,x2) ";cout<<endl;

cout<<"x1 = ";

cin>>x[0].x1;

cout<<"x2 = ";

cin>>x[0].x2;

cout<<"Vvedite da:\n";

cout<<"da = "; cin>>da;

eps=0.0004;

fout.open("result9.txt");

if(fout.fail()){ cout<<"result9.txt "<<"Mistake!";

getch(); exit(1);}

f1_1=dfx1(x[0].x1,x[0].x2);

f1_2=dfx2(x[0].x1,x[0].x2);

k=0;N1=0;N2=0;N0=0;

m2:

f2[1][1]=dfx1x1(x[k].x1,x[k].x2);

f2[1][2]=dfx1x2(x[k].x1,x[k].x2);

f2[2][1]=f2[1][2];

f2[2][2]=dfx2x2(x[k].x1,x[k].x2);

N2=N2+3;

m6:

d=f2[1][1]*f2[2][2]-pow(f2[1][2],2);

d1=f1_1*f2[2][2]-f1_2*f2[1][2];

d2=f2[1][1]*f1_2-f2[2][1]*f1_1;

p1=d1/d;

p2=d2/d;

//opredel A,B

y1=f(x[k].x1,x[k].x2);

i=0;

m5:

y2=f(x[k].x1-((i+1)*da)*p1,x[k].x2-((i+1)*da)*p2);

N0++;

if (y2<y1) {i++;y1=y2;goto m5;}

else {B=(1+i)*da;

if (i>0) A=(i-1)*da;

else A=0;

}

//cout<<"A="<<A<<" B="<<B<<endl;

d0=eps/100;

do

{a=(A+B)/2.0;

a1=a-d0;

a2=a+d0;

f1=f(x[k].x1-a1*p1,x[k].x2-a1*p2);

f3=f(x[k].x1-a2*p1,x[k].x2-a2*p2);

N0=N0+2;

if (f1<f3) B=a2;

else A=a1;

}

while (B-A>2*eps);

amin=(A+B)/2.0;

x[k+1].x1=x[k].x1-amin*p1;

x[k+1].x2=x[k].x2-amin*p2;

fout<<x[k+1].x1<<"; "<<x[k+1].x2<<endl;

cout<<(k+1)<<") "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;

f1_1=dfx1(x[k+1].x1,x[k+1].x2);

f1_2=dfx2(x[k+1].x1,x[k+1].x2);

N1=N1+2;

F=f1_1*f1_1+f1_2*f1_2;

dlina=sqrt(F);

k++;

if (dlina>eps) if (k%m==0) goto m2;

else goto m6;

x_=x[k];

y_=f(x_.x1,x_.x2);

N=N1+N2+N0;

fout.close();

cout<<"Result:\n";

cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;

cout<<"y_ = "<<y_<<endl;

cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;

cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;

cout<<"Kol-vo icpitanii: N2 = "<<N2<<endl;

cout<<"Kol-vo icpitanii: N = "<<N<<endl;

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

}

void main()

{int j;

while (1)

{clrscr();

cout<<endl;

cout<<"1.Method Newton\n";

cout<<"2.Metod Newton-Rafson s drobleniem\n";

cout<<"3.Metod Newton-Rafson optim\n";

cout<<"4.1 modification Newton\n";

cout<<"5.1 modification Newton-Rafson s drobleniem\n";

cout<<"6.1 modification Newton-Rafson optim\n";

cout<<"7.2 modification Newton\n";

cout<<"8.2 modification Newton-Rafson s drobleniem\n";

cout<<"9.2 modification Newton-Rafson optim\n";

cout<<"0.Exit\n";

cout<<endl;

cout<<"Your choice 0-9: ";

cin>>j;

switch(j)

{

case 1:newton();getch(); break;

case 2:newton_rafs_drobl();getch(); break;

case 3:newton_rafs_optim();getch(); break;

case 4:f_modif_new();getch(); break;

case 5:f_modif_new_rafs_drobl();getch(); break;

case 6:f_modif_new_rafs_optim();getch(); break;

case 7:s_modif_new();getch(); break;

case 8:s_modif_new_rafs_drobl();getch(); break;

case 9:s_modif_new_rafs_optim();getch(); break;

case 0: cout<<"Over"; getch();exit(0);

default:{cout<<"Net takogo punkta!";exit(1);

}

getch();}

}

}