Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.doc
Скачиваний:
17
Добавлен:
02.05.2014
Размер:
238.59 Кб
Скачать

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №3.

Тема: Методы Ньютона и сопряжённых градиентов.

.

Выполнил:

ст. гр. АСОИ-331

Гатфанов Р.Р.

Проверил:

Хасанов А.Ю.

УФА -2007

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

Задание:

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

Начальное

приближение

Точность

решения

a

b

c

d

10

2

-1,3

0,04

0,12

(0;1)

0,00005

Используя методы минимизации:

а) метод Ньютона

д) модификация 2 метода Ньютона

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

Блок-схема:

Текст программы:

#include<stdio.h>

#include<conio.h>

#include<math.h>

double f(double x1, double x2)

{

double F=11*x1-0.4*x2+exp(1*x1*x1+0.21*x2*x2);

return F;

}

double pr1(double x1, double x2)

{

double P1=11+2*x1*exp(1*x1*x1+0.21*x2*x2);

return P1;

}

double pr2(double x1, double x2)

{

double P2=-0.4+0.48*x2*exp(1*x1*x1+0.21*x2*x2);

return P2;

}

double pr11(double x1, double x2)

{

double P11=2*exp(1*x1*x1+0.21*x2*x2)*(1+2*x1*x1);

return P11;

}

double pr22(double x1, double x2)

{

double P22=0.48*exp(1*x1*x1+0.21*x2*x2)*(1+0.48*x2*x2);

return P22;

}

double pr12(double x1, double x2)

{

double P12=2*x1*0.48*x2*exp(1*x1*x1+0.21*x2*x2);

return P12;

}

void main()

{

double x1[1000], x2[1000], e=0.0001, f1[1000], f2[1000], f11[1000], f22[1000], f12[1000], p1, p2, X1, X2, Y;

int k, s;

FILE* out;

out=fopen("Метод Ньютона.txt","w+");

k=0;

x1[0]=-1;

x2[0]=0;

fprintf(out,"%lf\t%lf\t\n",x1[0],x2[0]);

f1[0]=pr1(x1[0], x2[0]);

f2[0]=pr2(x1[0], x2[0]);

f11[0]=pr11(x1[0], x2[0]);

f12[0]=pr12(x1[0], x2[0]);

f22[0]=pr22(x1[0], x2[0]);

s=5;

while((f1[k]*f1[k]+f2[k]*f2[k])>e)

{

p1=(f1[k]*f22[k]-f12[k]*f2[k])/(f11[k]*f22[k]-f12[k]*f12[k]);

p2=(f11[k]*f2[k]-f12[k]*f1[k])/(f11[k]*f22[k]-f12[k]*f12[k]);

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

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

fprintf(out,"%lf\t%lf\t\n",x1[k+1],x2[k+1]);

f1[k+1]=pr1(x1[k+1], x2[k+1]);

f2[k+1]=pr2(x1[k+1], x2[k+1]);

f11[k+1]=pr11(x1[k+1], x2[k+1]);

f12[k+1]=pr12(x1[k+1], x2[k+1]);

f22[k+1]=pr22(x1[k+1], x2[k+1]);

s=s+5;

k=k+1;

}

X1=x1[k];

X2=x2[k];

Y=f(X1, X2);

s=s+1;

printf("X1=%lf\nX2=%lf\nY=%lf\ns=%d\n", X1, X2, Y, s);

}

-1,09327

0,095802

-1,19553

0,188842

-1,21553

0,205858

-1,22063

0,210141

-1,10228

0,10493

-1,19665

0,189799

-1,21581

0,206089

-1,22071

0,210201

-1,10819

0,110451

-1,19771

0,190708

-1,21607

0,206311

-1,22078

0,210259

-1,11387

0,115754

-1,19873

0,191581

-1,21633

0,206524

-1,22084

0,210315

-1,11909

0,120586

-1,1997

0,192412

-1,21657

0,206729

-1,22091

0,210369

-1,12411

0,125228

-1,20063

0,193211

-1,2168

0,206926

-1,22097

0,210421

-1,12875

0,129482

-1,20152

0,193971

-1,21703

0,207114

-1,22103

0,21047

-1,1332

0,133568

-1,20237

0,194701

-1,21724

0,207295

-1,22108

0,210518

-1,13734

0,137333

