Лабораторная работа №31
.docУФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №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 |