Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №4 / LABA4
.CPP#include <iostream.h>
#include <conio.h>
#include <math.h>
/*************************Global'nie peremennie******************************/
double p[2],x0[2],a,b;
/******************************Moya funkciya*********************************/
double f(double t)
{
double x[2];
for(int k=0;k<2;k++)
x[k]=x0[k]+t*p[k];
return (100*pow((x[1]-x[0]*x[0]),2)+pow((1-x[0]),2));
}
/**************************Proizvodnaya funkcii******************************/
double df(double t)
{
double x[2];
for(int k=0;k<2;k++)
x[k]=x0[k]+t*p[k];
return ((-400*(x[1]-x[0]*x[0])*x[0]-2*(1-x[0]))*p[0]+200*(x[1]-x[0]*x[0])*p[1]);
}
/**********************Antigradientnoe napravlenie***************************/
void napr()
{
p[0]=400*(x0[1]-x0[0]*x0[0])*x0[0]+2*(1-x0[0]);
p[1]=-200*(x0[1]-x0[0]*x0[0]);
}
/**********************************Norma*************************************/
double norma(double x1[])
{
return(sqrt(pow((x1[0]-x0[0]),2)+pow((x1[1]-x0[1]),2)));
}
/****************************Metod Svenna 4**********************************/
void Swann4(double t)
{
double s=0;
if(t>fabs((f(0)-df(0))/df(0)))
t=fabs((f(0)-df(0))/df(0));
if(df(0)>0)
for(int k=0;k<2;k++)
p[k]=-p[k];
do
{
s=s+t;
t=2*t;
}
while((df(0)*df(s))>0);
a=s-t/2;
b=s;
}
/***************************Ras4etnie formuli********************************/
double gam(double c)
{
double z,w;
z=df(a)+df(b)+3*(f(a)-f(b))/b;
w=sqrt(z*z-df(a)*df(b));
c=a+((z-df(a)+w)/(df(b)-df(a)+2*w))*(b-a);
return c;
}
/*****************************Metod Devidona*********************************/
double Davidon(double e)
{
double c;
Swann4(1);
do
{
c=gam(c);
if(df(c)<0)
a=c;
else
b=c;
}
while(fabs(df(c))>e);
return c;
}
/******************************Metod Koshi***********************************/
void KOSHI(double e)
{
double alfa,x1[2];
int k;
int g=0;
for(k=0;k<2;k++)
x1[k]=x0[k];
do
{
g++;
for(k=0;k<2;k++)
x0[k]=x1[k];
napr();
alfa=Davidon(e);
for(int k=0;k<2;k++)
x1[k]=x0[k]+alfa*p[k];
}
while((norma(x1)>e)||(fabs(f(0)-f(alfa))>e));
for(k=0;k<2;k++)
x0[k]=x1[k];
cout<<"\nKolli4estvo iteraciy: k = "<<g;
}
/***************************Osnovnaya programma******************************/
void main()
{
clrscr();
double x01[2]={-1.2,1};
// double x02[2]={1.5,2};
// double x03[2]={-2,-2};
double e;
int k;
cout<<"\n---Laboratornaya rabota 4. Issledovanie gradientnih metodov.---";
cout<<"\n-------------------------Variant 1-----------------------------";
cout<<"\n------------------------Metod Koshi----------------------------";
cout<<"\n-------------- Vipolnila: Nikitina T., gr. 2375 ---------------";
cout<<"\n\n\nCelevaya funkciya: 100(x2-x1^2)^2+(1-x1)^2";
cout<<"\nNa4al'naya to4ka poiska: Xo = ( -1.2 ; 1 )";
cout<<"\nVvedite to4nost' poiska: E = ";
cin>>e;
KOSHI(e);
cout<<"\nRezul'tat minimizacii: ";
cout<<"( "<<x0[0]<<" ; "<<x0[1]<<" )";
getch();
}
/*********************************The End************************************/