-1,20319

0,195397

-1,21745

0,207469

-1,22114

0,210564

-1,14131

0,140949

-1,20397

0,196066

-1,21765

0,207636

-1,22119

0,210608

-1,14501

0,144294

-1,20472

0,196704

-1,21784

0,207796

-1,22124

0,21065

-1,14857

0,147508

-1,20544

0,197317

-1,21802

0,207949

-1,22129

0,21069

-1,1519

0,150493

-1,20613

0,197901

-1,2182

0,208097

-1,22134

0,210729

-1,15509

0,15336

-1,20679

0,198463

-1,21837

0,208239

-1,22138

0,210767

-1,15808

0,156032

-1,20742

0,198999

-1,21853

0,208375

-1,22143

0,210803

-1,16096

0,158598

-1,20803

0,199514

-1,21868

0,208505

-1,22147

0,210837

-1,16366

0,160997

-1,20861

0,200006

-1,21883

0,208631

-1,22151

0,21087

-1,16626

0,163301

-1,20917

0,200479

-1,21898

0,208751

-1,22154

0,210902

-1,1687

0,16546

-1,2097

0,200931

-1,21911

0,208867

-1,22158

0,210933

-1,17105

0,167535

-1,21021

0,201365

-1,21925

0,208978

-1,22162

0,210962

-1,17327

0,169483

-1,2107

0,20178

-1,21937

0,209084

-1,22165

0,210991

-1,1754

0,171355

-1,21117

0,202179

-1,2195

0,209187

-1,22168

0,211018

-1,17741

0,173116

-1,21163

0,202561

-1,21961

0,209285

-1,22171

0,211044

-1,17934

0,174809

-1,21206

0,202927

-1,21973

0,209379

-1,22174

0,211069

-1,18117

0,176404

-1,21247

0,203278

-1,21983

0,20947

-1,22177

0,211093

-1,18293

0,177938

-1,21287

0,203615

-1,21994

0,209557

-1,2218

0,211116

-1,1846

0,179386

-1,21326

0,203937

-1,22004

0,209641

-1,22183

0,211138

-1,1862

0,180777

-1,21362

0,204247

-1,22013

0,209721

-1,22185

0,21116

-1,18772

0,182093

-1,21397

0,204544

-1,22023

0,209798

-1,22188

0,21118

-1,18917

0,183358

-1,21431

0,204829

-1,22031

0,209872

-1,2219

0,2112

-1,19056

0,184555

-1,21464

0,205102

-1,2204

0,209944

-1,22192

0,211219

-1,19189

0,185706

-1,21495

0,205365

-1,22048

0,210012

-1,22194

0,211237

-1,19316

0,186798

-1,21525

0,205616

-1,22056

0,210078

-1,22197

0,211255

-1,19438

0,187846

-1,22197

0,211255

-1,22234

0,211569

-1,22246

0,211666

-1,22247

0,211679

-1,22199

0,211272

-1,22235

0,211574

-1,22246

0,211667

-1,22247

0,21168

-1,22201

0,211288

-1,22235

0,211578

-1,22246

0,211668

-1,22247

0,21168

-1,22202

0,211303

-1,22236

0,211582

-1,22246

0,211668

-1,22247

0,21168

-1,22204

0,211318

-1,22236

0,211586

-1,22246

0,211669

-1,22247

0,21168

-1,22206

0,211333

-1,22237

0,21159

-1,22246

0,21167

-1,22247

0,21168

-1,22208

0,211346

-1,22237

0,211594

-1,22246

0,21167

-1,22248

0,211681

-1,22209

0,21136

-1,22238

0,211598

-1,22246

0,211671

-1,22248

0,211681

-1,22211

0,211372

-1,22238

0,211601

-1,22246

0,211671

-1,22248

0,211681

-1,22212

0,211385

-1,22238

0,211604

-1,22246

0,211672

-1,22248

0,211681

-1,22214

0,211396

-1,22239

0,211607

-1,22247

0,211672

-1,22248

0,211681

-1,22215

0,211408

-1,22239

0,21161

-1,22247

0,211673

-1,22248

0,211681

-1,22216

0,211418

-1,22239

0,211613

-1,22247

0,211673

-1,22248

0,211681

-1,22217

0,211429

-1,2224

0,211616

-1,22247

0,211674

