Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №3. Методы Ньютона и сопряжённых градиентов.doc
Скачиваний:
67
Добавлен:
02.05.2014
Размер:
347.65 Кб
Скачать

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

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <math.h>

#include <windows.h>

#define Eps 0.0001

#define x01 0

#define x02 -1

double f(double x1,double x2)

{return 20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);}

double f1(double x1,double x2)

{return 20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);}

double f2(double x1,double x2)

{return 0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f11(double x1,double x2)

{return 0.6*exp(0.3*x1*x1+0.3*x2*x2)+exp(0.3*x1*x1+0.3*x2*x2)*x1*x1*0.6*0.6;}

double f12(double x1,double x2)

{return 0.6*x1*0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f22(double x1,double x2)

{return exp(0.3*x1*x1+0.3*x2*x2)*0.6+exp(0.3*x1*x1+0.3*x2*x2)*0.6*0.6*x2*x2;}

double fi(int ki,double dalf,double x1,double x2,double z)

{return f(x1-dalf*z,x2);}

int main()

{double x[1000][2];

double y[2][2];

int k=0,N1,N2=0,i,l,n=10;

double y1,y2,del,det,p1,p2;

double m,a1,b1,ym1,ym2,min,ma,kan;

double dalf=1;

x[0][1]=x01;

x[0][2]=x02;

y1=f1(x[0][1],x[0][2]);

y2=f2(x[0][1],x[0][2]);

N1=2;

y[1][1]=f11(x[k][1],x[k][2]);

y[1][2]=f12(x[k][1],x[k][2]);

y[2][1]=y[1][2];

y[2][2]=f22(x[k][1],x[k][2]);

N2=N2+3;

p1:

det=y[1][1]*y[2][2]-y[1][2]*y[2][1];

p1=(y1*y[2][2]-y2*y[1][2])/det;

p2=(y[1][1]*y2-y[2][1]*y1)/det;

m=0;

ym1=f(x[k][1],x[k][2]);

N1++;

ab:

ym2=fi(k,dalf*(m+1),x[k][1],x[k][2],y1);

N1++;

if (ym2<ym1)

{ m++;ym1=ym2;goto ab;}

else

{ b1=(m+1)*dalf;

if (m==0) a1=0; else a1=(m-1)*dalf;

}

ma=a1+(b1-a1)/n;

min=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

l=1;

for (i=2;i<=n;i++)

{ ma=a1+i*(b1-a1)/n;

kan=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

if (min>kan) {min=kan;l=i;}

}

x[k+1][1]=x[k][1]-(l*(b1-a1)/n)*p1/10;

x[k+1][2]=x[k][2]-(l*(b1-a1)/n)*p2/10;

y1=f1(x[k][1],x[k][2]);

y2=f2(x[k][1],x[k][2]);

del=pow(y1*y1+y2*y2,0.5);

k++;

if (del>Eps) goto p1;

else

{

cout<<"----Metod Hbl0TOHA - PAFCOHA c ont waroM MOD1-------"<<endl;

cout<<"\nk="<<k<<" N="<<N1+N2<<"\nx=("<<x[k][1]<<", "<<x[k][2]<<")\ny="<<f(x[k][1],x[k][2])<<endl;

return 0;

}

getch();

return 0;

}

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

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <math.h>

#define Eps 0.0001

#define x01 0

#define x02 -1

double f(double x1,double x2)

{return 20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);}

double f1(double x1,double x2)

{return 20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);}

double f2(double x1,double x2)

{return 0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f11(double x1,double x2)

{return 0.6*exp(0.3*x1*x1+0.3*x2*x2)+exp(0.3*x1*x1+0.3*x2*x2)*x1*x1*0.6*0.6;}

double f12(double x1,double x2)

{return 0.6*x1*0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f22(double x1,double x2)

{return exp(0.3*x1*x1+0.3*x2*x2)*0.6+exp(0.3*x1*x1+0.3*x2*x2)*0.6*0.6*x2*x2;}

double fi(int ki,double dalf,double x1,double x2,double z)

{return f(x1-dalf*z,x2);}

int main()

{ double x[1000][2];

double y[2][2];

int k=0,N1,N2=0,i,l,n=10,mk=10;

double y1,y2,del,det,p1,p2;

double m,a1,b1,ym1,ym2,min,ma,kan;

double dalf=1;

x[0][1]=x01;

x[0][2]=x02;

y1=f1(x[0][1],x[0][2]);

y2=f2(x[0][1],x[0][2]);

N1=2;

p1:

y[1][1]=f11(x[k][1],x[k][2]);

y[1][2]=f12(x[k][1],x[k][2]);

y[2][1]=y[1][2];

y[2][2]=f22(x[k][1],x[k][2]);

N2=N2+3;

p2:

det=y[1][1]*y[2][2]-y[1][2]*y[2][1];

p1=(y1*y[2][2]-y2*y[1][2])/det;

p2=(y[1][1]*y2-y[2][1]*y1)/det;

m=0;

ym1=f(x[k][1],x[k][2]);

N1++;

ab:

ym2=fi(k,dalf*(m+1),x[k][1],x[k][2],y1);

N1++;

if (ym2<ym1)

{ m++;ym1=ym2;goto ab;}

else

{ b1=(m+1)*dalf;

if (m==0) a1=0; else a1=(m-1)*dalf;

}

ma=a1+(b1-a1)/n;

min=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

l=1;

for (i=2;i<=n;i++)

{ ma=a1+i*(b1-a1)/n;

kan=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

if (min>kan) {min=kan;l=i;}

}

x[k+1][1]=x[k][1]-(l*(b1-a1)/n)*p1;

x[k+1][2]=x[k][2]-(l*(b1-a1)/n)*p2;

y1=f1(x[k][1],x[k][2]);

y2=f2(x[k][1],x[k][2]);

del=pow(y1*y1+y2*y2,0.5);

k++;

if (del>Eps)

{ if (k%mk) goto p1;

else goto p2;

}

else

{ cout<<"---Metod Hbl0TOHA-PAFCOHA C OntuM waroM--"<<endl;

cout<<"\nk="<<k<<" N="<<N1+N2<<"\nx=("<<x[k][1]<<", "<<x[k][2]<<")\ny="<<f(x[k][1],x[k][2])<<endl;

getch();

return 0;

}

}

Вывод

Во второй лабораторной работе в результате работы программ были получены следующие данные:

Метод

X1min

X2min

f(X1,X2)

Экспериментов (N)

Итераций (k)

Поиск по образцу

-2.8604

-0.0572266

-45.5781

95

27

Симплекс-метод

-2.86041

-0.057312

-45.5781

59

27

Наискорейшего спуска

-2.86042

-0.0572088

-45.5781

162

5

Покоординатный с постоянным шагом

-2.86041

-0.0573646

-45.5781

80

40

В данной работе были получены следующие данные:

Метод

X1min

X2min

f(X1,X2)

Экспериментов (N)

Итераций (k)

Ньютона

-2.86042

-0.0572084

-45.5781

947

189

Ньютона-Рафсона с оптимальным шагом

-2.86042

-0.0571965

-45.5781

1487

99

Ньютона-Рафсона с оптимальным шагом, модификация 1

-2.86042

-0.0571952

-45.5781

2465

205

Ньютона-Рафсона с оптимальным шагом, модификация 2

-2.86042

-0.0571965

-45.5781

1460

99

Вывод: по результатам работы наиболее оптимальным для данной функции при заданном начальном приближении является симплекс-метод, т.к. при использовании данного метода заданная точность достигается с наименьшим числом экспериментов N=59, и относительно небольшим числом итераций k=27.

26