-1,22248

0,211682

-1,22219

0,211439

-1,2224

0,211619

-1,22247

0,211674

-1,22248

0,211682

-1,2222

0,211448

-1,2224

0,211621

-1,22247

0,211675

-1,22248

0,211682

-1,22221

0,211458

-1,22241

0,211624

-1,22247

0,211675

-1,22248

0,211682

-1,22222

0,211467

-1,22241

0,211626

-1,22247

0,211675

-1,22248

0,211682

-1,22223

0,211475

-1,22241

0,211629

-1,22247

0,211676

-1,22248

0,211682

-1,22224

0,211483

-1,22242

0,211631

-1,22247

0,211676

-1,22225

0,211491

-1,22242

0,211633

-1,22247

0,211676

-1,22226

0,211499

-1,22242

0,211635

-1,22247

0,211677

-1,22227

0,211506

-1,22242

0,211637

-1,22247

0,211677

-1,22227

0,211513

-1,22243

0,211639

-1,22247

0,211677

-1,22228

0,21152

-1,22243

0,21164

-1,22247

0,211678

-1,22229

0,211526

-1,22243

0,211642

-1,22247

0,211678

-1,2223

0,211532

-1,22243

0,211644

-1,22247

0,211678

-1,2223

0,211538

-1,22243

0,211645

-1,22247

0,211679

-1,22231

0,211544

-1,22243

0,211647

-1,22247

0,211679

-1,22232

0,21155

-1,22244

0,211648

-1,22247

0,211679

-1,22232

0,211555

-1,22244

0,21165

-1,22247

0,211679

-1,22233

0,21156

-1,22244

0,211651

-1,22234

0,211565

-1,22244

0,211653

4.Mодификация II метода Ньютона

Блок-схема

Текст программы

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <iostream.h>

#define N 2000

FILE *n1,*n2;

char F[80],F1[80];

double ff(double x1,double x2,double a,double b,double c,double d)

{ double f;

return f=a*x1+b*x2+exp(c*pow(x1,2)+d*pow(x2,2));

}

double df1(double x1,double x2,double a,double c,double d)

{ double df;

return df=a+2*c*x1*exp(c*pow(x1,2)+d*pow(x2,2));

}

double df2(double x1,double x2,double b,double c,double d)

{ double df;

return df=b+2*d*x2*exp(c*pow(x1,2)+d*pow(x2,2));

}

double ddf11(double x1,double x2,double c,double d)

{ double ddf;

return ddf=2*c*exp(c*pow(x1,2)+d*pow(x2,2))+4*pow(c*x1,2)*exp(c*pow(x1,2)+d*pow(x2,2));

}

double ddf12(double x1,double x2,double c,double d)

{ double ddf;

return ddf=4*c*d*x1*x2*exp(c*pow(x1,2)+d*pow(x2,2));

}

double ddf22(double x1,double x2,double c,double d)

{ double ddf;

return ddf=2*d*exp(c*pow(x1,2)+d*pow(x2,2))+4*pow(d*x2,2)*exp(c*pow(x1,2)+d*pow(x2,2));

}

double y(double al,double xk1,double xk2,double p1,double p2,double a,double b,double c,double d)

{

return a*(xk1+al*p1)+b*(xk2+al*p2)+exp(c*pow(xk1+al*p1,2)+d*pow(xk1+al*p1,2));

}

double O(double xk1,double xk2,double p1,double p2,double a,double b,double c,double d)

{

double x1,y1,y2,x2,x3,y3,a1=0,b1=5,ep=0.05;

x2=(a1+b1)/2;

y2=y(x2,xk1,xk2,p1,p2,a,b,c,d);

do

{

x1=(a1+x2)/2;

y1=y(x1,xk1,xk2,p1,p2,a,b,c,d);

x3=(x2+b1)/2;

y3=y(x3,xk1,xk2,p1,p2,a,b,c,d);

if(y1<y2)

{

b1=x2;x2=x1;y2=y1;

}

else

{

if(y2<y3){a1=x1;b1=x3;}

else{a1=x2;x2=x3;y2=y3;}

}

} while((b1-a1)/2>ep);

return x2;

}

void main()

{

int k,g=0,s,m,j,i;

double a,b,ep,c,d,x[N][2],al,df[N][2],y,p[N][2],ddf[N][4];

printf("Vvedute imia faila 1 > ");

cin>>F;

printf("Vvedute imia faila 2 > ");

cin>>F1;

n1=fopen(F, "w");

n2=fopen(F1, "w");

printf("Vvedite nomer varianta\n");

cin>>s;

if(s==1){a=1;b=-1.4;c=0.01;d=0.11;x[0][1]=1;x[0][2]=0;ep=0.0001;}

if(s==2){a=2;b=-1.3;c=0.04;d=0.12;x[0][1]=0;x[0][2]=1;ep=0.00005;}

if(s==3){a=10;b=-0.5;c=0.94;d=0.2;x[0][1]=0;x[0][2]=0;ep=0.0001;}

if(s==4){a=15;b=0;c=1.96;d=0.25;x[0][1]=0;x[0][2]=1;ep=0.00025;}

if(s==5){a=3;b=-1.2;c=0.02;d=1.3;x[0][1]=0;x[0][2]=-1;ep=0.00005;}

if(s==6){a=11;b=-0.4;c=1;d=0.21;x[0][1]=-1;x[0][2]=0;ep=0.0001;}

if(s==7){a=10;b=-1;c=1;d=2;x[0][1]=1;x[0][2]=0;ep=0.0003;}

if(s==8){a=15;b=-0.5;c=2.25;d=2.5;x[0][1]=0;x[0][2]=0;ep=0.0002;}

if(s==9){a=20;b=0.4;c=0.3;d=0.3;x[0][1]=0;x[0][2]=-1;ep=0.0001;}

if(s==10){a=25;b=0.9;c=0.35;d=0.35;x[0][1]=1;x[0][2]=0;ep=0.0004;}

printf("Vvedite m\nm=");

cin>>m;

df[0][1]=df1(x[0][1],x[0][2],a,c,d);

df[0][2]=df2(x[0][1],x[0][2],b,c,d);

k=0;j=0;i=0;

m2: ddf[j*m][1]=ddf11(x[j*m][1],x[j*m][2],c,d);

ddf[j*m][2]=ddf12(x[j*m][1],x[j*m][2],c,d);

ddf[j*m][3]=ddf[j*m][2];

ddf[j*m][4]=ddf22(x[j*m][1],x[j*m][2],c,d);

m3: p[j*m+i][1]=(-ddf[j*m][4]*df[j*m+i][1]+df[j*m+i][2]*ddf[j*m][2])/(ddf[j*m][1]*ddf[j*m][4]-pow(ddf[j*m][2],2));

p[j*m+i][2]=(-ddf[j*m][1]*df[j*m+i][2]+df[j*m+i][1]*ddf[j*m][2])/(ddf[j*m][1]*ddf[j*m][4]-pow(ddf[j*m][2],2));

al=O(x[j*m+i][1],x[j*m+i][1],p[j*m+i][1],p[j*m+i][2],a,b,c,d);

x[j*m+i+1][1]=x[j*m+i][1]+al*p[j*m+i][1];

x[j*m+i+1][2]=x[j*m+i][2]+al*p[j*m+i][2];

df[j*m+i+1][1]=df1(x[j*m+i+1][1],x[j*m+i+1][2],a,c,d);

df[j*m+i+1][2]=df2(x[j*m+i+1][1],x[j*m+i+1][2],b,c,d);

k=k+1;

g=g+1;

fprintf(n1,"%lf\n",x[k][1]);

fprintf(n2,"%lf\n",x[k][2]);

if(sqrt(pow(df[j*m+i+1][1],2)+pow(df[j*m+i+1][2],2))>ep)

{

i=i+1;

if(i==m){j=j+1;i=0;goto m2;}

else goto m3;

}

y=ff(x[k][1],x[k][2],a,b,c,d);

printf("x*=(%lf; %lf) y*=%lf N=%d\n",x[k][1],x[k][2],y,g);

getch();

fclose(n1);

fclose(n2);

}

Результат

-1

0

-1,34111

0,306566

-1,24743

0,21635

-1,2244

0,187169

-1,22316

0,185333

Анализ результатов:

Таблица результатов методов:

Метод

X1min

X2min

Ymin

Кол-во эксп-ов

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

-1.223162

0.185333

-9.032239

26

Модификация 2 метода Ньютона

-1.222471

0.211689

-9.032898

185